【问题标题】:GLFW with LWJGL - glfwGetKey onceGLFW 与 LWJGL - glfwGetKey 一次
【发布时间】:2015-07-16 23:34:44
【问题描述】:

我正在使用 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();
}

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

【问题讨论】:

    标签: java lwjgl glfw


    【解决方案1】:

    你应该注册一个键回调:

    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,允许您区分第一帧,在此期间键被按下和后续的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多