GLFW与LWJGL - glfwGetKey一次

时间:2015-07-16 23:34:45

标签: java lwjgl glfw

我正在用java和LWJGL3开发游戏。但我不明白如何解决我的问题,我试图在互联网上搜索,但LWJGL的信息很少,我找不到任何GLFW。

比方说,我有一个带4个按钮的菜单(新游戏,选项,积分,退出)和计数变量,以了解选择了哪一个。每次按下向上箭头键,我想从选择中减去一个,选择前一个,向下箭头键相同,但我想添加一个。

问题如下:如果在第0帧中我按箭头键添加了计数变量,但在下一帧中仍然按下了键,因此再次添加。我不知道如何修复此问题,我尝试将GLFW_PRESS更改为GLFW_RELEASE,但我希望在按下该键时执行操作。

if ((glfwGetKey(window, GLFW_KEY_UP) == GLFW_REPEAT) && select > 0) {
    button[select].toggleSelect();
    select--;
    button[select].toggleSelect();
}

if ((glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_REPEAT) && select < button.length) {
    button[select].toggleSelect();
    select++;
    button[select].toggleSelect();
}

我知道这段代码可以抛出数组索引超出范围的异常

1 个答案:

答案 0 :(得分:0)

您应该注册一个关键回调:

private GLFWKeyCallback keyCallback;

// ...

keyCallback = new GLFWKeyCallback() {
    @Override
    public void invoke(long window, int key, int scancode, int action, int mods) {
        if (action == GLFW_PRESS) {
            if (key == GLFW_KEY_UP && /*...*/) {
                // ...
            }
            if (key == GLFW_KEY_DOWN && /*...*/) {
                // ...
            }
        }
    }
}
glfwSetKeyCallback(window, keyCallback);

每次生成键事件时都会调用invoke()方法。 action参数可以带三个值:

    刚刚按下键时
  • GLFW_PRESS
  • GLFW_REPEAT之后,当按键仍被按下时
  • GLFW_RELEASE当密钥浪费刚刚发布时

虽然glfwGetKey()仅返回GLFW_PRESSGLFW_RELEASE,但关键回调仅在第一次按下按键时使用GLFW_PRESS,之后仅使用GLFW_REPEAT,允许您可以区分按下该键的第一帧和后续帧。