如何在LWJGL中覆盖按键

时间:2012-08-08 21:20:04

标签: java keyboard lwjgl

我正在使用LWJGL的键盘类,目前正在使用

if(Keyboard.isKeyDown(Keyboard.KEY_A))
{
   //move left
}
else if(Keyboard.isKeyDown(Keyboard.KEY_D))
{
   //move right
}

如果我有'a'键,那么'd'键会向右移动但是如果我有'd'键,那么'a'键它仍会继续向右移动,因为“其他” “部分。

我已经尝试过没有其他的东西,只是让它们都运行但是如果两个键都按下则没有运动

我正在寻找一段代码,只允许我从最后按下的键中获取输入。

我还需要能够上下移动(使用“w”和“s”),这样解决方案就无法阻止其他键工作,只能“a”或“d”。

感谢。亚历克斯。

2 个答案:

答案 0 :(得分:1)

使用Keyboard.getEventKeyState确定当前事件,然后Keyboard.getEventKey确定这是哪个键。然后,您需要确保通过Keyboard.enableRepeatEvents禁用重复事件。维持当前运动的状态,根据这些事件进行更改,并相应地进行每个滴答。类似下面的内容,如快速草图:

Keyboard.enableRepeatEvents(false);
...
/* in your game update routine */
final int key = Keyboard.getEventKey();
final boolean pressed = Keyboard.getEventKeyState();
final Direction dir = Direction.of(key);
if (pressed) {
  movement = dir;
} else if (movement != Direction.NONE && movement == dir) {
  movement = Direction.NONE;
}
...
/* later on, use movement to determine which direction to move */

在上面的示例中,Direction.of返回按下的键的适当方向

enum Direction {
  NONE, LEFT, RIGHT, DOWN, UP;

  static Direction of(final int key) {
    switch (key) {
      case Keyboard.KEY_A:
        return Direction.LEFT;
      case Keyboard.KEY_D:
        return Direction.RIGHT;
      case Keyboard.KEY_W:
        return Direction.UP;
      case Keyboard.KEY_S:
        return Direction.DOWN;
      default:
        return Direction.NONE;
    }
  }
}

答案 1 :(得分:0)

如果这仍然可以帮助你,请点击它,但你可以锁定第一次按下的键,直到它松开。我建议将这个变量放在方法之外(如果我没记错的话,它被称为字段),所以它可以通过任何类访问,并且不会在每次调用更新时重新实例化。这看起来像这样:

boolean isHorizontalLocked = false;
String lockedKey = null;

之后,在更新方法中写下这样的内容:

if (!isHorizontalLocked) {
   if (input.isKeyDown("KEY_A")) {
       isHorizontalLocked = true;
       lockedKey = "A";
   }
   else if (input.isKeyDown("KEY_D")) {
       isHorizontalLocked = true;
       lockedKey = "D";
   }
   else {
       isHorizontalLocked = false;
   }
}
else if (isHorizontalLocked) {
   if (lockedKey == "A") {
       if (input.isKeyDown("KEY_A")) {
          //move left
       }
       if (!input.isKeyDown("KEY_A")) {
          lockedKey = null;
          isHorizontalLocked = false;
       }
   }
   else if (lockedKey == "D") {
       if (input.isKeyDown("KEY_D")) {
          //move right
       }
       if (!input.isKeyDown("KEY_D")) {
          lockedKey = null;
          isHorizontalLocked = false;
       }
   }
}

我认为这应该有效,但如果有人发现错误,请告诉我,我会解决。