我正在使用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”。
感谢。亚历克斯。
答案 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;
}
}
}
我认为这应该有效,但如果有人发现错误,请告诉我,我会解决。