在按键期间不会不断调用来自 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_PRESS
、GLFW_RELEASE
或 GLFW_REPEAT
。因此,通过过滤action != GLFW_RELEASE
条件,您可以有效地获得GLFW_PRESS
和GLFW_REPEAT
事件。尝试将条件更改为action == GLFW_PRESS
,当按键被按下时,您应该只获得一次事件。
@VVV,我不打算得到这个结果。我想从 GLFW_REPEAT 中获取此类事件,从我获取 GLFW_PRESS 开始,我想要连续事件。
【参考方案1】:
Nvm。看来我的预期是错误的。我应该只监听 GLFW_PRESS 和 GLFW_RELEASE,存储密钥状态,然后在我的主循环中使用 if(status)。
【讨论】:
你在 Windows 上得到的就是你打开记事本并按住一个键时得到的确切行为:- 重复行为更适合为想要输入大量内容的人提供“良好”体验文档中的符号。游戏引擎通常需要向上/向下通知,或者,对于操纵杆和压力感应按钮等设备,它们只需按帧轮询设备。【参考方案2】:如果您只想知道某个键是否被按下,则根本不需要使用事件回调。只需使用glfwGetKey(window,key)
获取当前密钥状态(这将返回GLFW_PRESS
或GLFW_RELEASE
)。详情请见here。
【讨论】:
以上是关于在按键期间不会不断调用来自 GLFW 的 glfwSetKeyCallback()的主要内容,如果未能解决你的问题,请参考以下文章
来自 glGetError() 的 INVALID_ENUM 错误。 glGetError 与 glu、glew、glfw?
有没有办法在使用 GLFW 按下一个键后只处理一个输入事件?