我正在尝试按照教程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
}
}
答案 0 :(得分:1)
感谢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开始,并且等于1的xa加起来,因此x为1并且球向右移动,重新调用被调用并且上面一遍又一遍地发生。然后在一个实例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时,我们得到以下结果:
if (x + xa < 0)
xa = 1;
因此再次递增x直到269并且该过程继续。
答案 1 :(得分:0)
调用它的原因是因为您描述的方法一直在运行。它不断地检查它是否在指定的边界线内,这就是不断调用println的原因,因为该函数被设计为始终被调用,并且以这种方式始终检查它是否超出界限。
以这种方式思考..方法总是在问“我是不是在出界?” “我出界吗?”一旦它成熟,它就会反过来。
您认为代码只会在接触边界时运行,但这是错误的。它会继续检查它是否触及边界,即使它没有触及它...这是计算机知道何时到达边界并反转它自己的唯一方法(或者无论代码指示它做什么)。
您在评论why is the System.out.println
中也提到了在不满足if块条件时运行。这是因为Java允许在身体周围没有括号的循环。
while(条件) 语句1; 语句2; //只有第一个语句在循环体
中学生假设身体陈述在体内。类似地,
while(条件) 语句1;语句2
这两个语句似乎都在循环中,但只是第一个。 上面的例子不会用其他语言编译。
答案 2 :(得分:0)
当球触及边界x + xa == getWidth() - 30
时。此时,xa没有改变,球移动
但是x + xa > getWidth() - 30
之后的步骤和xa设置为-1(这意味着朝向反方向x)