【问题标题】:how to make key press not pause? [duplicate]如何使按键不暂停? [复制]
【发布时间】:2013-04-29 15:22:56
【问题描述】:

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

【问题讨论】:

  • @syb0rg:是的,该解决方案使用键绑定和 Swing Timer。

标签: java keyevent


【解决方案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;

【讨论】:

  • 这成功了!非常感谢!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:
    • 如果这是 Swing GUI,则使用键绑定,而不是键侦听器,
    • 在按键时启动 Swing Timer
    • 并在按键释放时停止。

    【讨论】:

      【解决方案4】:

      所有 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()。

      【讨论】:

        猜你喜欢
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        • 2011-02-07
        • 1970-01-01
        相关资源
        最近更新 更多