Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在LWJGL中覆盖按键_Java_Keyboard_Lwjgl - Fatal编程技术网

Java 如何在LWJGL中覆盖按键

Java 如何在LWJGL中覆盖按键,java,keyboard,lwjgl,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”键将由于“else”部分而继续向右移动 我试过不使用else,只让两个键都运行,但如果两个键都按下,则不会移动 我在寻找一段代码,它只允

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

if(Keyboard.isKeyDown(Keyboard.KEY_A))
{
   //move left
}
else if(Keyboard.isKeyDown(Keyboard.KEY_D))
{
   //move right
}
如果我按下“a”键,则“d”键将向右移动,但如果我按下“d”键,则“a”键将由于“else”部分而继续向右移动

我试过不使用else,只让两个键都运行,但如果两个键都按下,则不会移动

我在寻找一段代码,它只允许我从上次按下的键获取输入

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

谢谢。Alex。

用于确定当前事件,然后是确定这是哪个键。然后,您需要确保通过禁用重复事件。保持当前移动的状态,根据这些事件进行更改,并相应地调整每个刻度移动。类似以下内容,如快速草图:

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;
    }
  }
}
用于确定当前事件,后跟用于确定这是哪个键。然后,您需要确保通过禁用重复事件。保持当前移动的状态,根据这些事件进行更改,并相应地调整每个刻度移动。类似以下内容,如快速草图:

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

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

boolean isHorizontalLocked = false;
String lockedKey = null;
之后,在update方法中编写如下内容:

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

我想这应该可以,但如果有人发现错误,请告诉我,我会解决它。

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

boolean isHorizontalLocked = false;
String lockedKey = null;
之后,在update方法中编写如下内容:

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

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

让我澄清一下,您需要以下信息。。。按住A,然后D向右移动,按住D,然后A向左移动?不完全是这样,我需要它,使它只朝最后一个键的方向移动(“A”向左,“D”向右),这样,如果两个键都按住,它就知道最后一个键被按下了,并且该键的功能是否用于确定当前事件,然后确定这是哪个键。然后,您需要确保通过禁用重复事件。保持当前移动的状态,根据这些事件进行更改,并相应地调整每个勾号移动。作为游戏玩家,我更喜欢在游戏中使用您描述的“不移动”策略(通过删除else)。Minecraft也使用LWJGL,如果你同时按下A和D键,你的角色会静止不动。这是最直观的解决方案,因为我认为这两个键应该相互抵消。只要我的2美分…让我直说吧,你想要下面的。。。按住A,然后D向右移动,按住D,然后A向左移动?不完全是这样,我需要它,使它只朝最后一个键的方向移动(“A”向左,“D”向右),这样,如果两个键都按住,它就知道最后一个键被按下了,并且该键的功能是否用于确定当前事件,然后确定这是哪个键。然后,您需要确保通过禁用重复事件。保持当前移动的状态,根据这些事件进行更改,并相应地调整每个勾号移动。作为游戏玩家,我更喜欢在游戏中使用您描述的“不移动”策略(通过删除else)。Minecraft也使用LWJGL,如果你同时按下A和D键,你的角色会静止不动。这是最直观的解决方案,因为我认为这两个键应该相互抵消。只要在while(Keyboard.next())循环中设置变量,我的2美分就行了,谢谢。@AlexMusk没问题。PS,由于您在这里看起来较新,请不要忘记标记对解决问题最有帮助的答案。只要您在while(Keyboard.next())循环中设置变量,就可以工作,谢谢。@Alexmask没问题。另外,由于您在这里看起来比较新,请不要忘记标记对解决问题最有帮助的答案。