Я делаю игру, которая нуждается в перекрестье. Я играю с классом 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);
}
Что я имел в виду, так это то, что перекрестье должно быть захвачено в окне, если перекрестье создается с помощью мыши (например, как виртуальная машина захватывает мышь и не отпускает ее) ИЛИ перекрестье должно быть независимыми от мыши (поскольку они будут контролироваться джойстиком). Я не думал, что публикация всего моего кода будет необходима для такой простой проблемы, но если вам это нужно, я с радостью ее предоставил. – ubiquibacon
Ну, я до сих пор не знаю, что вы пытаетесь сделать, и вы все еще не опубликовали SSCCE. Код, который вы опубликовали, не компилируется. Я попытался это исправить, но не знаю, допустил ли я какие-либо ошибки. Когда я запускаю код, я просто вижу пустой кадр без рисунка. Я не знаю, почему вы используете BufferStrategy. По умолчанию Swing имеет двойной буфер. Прочтите раздел из учебника Swing по пользовательской живописи: http://java.sun.com/docs/books/tutorial/uiswing/TOC.html. – camickr
Я заявил, что он не компилируется. Я использовал BufferStrategy, потому что это то, что использовал учебник, который я использовал. Я очень новичок в Java, поэтому я далек от знания того, что следует использовать где и когда, я просто читаю столько, сколько могу, чтобы получить информацию, необходимую мне для работы. Я прочитаю ссылку, которую вы разместили. – ubiquibacon