2010-03-16 7 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 (타원);"입니다. 나에게 오류를 준다. 이 코드를 사용하는 나의 목표는 도넛처럼 투명한 중심이있는 원을 만드는 것입니다. 일단 도넛이 만들어지면 십자형처럼 보이도록 내부에 작은 점을 추가 할 것입니다. 한 가지 문제는 문제가되지 않을 수 있습니다. 십자형 조이스틱을 마우스가 아닌 조이스틱으로 움직일 계획입니다. 십자가가 어떤 종류의 물체를 사용할 수 있는지에 대한 옵션이 제한되는지는 잘 모릅니다.

는 편집 : 여기

여기 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있어)

답변

2

하지만 문제는 내가 십자선이 내 게임을 만들 창을 떠날 수 있기를 원하지 않는다는 것입니다,

은하지 않습니다. 마우스가 프레임 또는 구성 요소 밖으로 이동하면 커서가 재설정됩니다.

다시 SSCCE에 문제를 게시하십시오.

+0

내가 말한 의미는 마우스에서 십자선을 만들면 십자선이 캡처되어야한다는 것이다. (가상 머신이 마우스를 어떻게 잡아서 떠나지 않게하는 것과 같다.) 십자선은 (그들은 조이스틱에 의해 제어 될 것이기 때문에) 마우스와 독립적이어야합니다. 그렇게 간단한 문제에 대해서는 전체 코드를 게시하는 것이 필요하지 않다고 생각했지만, 필요하다면 기꺼이 제공 할 것입니다. – ubiquibacon

+0

글쎄, 난 아직도 당신이 뭘하려고하는지 모르겠지만 당신은 여전히 ​​SSCCE를 게시하지 않았습니다. 게시 한 코드가 컴파일되지 않습니다. 나는 그것을 고치려고했지만 어떤 실수를했는지 모른다. 코드를 실행하면 그림이없는 빈 프레임이 나타납니다. 왜 당신이 BufferStrategy를 사용하는지 모르겠습니다. 스윙은 기본적으로 이중 버퍼링됩니다. 사용자 정의 페인팅에 대한 스윙 튜토리얼의 섹션을 읽어보십시오. http://java.sun.com/docs/books/tutorial/uiswing/TOC.html. – camickr

+0

나는 그것이 컴파일되지 않았다고 말했다. BufferStrategy는 사용하고있는 튜토리얼에서 말한 것이기 때문에 사용했습니다. 나는 Java가 매우 새로 워서 어디서 언제 무엇을 사용해야하는지 알지 못합니다. 물건을 만드는 데 필요한 정보를 얻으려면 최대한 많이 읽었습니다. 나는 당신이 게시 한 링크를 읽을 것입니다. – ubiquibacon

2

어떤 종류의 오류가 있습니까?

컴파일 오류 그래픽에 클립 방법이 없기 때문에 생각하고 있습니다. Graphics2D가합니다.

타원형 및 획 크기가 < 반경 인 도넛 형 도형을 그릴 수 있습니다.

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

Graphic과 Graphic2D의 차이점을 깨닫지 못했습니다. 제게 계몽에 감사드립니다. 지금까지 내 모든 코드는 Graphics2D가 아닌 Graphics를 기반으로하므로 Graphics를 사용하면 내 인생을 더 편리하게 할 수 있다고 생각합니다. 그래픽으로이 작업을 수행 할 수있는 또 다른 방법이 있습니까? – ubiquibacon

+0

필자가 아는 한, 사용 된 그래픽 객체는 항상 실제로 Graphics2D이지만 메소드 서명으로 인해 Graphics로 선언됩니다. Graphics2D g2 = (Graphics2D) g; DebugGraphics가 있거나 처음에 instanceof 할 수있는 것에 대해 걱정이된다면 – tom

+0

BufferStrategy getDrawGraphics를 사용하고 있는데 Graphics2D에서는 작동하지 않습니다. 내가 Java 멍청이이기 때문에 Graphics2D에서 BufferStrategy getDrawGraphics와 동등한 것은 무엇입니까? – ubiquibacon