我正在尝试遵循教程 here .
我有一个函数 moveBall()
的精简版本这是:
if (x + xa > getWidth() - 30) { xa = -1; y = y + 10; } if (x + xa < 0) { xa = 1; } x = x + xa;
理想情况下,在触摸屏幕边界后,球应该反转其方向,这是事实,而且确实发生了。但如果我输入 System.out.println("in if")
在任何 if
内条件下,每次在球接触边界之前都会调用它,值 xa
理想情况下应该只在触及边界时设置一次,还是我错了?我可能没有得到完整的逻辑,有人可以帮忙吗?
主要功能:
public static void main(String[] args) throws InterruptedException{
JFrame frame = new JFrame("Mini Tennis");
FirstClass Fr = new FirstClass();
frame.add(Fr);
frame.setSize(300, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while(true){
Fr.moveBall(); // executes the last
Fr.repaint(); //executes first
Thread.sleep(10); //executes second
}
}
最佳答案
感谢Lutz Horn ,经过一整天的调试,我想我已经明白上面代码片段中发生的事情了,我会尽力解释一下:
在上面的精简版本中,程序以两个变量开始:
int x = 0; int xa = 1;
在移动函数中,检测到与框架的任何边界的碰撞,但在上面的代码中我只对 x 平面感兴趣。
功能是:
void move() {
System.out.println("x + xa is: "+(x+xa));
System.out.println("Game Width: "+(game.getWidth() - 30));
if (x + xa < 0)
xa = 1;
if (x + xa > game.getWidth() - 30)
xa = -1;
x = x + xa;
}
所以 x 从 0 开始,xa 等于 1 相加,所以 x 是 1 并且球向右移动,调用 repaint 并一遍又一遍地发生上述情况。然后在一个实例中 x 变为 269 (调试消息: getWIdth()-30 = 268 )。现在执行第二个 if 条件的主体:
if (x + xa > game.getWidth() - 30) // holds true when x+xa = 269
xa = -1; // Hence setting the variable xa to -1
上面的过程一直持续到 x 小于 0(因为 -1 由于上面的原因而被加起来为 269)这里还值得注意的是,每次调用 Paint 时从 x 中减去 1 意味着 if 条件不会得到反复调用。
现在,当 x 变为 -1 时,我们得到以下结果为 true:
if (x + xa < 0)
xa = 1;
因此,再次将 x 增加到 269,然后该过程继续。
关于java - 尝试理解代码:的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22755312/