如何同时响应两个不同的KeyEvent?

时间:2019-11-13 11:27:30

标签: java game-physics keylistener keyevent game-development

所以我基本上是用Java创建一个平台游戏。这是一个简单的问题。我可以同时响应两个不同的KeyEvent吗?例如,我按向右箭头键,而播放器向右移动。现在,我希望播放器跳起来,但继续向右移动。为此,我需要同时响应两个不同的KeyEvent。我该如何实现?我还没有尝试过任何代码,因为我不知道从哪里开始。谢谢您的提前答复。

2 个答案:

答案 0 :(得分:0)

您可以使用单独的“ KeyDown”和“ KeyUp”事件并为播放器设置状态值。

您需要为玩家配备一台状态机。

public class KeyboardListener extends JFrame implements KeyListener {

public KeyboardListener() {
    addKeyListener(this);
}

@Override
public void keyPressed(KeyEvent e) {

    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        System.out.println("Right key pressed");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        System.out.println("Left key pressed");
    }

}

@Override
public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        System.out.println("Right key Released");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        System.out.println("Left key Released");
    }
}

public static void main(String[] args) {
    new KeyboardListener();
}
}

使用KeyListener接口中的keyPressed和keyReleased-EventHandlers并将您当前的玩家状态(例如,走路,跳跃,walk_left,walk_right等)保存为布尔值。

在主循环中,您可以检查播放器处于什么状态并更改其坐标。喜欢:

if(player.left) { player.x += speed } //etc.

答案 1 :(得分:-1)

您可能想使用“线程”,然后将按下的键添加到播放器物理类的列表。

public class KeysListener implements KeyListener
    ...
    //FIRST THREAD
    new Thread(new Runnable() {
        @Override
        public void run() {
            public void keyEvent(KeyEvent e) {
                 int key = e.getKeyCode();
                 //TODO ADD KEY TO A LIST IN THE CLASS THAT HANDLES YOUR PHYSYICS
            }
        }
    }).start();
    //SECOND THREAD
    new Thread(new Runnable() {
        @Override
        public void run() {
            public void keyEvent(KeyEvent e) {
                 int key = e.getKeyCode();
                 //TODO ADD KEY TO A LIST IN THE CLASS THAT HANDLES YOUR PHYSICS
            }
        }
    }).start();
...
}

添加与所需的并发键数一样多的线程。