【问题标题】:How do I respond to two different KeyEvents Simultaneously?如何同时响应两个不同的 KeyEvent?
【发布时间】:2019-11-13 11:27:30
【问题描述】:

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

【问题讨论】:

  • 取决于您使用的框架,例如AWT、Swing 或 JavaFX
  • 很遗憾地告诉你,“我还没有尝试过任何代码”是这个网站上的禁忌句子......另外,你应该发布类似的问题在这里:gamedev.stackexchange.com

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


【解决方案1】:

您可以使用单独的“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.

【讨论】:

    【解决方案2】:

    您可能想要使用线程,然后将按下的键添加到玩家物理类列表中。

    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();
    ...
    }
    

    根据您需要的同时键数添加尽可能多的线程。

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      相关资源
      最近更新 更多