2010-03-16 15 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(ellipse);”给我一个错误。我用这个代码的目标是创建一个透明中心的圆圈,就像一个甜甜圈。一旦创建了甜甜圈,我会在其内部添加一些小点,使其看起来更像十字线。有一件事可能成为问题,也可能不是问题,因为我计划用摇杆而不是鼠标移动十字准线......我不知道这是否会限制我选择我的十字准线是什么样的物体。

编辑:

这里是一个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; 
    } 
} 

编辑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 2010-03-16 06:30:11

+0

那么,我仍然不知道你在做什么,你还没有发布SSCCE。您发布的代码不能编译。我试图解决它,但不知道我是否犯了错误。当我运行代码时,我简单地看到一个没有绘画的空框架。我不知道你为什么使用BufferStrategy。 Swing默认是双缓冲。阅读自定义绘画上的Swing教程部分:http://java.sun.com/docs/books/tutorial/uiswing/TOC.html。 – camickr 2010-03-17 03:15:22

+0

我说它没有编译。我使用了BufferStrategy,因为这就是我使用的教程所说的。我对Java非常陌生,所以我很难知道应该在何时何地使用什么,我只是尽可能多地阅读我需要的信息以使其工作。我会通读您发布的链接。 – ubiquibacon 2010-03-17 03:43:45

2

什么样的错误?

编译错误我在想,因为图形没有剪辑方法。 Graphics2D的确如此。

您可以绘制一个椭圆形的圆环形状,并且半径为<。

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

我没有意识到Graphic和Graphic2D有区别,谢谢你的启发。到目前为止,我的所有代码都基于Graphics,而不是Graphics2D,所以如果我可以坚持使用Graphics,我认为这会让我的生活更轻松。有没有另一种方法可以用Graphics来做到这一点? – ubiquibacon 2010-03-16 06:10:26

+0

据我所知,使用的图形对象实际上总是一个Graphics2D,但由于方法签名而被声明为Graphics。 Graphics2D g2 =(Graphics2D)g; 如果您担心遇到DebugGraphics或者您可能首先执行instanceof – tom 2010-03-16 06:16:44

+0

我正在使用BufferStrategy getDrawGraphics,并且不适用于Graphics2D。因为我是Java noob,那么Graphics2D中的BufferStrategy getDrawGraphics等价物是什么? – ubiquibacon 2010-03-16 06:32:16