LWJGL键盘循环

时间:2013-11-06 18:47:55

标签: java static while-loop lwjgl

我已经创建了一个静态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'。有没有办法让我能够使用其他人呢?

1 个答案:

答案 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,以清除前一帧的按键。