【问题标题】:How to move an object in a loop with arrow keys如何使用箭头键在循环中移动对象
【发布时间】:2015-01-02 08:06:11
【问题描述】:

我试图在一个连续循环中移动一个正方形,在循环运行时留下一条轨迹(想想 BMtron 游戏),但是当我使用我的 keylistener 移动正方形时,屏幕冻结,并且尽管循环继续运行,但对象不会移动。这是一个sn-p:

public void keyPressed(KeyEvent e) {
    //System.out.println("keyPressed");
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        //moveRight();
        //down.start();
        U = false;
        D = false;
        L = false;
        R = true;
        while (R = true) {
            x = x + 2;
            repaint();
            System.out.println("Right");
        }
    } else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        R = false;
        U = false;
        D = false;
        L = true;
        while (L = true) {
            //moveLeft();
            x = x - 2;
            repaint();
            System.out.println("Left");
        }
    } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
        R = false;
        U = false;
        L = false;
        D = true;
        while (D = true) {
            //moveDown();
            y = y + 2;
            repaint();
            System.out.println("Down");
        }
    } else if (e.getKeyCode() == KeyEvent.VK_UP) {
        R = false;
        D = false;
        L = false;
        U = true;
        //System.out.println("");
        while (U = true) {
            y = y - 2;
            repaint();
            System.out.println("Up");
        }
    }
}

如果你想要完整的代码,请告诉我。

【问题讨论】:

  • while 循环不应在关键事件处理程序中
  • while(R=true) 这个循环(和其他循环)是无稽之谈。首先,它应该是while(R==true)(或只是while(R)),其次,您不会在循环内更改R 的值。那么应该如何退出循环呢? R 永远不会变成 false
  • 我脑海中的想法是。按下箭头键时使用按键侦听器。侦听器将应用相应的操作。前任。如果您按下右箭头键,侦听器会将对象无限向右移动,直到您按下另一个键。因此,如果对象向右移动,它会一直这样做,直到您按下……例如向下箭头键,然后它会关闭 R 布尔值并激活 D 布尔值。至少我脑子里是这样的。我对 Java(和编程)很陌生

标签: java loops object


【解决方案1】:

在 Java 中,赋值表达式返回 assigned 值。注意你的循环:

while(R = true)
        ↑

你需要比较而不是分配。

您的循环将始终像编写while(true) 一样执行(true 是分配的值),并且您将运行一个无限循环来冻结您的程序。这就是为什么我们在比较布尔值时非常建议不要使用==!=,这样可以防止可能出现的错误。相反,只需写:

while(R)  //same as while(R == true) but please don't use ==

【讨论】:

  • 我想知道如果他改变了会发生什么。如果程序“卡”在其中一个循环中并且用户按不同方向的另一个键,监听器会捕捉到吗?还是程序会错过这个事件,因为它仍然“卡在”循环中?我想很高兴知道ActionListener 是否在单独的线程中触发其方法:D。
  • @Tom 这取决于监听器是如何实现的。如果它只是一个匿名实现,它将在实际调用它的同一线程中执行。例如,如果您使用worker,它将在不同的线程中运行。
  • 好吧,考虑到这一点,您对如何解决这个问题有什么建议吗?我对 java 很陌生,所以我不确定如何在不冻结程序的同时使对象连续移动。
  • @AndrewMacMillan 认为什么事件应该打破循环。例如,将手指从向上箭头移开..
  • 按不同的键会中断循环。因此,如果对象是正确的,它会继续这样做,直到你崩溃,或者通过按不同的箭头键改变方向
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
相关资源
最近更新 更多