-1

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

4

4 回答 4

1

一种解决方案是在 keypressed 方法boolean keyUP = truekeyUP = falsekeyreleased 方法内部进行设置。这样,一旦按下键,您的游戏就会将"keep moving up"其注册为直到您释放键,而不是"Up was pressed move up, up was pressed move up....".This 消除输入时的初始滞后(在 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;
于 2013-05-05T21:14:22.487 回答
1

尽管您没有发送任何代码片段,但我可以假设以下内容。我认为你已经实现了按键监听器,当按键被按下时会做一些事情。如果用户仍然按下该键,您的程序会在延迟一段时间后获取第二个事件,然后开始更快地获取事件。

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

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

于 2013-05-05T21:14:59.880 回答
0
  • 如果这是 Swing GUI,则使用键绑定,而不是键侦听器,
  • 在按键时启动摆动计时器
  • 并在按键释放时停止。
于 2013-05-05T21:23:42.593 回答
0

所有 KeyEvent 都是整数,因此您可以设置 boolean[] 来存储 KeyEvent 中的所有更改。对于 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() 。

于 2013-05-05T21:25:36.663 回答