GLFW 与 LWJGL - glfwGetKey once

GLFW with LWJGL - glfwGetKey once

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

举例来说,我有一个带有 4 个按钮(新游戏、选项、积分、退出)的菜单和一个计数变量,用于了解哪个是 selected。每次按下向上箭头键我想从 select 中减去一个到 select 前一个,向下箭头键也是如此,但我想添加一个。

问题如下:如果在第 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();
}

我知道这段代码会抛出数组索引越界异常

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

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() returns 仅 GLFW_PRESSGLFW_RELEASE,但按键回调仅在第一次按下按键时使用 GLFW_PRESS 并且 GLFW_REPEAT 之后,允许您区分按下键的第一帧和后续帧。