在按键期间不会不断调用来自 GLFW 的 glfwSetKeyCallback()

Posted

技术标签:

【中文标题】在按键期间不会不断调用来自 GLFW 的 glfwSetKeyCallback()【英文标题】:glfwSetKeyCallback() from GLFW is not called constantly during a key press 【发布时间】:2019-03-06 11:12:57 【问题描述】:

我试图让我的游戏在我按下一个键时执行一些操作。我正在使用 GLFW 为我处理 Windows API。当我在标题中使用提及回调函数时,我感到困惑和困惑。

参考文档:https://www.glfw.org/docs/latest/input_guide.html#input_keyboard

我关注了“按键输入”资源(不是“文本输入”),但我得到了一种文本输入回调曲线,比如,当我按住一个键时,我得到了按键事件,然后它会停止一段时间,然后我得到重复的事件。回调不应该在时间上保持不变(没有那个时间间隔)吗?这是我的代码:

void onKeyPress(GLFWwindow* window, int key, int scancode, int action, int mods)

    if (key == GLFW_KEY_W && action != GLFW_RELEASE)
    
        camera.pos += glm::vec3(0.0f, 0.0f, 1.0f);
        updateCameraMatrices();
    


// ...

glfwSetKeyCallback(window, onKeyPress);

【问题讨论】:

在 GLFW 键事件中可能有以下动作:GLFW_PRESSGLFW_RELEASEGLFW_REPEAT。因此,通过过滤action != GLFW_RELEASE 条件,您可以有效地获得GLFW_PRESSGLFW_REPEAT 事件。尝试将条件更改为action == GLFW_PRESS,当按键被按下时,您应该只获得一次事件。 @VVV,我不打算得到这个结果。我想从 GLFW_REPEAT 中获取此类事件,从我获取 GLFW_PRESS 开始,我想要连续事件。 【参考方案1】:

Nvm。看来我的预期是错误的。我应该只监听 GLFW_PRESS 和 GLFW_RELEASE,存储密钥状态,然后在我的主循环中使用 if(status)。

【讨论】:

你在 Windows 上得到的就是你打开记事本并按住一个键时得到的确切行为:- 重复行为更适合为想要输入大量内容的人提供“良好”体验文档中的符号。游戏引擎通常需要向上/向下通知,或者,对于操纵杆和压力感应按钮等设备,它们只需按帧轮询设备。【参考方案2】:

如果您只想知道某个键是否被按下,则根本不需要使用事件回调。只需使用glfwGetKey(window,key) 获取当前密钥状态(这将返回GLFW_PRESSGLFW_RELEASE)。详情请见here。

【讨论】:

以上是关于在按键期间不会不断调用来自 GLFW 的 glfwSetKeyCallback()的主要内容,如果未能解决你的问题,请参考以下文章

来自 glGetError() 的 INVALID_ENUM 错误。 glGetError 与 glu、glew、glfw?

在 Mac 上使用 CMake 的 GLFW

有没有办法在使用 GLFW 按下一个键后只处理一个输入事件?

无法在 Visual Studio 2019 上包含 GLFW/glfw.h

在 GLFW 窗口中启用多重采样不会提高抗锯齿的质量

使用 GLFW 处理输入