我已经创建了一个静态Input类,它基本上有一个我可以调用的方法,就是这样:
public static boolean GetKeyDown(int keyCode) {
while(Keyboard.next()) {
Keyboard.enableRepeatEvents(false);
if (Keyboard.getEventKeyState()) {
if (Keyboard.getEventKey() == keyCode) {
return true;
} else {
return false;
}
}
}
return false;
}
在我的游戏更新循环中,我想要使用它,而不是必须进行单个while循环:
if(Input.GetKeyDown(KeyCode.S)) {
//Something happens
}
if(Input.GetKeyDown(KeyCode.R)) {
//Something happens
}
//etc..
但似乎只有第一个加载,才会起作用。在这种情况下'S'。有没有办法让我能够使用其他人呢?
答案 0 :(得分:3)
这是因为在您的GetKeyDown()
方法中,您调用了Keyboard.next()
,当您调用该方法时,它会从Event
删除当前密钥的Keyboard
,当您拨打Display.update();
注意:此方法不会向操作系统查询新事件。为此,必须首先调用Display.processMessages()(或Display.update())。
来源:LWJGL Docs
相反,您可以使用Keyboard.isKeyDown(int key)方法来实现您的目标。
虽然它会返回true / false,具体取决于以下内容。
返回:如果键根据上次轮询()
而关闭,则返回true
但这仍然无法解决问题,因为它依赖于poll()
方法。
您可以通过创建一些与Keyboard
类一起使用的自定义方法来解决问题,正如您所说的那样,但是当您调用Display.update();
方法时,键盘事件只会更新。< / p>
您已经对要创建的函数有了正确的想法,尽管您需要将它们分成两种不同的方法。您需要一个辅助方法,每次要更新键盘时都会调用一次。
public class MyKeyboard {
/*
* Remember that the index where we store the value,
* is the index of the key. Thereby one key might have
* an index of 400, then your array need to have at least
* the same size, to be able to store it.
*/
public static boolean[] keys = new boolean[100]; // 100 is the amount of keys to remember!
public static void update() {
while(Keyboard.next()) {
if (Keyboard.getEventKey() < keys.length) {
keys[Keyboard.getEventKey()] = Keyboard.getEventKeyState();
}
}
}
public static boolean isKeyDown(int key) {
if ((key > 0) && (key < keys.length)) {
return keys[key];
}
return false;
}
}
请记住,每MyKeyboard.update()
只调用一次Display.update()
方法我也将您的GetKeyDown()
方法重命名为isKeyDown()
,因为我觉得这听起来更好,但如果您愿意,可以在项目中重新命名。
上面的代码是在这个答案中完成的,没有使用IDE等。所以如果它有什么问题我道歉,但只是评论,我会修复它。
这种方法出现的一个问题是缺乏重新检查。由于Keyboard.next()
仅检查当前帧中发生的输入。一旦按下按钮将保持“按下”直到再次按下。我试图实现这个解决方案时遇到了这个问题。这个新问题的答案在这里:
public static void update() {
for(int i = 0; i < keys.length; i++) {
keys[i] = false;
}
while(Keyboard.next()) {
keys[Keyboard.getEventKey()] = Keyboard.getEventKeyState();
}
}
您必须将所有内容设置为false,以清除前一帧的按键。