蛇游戏设置水果点

时间:2014-01-23 04:46:18

标签: java user-interface

所以我正在制作一个蛇游戏,我有控件和基本的gui。 问题是,当试图画水果时,它不会停止绘画。我想要它做的是当玩家与水果相撞时它会增加分数。要做到这一点,我首先需要水果只画一次,怎么样?

基本paintComponent。

public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.RED);
        g.fillRect(x, y, 20, 20);
        g.drawRect(fruit.getXLoc(), fruit.getYLoc(), 10, 10);
        fruitCollected(); //method saying if you go into a certain range of the fruit add score;
        g.drawString("Score: " + score + fruit.getXLoc() + fruit.getYLoc(), 150, 150);
        if(gameover() == true) {
            this.setBackground(Color.ORANGE);
        }

}

在另一个课程中,我有getXLoc和getXLoc

public class FruitLocation {
int xSize = 580; //x and y boundary for placing fruit
int ySize = 350;
int xLoc;
int yLoc;
    public int getXLoc() {
    int xLoc = (int) (Math.random() * xSize) ;
    return xLoc;
}
public int getYLoc() {
    int yLoc = (int) (Math.random() * ySize);
    return yLoc;
}

}

2 个答案:

答案 0 :(得分:2)

它跳跃的原因是因为您使用getXLocgetYLoc方法绘制矩形。但是,这些方法每次都会生成一个新的随机数。相反,将x和y位置设置为Fruitlocation构造函数中的值,并创建一个生成新随机值的新方法。 getXLoc的代码应如下所示:

public int getXLoc(){
    return xLoc;
}

答案 1 :(得分:2)

您的基本问题是您在paint方法中调用方法会导致repaint事件一次又一次地生成......

首先删除对setBackground

的调用

接下来,不要改变“主循环”之外的水果状态,也就是说,不要做...

public int getXLoc() {
   int xLoc = (int) (Math.random() * xSize) ;
   return xLoc;
}

由于绘制周期可能由多种原因引起,其中许多原因是您无法控制的,因此您希望这些方法返回具体值。它们应该作为“主循环”逻辑的一部分进行更新,您需要提供适当的方法来实现这一点。

另外,您可以隐藏变量。我的意思是,当xLoc方法中的getXLoc值为时,它不会更改xLoc类的Fruit实例变量,例如......

int xLoc;
public int getXLoc() {
    int xLoc = (int) (Math.random() * xSize) ;
    ^--- Shadowing the instance variable...
    return xLoc;
}