Java 如何在LWJGL中覆盖按键
我正在使用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,只让两个键都运行,但如果两个键都按下,则不会移动 我在寻找一段代码,它只允
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没问题。另外,由于您在这里看起来比较新,请不要忘记标记对解决问题最有帮助的答案。