如何使按键不暂停?

时间:2013-05-05 21:04:24

标签: java keyevent

好的,所以我正在为学校制作2D侧卷轴游戏。它几乎就像马里奥(嗯,这是我完成时的希望。)当我按下右箭头键将我的玩家沿着地图移动时,他移动一次,暂停,然后开始平稳地移动很多。我认为这是因为当你按住键时所有苹果笔记本电脑都会暂停,但我不知道如何为我的游戏解决这个问题。有什么建议?谢谢。

4 个答案:

答案 0 :(得分:1)

一种解决方案是在keypressed方法中设置boolean keyUP = true,在keyreleased方法中设置keyUP = false。这样一旦按下了键,你的游戏就会将其注册为"keep moving up",直到你释放键,而不是"Up was pressed move up, up was pressed move up....".这样就消除了输入时的初始延迟(在linux上非常明显)。

从我们的游戏:

private boolean up, down, left, right;

public void keyReleased(KeyEvent e) {
    switch (e.getKeyCode()) {
    case KeyEvent.VK_S:
        down = false;
        break;
    case KeyEvent.VK_W:
        up = false;
        break;
    case KeyEvent.VK_A:
        left = false;
        break;
    case KeyEvent.VK_D:
        right = false;
        break;
    }
}


public void keyPressed(KeyEvent e) {
    switch (e.getKeyCode()) {
    case KeyEvent.VK_S:
        down = true;
        break;
    case KeyEvent.VK_W:
        up = true;
        break;
    case KeyEvent.VK_A:
        left = true;
        break;
    case KeyEvent.VK_D:
        right = true;
        break;

答案 1 :(得分:1)

虽然您尚未发送任何代码段,但我可以假设以下内容。我认为你已经实现了在按下键时执行某些操作的键监听器。如果用户仍然按下该键,则程序会在一段延迟后获得第二个事件,然后开始更快地获取事件。

这不是你需要的。您可能应该保留某种应用程序状态keyIsPressed,该状态仅在第一次按下(未按下)键时才更改一次。然后仅在按键启用时关闭此变量。当键第一次关闭时,启动移动对象的后台线程并定期检查标志keyIsPressed以知道何时停止。

祝你好运成为马里奥的竞争者......:)

答案 2 :(得分:0)

  • 如果这是一个Swing GUI,那么使用Key Bindings,而不是一个关键的监听器,
  • 按键启动Swing Timer
  • 并在密钥释放时停止。

答案 3 :(得分:0)

所有关键事件都是整数,因此您可以使用boolean []来存储关键事件中的所有更改。对于Java2d我使用这样的东西:

import java.awt.KeyEventDispatcher;
import java.awt.event.KeyEvent;

public final class Keyboard implements KeyEventDispatcher {

    public static boolean[] keyPressed = new boolean[256];
    public static boolean[] keyHold = new boolean[256];
    public static boolean[] keyReleased = new boolean[256];

    public static void update() {
        for (int i=0; i<128; i++) {
            keyPressed[i] = false;
            keyReleased[i] = false;
        }
    }

    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID()==KeyEvent.KEY_PRESSED) {
            keyHold[e.getKeyCode()] = true;
            keyPressed[e.getKeyCode()] = true;
        }
        else if (e.getID()==KeyEvent.KEY_RELEASED) {
            keyHold[e.getKeyCode()] = false;
            keyReleased[e.getKeyCode()] = true;
        }
        return false;
    }

}

我在每帧之后调用update()。