1

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

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

如果我按下'a'键然后'd'键它会向右移动但是如果我按下'd'键然后'a'键由于“else”部分它仍然会继续向右移动。

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

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

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

谢谢。亚历克斯。

4

2 回答 2

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;
    }
  }
}
于 2012-08-08T22:11:38.300 回答
0

如果这仍然对您有帮助,我想知道,但是您可以锁定第一次按下的键,直到松开为止。我建议将此变量放在方法之外(如果我没记错的话,它称为字段),以便可以通过任何类访问它,并且不会在每次调用 update 时重新实例化。看起来像这样:

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;
       }
   }
}

我认为这应该可行,但如果有人发现错误,请告诉我,我会修复它。

于 2016-10-18T06:11:01.570 回答