【发布时间】:2021-06-27 23:09:45
【问题描述】:
目前,当按住所需键时,输入会注册多次。有没有办法只处理按键后的第一个事件并忽略后续事件,直到按键被释放?
我正在使用 processInput 函数,条件如下:
if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS) {
currentXPos--;
if (currentXPos < 0)
currentXPos = 0;
}
currentXPos 只是一个受左/右箭头键影响的整数。我有一个等效的currentYPos 整数,它也受向上/向下箭头键的影响。我需要每次按键增加/减少一次 currentXPos。我尝试添加一个初始设置为 true 的全局 bool,并在执行时将其设置为 false,如下所示:
if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS) {
if (canMove) {
canMove = false;
currentXPos--;
if (currentXPos < 0)
currentXPos = 0;
}
}
if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_RELEASE) {
canMove = true;
}
这确实适用于单个键,但如果我也使用右箭头键实现此功能(用于递增相同的值),以下函数在第一次发布后不断返回 GLFW_RELEASE,将 canMove 布尔设置为 true并最终使其变得多余;
if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_RELEASE) {
canMove = true;
}
我已经尝试使用 glfwWaitEvents(),但是当帮助超过 0.5 秒左右时它仍然会处理多个输入(与在搜索栏/文本编辑器中按住键盘上的任何字符的效果相同)。
【问题讨论】:
-
我浏览了一下文档。 Input reference。我的印象:
glfwGetKey()无法识别重复的按键。相反,您必须使用glfwSetKeyCallback()安装回调。回调的actionargument 将报告然后GLFW_PRESS、GLFW_RELEASE或GLFW_REPEAT。 -
@Scheff 是的,这就是我想要做的。感谢您的回复:)