如何在按下按键时停止移动对象

时间:2014-12-11 13:22:05

标签: java swing user-interface keylistener

我是Java编程和初学者我正在制作一个应用程序,要求一个对象在一个充满方块的网格中移动。

对象应该一次只移动一个方格,如果用户想要移动到另一个方格,他们必须再次按下该键。我的移动方法如下:

public void move() {
    x += dx;
    y += dy;
}

我正在使用KeyListener接口来实现keyPressed,keyTyped和keyReleased方法,我的条件类似于KeyPressed下面片段中的那个

//KeyPressed
int c = e.getKeyCode();

if (c == KeyEvent.VK_UP) {
    player.setDy(-5);
}

这允许对象自由移动。但是,只要按下向上箭头,它就会明显继续移动。

有没有办法让对象向上移动一次-5,然后即使仍按下按键也会停止?

我不确定是否需要更改我的move方法或KeyListener方法来执行此操作。

我希望我已经清楚了解我的要求,并且我非常感谢任何指示。

2 个答案:

答案 0 :(得分:0)

最简单的方法是添加一个布尔值来表示按下移动键

班级成员:boolean movingKeyPressed = false

按下键:

if (movingKeyPressed) {
   return;
} else {
   // do stuff
   movingKeyPressed = true;
}
密钥发布方法中的

movingKeyPressed = false;

答案 1 :(得分:0)

首先:如果从keyPressedkeyReleased等侦听器中调用类方法,则应使用Synchronization - 这是因为可以从多个线程调用侦听器方法您的类方法(player.setDy())可以(并且将会)并行调用 - 您需要确保每次调用setDy在之前发生。< / p>

另外:keyTyped在许多情况下要好得多:https://stackoverflow.com/a/7071810/351861

示例可能如下所示:

public void keyTyped(KeyEvent arg0) {
   if(arg0.getKeyCode() == KeyEvent.VK_UP)
   {
       synchronized(player)
       {
          player.setDy(-5);
       }
   }
}

这会顺序可靠地调用setDy。现在您需要做的就是确保setDy按预期工作,因此只设置位置一次