java - 尝试理解代码:的逻辑

标签 java

我正在尝试遵循教程 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/

相关文章:

java - 将 SWT 列表绑定(bind)到 ArrayList

java - Android 更改 XML 布局 更改数据字段

java - Java 中的 ActionListener 问题

java - 将 StringBuffer 分成更小的部分

java - 我什么时候应该使用 `REQUIRED` 与 `NOT_SUPPORTED` 作为 MDB 的 @TransactionAttribute 值?

java - 使用 Javascript 将 doc/docx 批量转换为 pdf

java - CPU 使用率峰值

java - 附近连接 : Discovery issues on Android 10

java - 在 GUI 中显示文本冒险

java - JDK6.0 或其他库中有Concurrent LinkedHashSet 吗?