所以我正在制作一个蛇游戏,我有控件和基本的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;
}
}
答案 0 :(得分:2)
它跳跃的原因是因为您使用getXLoc
和getYLoc
方法绘制矩形。但是,这些方法每次都会生成一个新的随机数。相反,将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;
}