십자형이 필요한 게임을 만들고 있습니다. 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 (타원);"입니다. 나에게 오류를 준다. 이 코드를 사용하는 나의 목표는 도넛처럼 투명한 중심이있는 원을 만드는 것입니다. 일단 도넛이 만들어지면 십자형처럼 보이도록 내부에 작은 점을 추가 할 것입니다. 한 가지 문제는 문제가되지 않을 수 있습니다. 십자형 조이스틱을 마우스가 아닌 조이스틱으로 움직일 계획입니다. 십자가가 어떤 종류의 물체를 사용할 수 있는지에 대한 옵션이 제한되는지는 잘 모릅니다.
는 편집 : 여기
여기 SSCCE 버전 (물론 거의 ... "bf.getDrawGraphics() = G2 '로 인해 컴파일되지 않습니다)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;
}
}
편집 2 :
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);
}
:
여기
내 최신 시도는이 확인 작업 보인다는 ...이 나쁜 코딩이 있으면 알려 주시기 바랍니다 (나는 생각 here있어)
내가 말한 의미는 마우스에서 십자선을 만들면 십자선이 캡처되어야한다는 것이다. (가상 머신이 마우스를 어떻게 잡아서 떠나지 않게하는 것과 같다.) 십자선은 (그들은 조이스틱에 의해 제어 될 것이기 때문에) 마우스와 독립적이어야합니다. 그렇게 간단한 문제에 대해서는 전체 코드를 게시하는 것이 필요하지 않다고 생각했지만, 필요하다면 기꺼이 제공 할 것입니다. – ubiquibacon
글쎄, 난 아직도 당신이 뭘하려고하는지 모르겠지만 당신은 여전히 SSCCE를 게시하지 않았습니다. 게시 한 코드가 컴파일되지 않습니다. 나는 그것을 고치려고했지만 어떤 실수를했는지 모른다. 코드를 실행하면 그림이없는 빈 프레임이 나타납니다. 왜 당신이 BufferStrategy를 사용하는지 모르겠습니다. 스윙은 기본적으로 이중 버퍼링됩니다. 사용자 정의 페인팅에 대한 스윙 튜토리얼의 섹션을 읽어보십시오. http://java.sun.com/docs/books/tutorial/uiswing/TOC.html. – camickr
나는 그것이 컴파일되지 않았다고 말했다. BufferStrategy는 사용하고있는 튜토리얼에서 말한 것이기 때문에 사용했습니다. 나는 Java가 매우 새로 워서 어디서 언제 무엇을 사용해야하는지 알지 못합니다. 물건을 만드는 데 필요한 정보를 얻으려면 최대한 많이 읽었습니다. 나는 당신이 게시 한 링크를 읽을 것입니다. – ubiquibacon