2010-03-16 1 views
2

Я делаю игру, которая нуждается в перекрестье. Я играю с классом java.awt.cursor, и это достаточно просто, но проблема в том, что я не хочу, чтобы перекрестие могло покинуть окно, которое я создаю для своей игры, поэтому я попробовал это вместо этого:Перекрестье в Java

private void drawCrossHair(Graphics g){ 
    Ellipse2D ellipse = new Ellipse2D.Float(); 
    ellipse.setFrame(crossHair.x, crossHair.y, 36, 36); 
    Color yellow = new Color (0xEDFF62); 
    g.setColor(yellow);    
    g.fillOval(crossHair.x, crossHair.y, 40, 40); 
    g.setClip(ellipse); 
    g.clip(ellipse); 

В основном я пытаюсь удалить «эллипс» из «g», оставив только небольшое кольцо позади. Проблема здесь в том, что «g.clip (эллипс)»; дает мне ошибку. Моя цель с этим кодом - создать круг с прозрачным центром, как пончик. Как только пончик будет создан, я добавлю несколько небольших точек внутри, чтобы он больше напоминал перекрестие. Одна вещь, которая может быть или не быть проблемой, заключается в том, что я планирую переместить перекрестие с помощью джойстика, а не мыши ... Я не знаю, ограничит ли это мои варианты того, каким объектом может быть мой перекрестье.

EDIT:

Вот версия SSCCE (ну почти ... не компилируется из-за "g2 = bf.getDrawGraphics()")

package game; 

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.Toolkit; 
import java.awt.image.BufferStrategy; 
import javax.swing.JFrame; 
import java.awt.geom.Ellipse2D; 

public class Game extends JFrame { 

    private int windowWidth = 1280; 
    private int windowHeight = 1024; 
     private Ball crossHair; 

    public static void main(String[] args) { 
     new Game(); 
    } 
    public Game() { 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setSize(windowWidth, windowHeight); 
     this.setResizable(false); 
     this.setLocation(0,0); 
     this.setVisible(true); 
     this.createBufferStrategy(2); 
     initGame(); 
     gameLoop(); 
    } 
    private void initGame() { 
      crossHair = new Ball (windowWidth/2, windowHeight/2, 3, 3); 
    } 

     private void gameLoop() { 
      //game logic 
      drawFrame();    
     } 

     private void drawFrame() { 

      //Setting up Double Buffering 
      BufferStrategy bf = this.getBufferStrategy(); 
      Graphics2D g2 = (Graphics2D)bf.getDrawGraphics(); 

      try { 
       g2 = bf.getDrawGraphics(); 
       Color darkBlue = new Color(0x010040); 

       g2.setColor(darkBlue); 
       g2.fillRect(0, 0, windowWidth, windowHeight); 

       drawCrossHair(g2); 
      } finally { 
       // dispose of graphic. 
       g2.dispose(); 
      } 

      // show contents of backbuffer on screen 
      bf.show(); 

      Toolkit.getDefaultToolkit().sync(); 
     } 

     private void drawCrossHair(Graphics2D g2){ 
      Color yellow = new Color (0xEDFF62); 
      g2.setColor(yellow);    
      g2.fillOval(crossHair.x, crossHair.y, 40, 40); 
      Ellipse2D ellipse = new Ellipse2D.Float(); 
      ellipse.setFrame(crossHair.x, crossHair.y, 36, 36); 
      g2.setClip(ellipse); 
      g2.clip(ellipse); 
     } 
} 

А вот еще один класс в такой же упаковка:

упаковка игра;

public class Ball { 
    public int x; 
    public int y; 
    public int dx; 
    public int dy; 

    public Ball(int x, int y, int dx, int dy) { 
     this.x = x; 
     this.y = y; 
     this.dx = dx; 
     this.dy = dy; 
    } 
} 

EDIT 2:

Вот моя последняя попытка, это, кажется, работает нормально ... Пожалуйста, дайте мне знать, если это плохо кодирование (я получил идею here):

private void drawCrossHair(Graphics g){ 
    Color yellow = new Color (0xEDFF62); 
    g.setColor(yellow); 
    for (int i = 0; i < 1; i++) { 
    g.drawOval(crosshair.x + i, crosshair.y + i, 40 - i - i, 40 - i - i); 
    } 
    g.fillArc(crosshair.x + 10, crosshair.y + 21 , 20, 20, -45, -90); 
    g.fillArc(crosshair.x - 1, crosshair.y + 10, 20, 20, -135, -90); 
    g.fillArc(crosshair.x + 10, crosshair.y - 1, 20, 20, -225, -90); 
    g.fillArc(crosshair.x + 21, crosshair.y + 10, 20, 20, -315, -90); 
} 

ответ

2

, но проблема в том, что я не хочу перекрестия, чтобы иметь возможность оставить окно я создаю для моей игры,

Это не делает. Курсор сбрасывается, когда мышь перемещается из кадра или компонента.

Снова опубликуйте SSCCE, показывая проблему.

+0

Что я имел в виду, так это то, что перекрестье должно быть захвачено в окне, если перекрестье создается с помощью мыши (например, как виртуальная машина захватывает мышь и не отпускает ее) ИЛИ перекрестье должно быть независимыми от мыши (поскольку они будут контролироваться джойстиком). Я не думал, что публикация всего моего кода будет необходима для такой простой проблемы, но если вам это нужно, я с радостью ее предоставил. – ubiquibacon

+0

Ну, я до сих пор не знаю, что вы пытаетесь сделать, и вы все еще не опубликовали SSCCE. Код, который вы опубликовали, не компилируется. Я попытался это исправить, но не знаю, допустил ли я какие-либо ошибки. Когда я запускаю код, я просто вижу пустой кадр без рисунка. Я не знаю, почему вы используете BufferStrategy. По умолчанию Swing имеет двойной буфер. Прочтите раздел из учебника Swing по пользовательской живописи: http://java.sun.com/docs/books/tutorial/uiswing/TOC.html. – camickr

+0

Я заявил, что он не компилируется. Я использовал BufferStrategy, потому что это то, что использовал учебник, который я использовал. Я очень новичок в Java, поэтому я далек от знания того, что следует использовать где и когда, я просто читаю столько, сколько могу, чтобы получить информацию, необходимую мне для работы. Я прочитаю ссылку, которую вы разместили. – ubiquibacon

2

Какая ошибка?

Ошибка компиляции Я думаю, потому что у Graphics нет метода клипа. Graphics2D делает.

Вы можете нарисовать форму пончика только с эллипсом и размером хода < радиус.

g.setStroke(new BasicStroke(2.0f)); 
g.drawOval(crossHair.x, crossHair.y, 40, 40); 
+0

Я не понимал, что существует разница между графикой и графикой2D, спасибо за то, что вы меня просветили. Пока весь мой код основан на Graphics, а не на Graphics2D, поэтому, если я могу придерживаться Graphics, я думаю, что это облегчило бы мою жизнь. Есть ли другой способ сделать это с помощью Graphics? – ubiquibacon

+0

Насколько мне известно, используемый графический объект всегда является Graphics2D, но объявляется графикой из-за подписи метода. Graphics2D g2 = (Graphics2D) g; Если вы беспокоитесь о встрече с DebugGraphics или чем-то, что вы могли бы сделать с первым экземпляром – tom

+0

, я использую BufferStrategy getDrawGraphics, и это не работает с Graphics2D. Так как я Java noob, какой будет эквивалент BufferStrategy getDrawGraphics в Graphics2D? – ubiquibacon

Смежные вопросы