作者:vicj_iao | 来源:互联网 | 2022-12-07 15:42
当前,在按住所需键时,输入会多次注册。有没有一种方法可以仅在按下键后处理第一个事件,而忽略随后的事件直到释放键?
我正在使用具有以下条件的processInput函数:
if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS) {
currentXPos--;
if (currentXPos <0)
currentXPos = 0;
}
currentXPos
只是一个受左右箭头键影响的整数。我也有一个等效的currentYPos
整数,该整数也受上/下箭头键的影响。我需要每次按键增加/减少currentXPos一次。我尝试添加一个初始设置为true的全局布尔值,并在执行时将其设置为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 bool设置为true并最终使多余的
if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_RELEASE) {
canMove = true;
}
我尝试使用glfwWaitEvents(),但是当帮助时间超过0.5秒左右时,它仍会处理多个输入(与在搜索栏/文本编辑器中按住键盘上的任何字符相同的效果)。
1> BDL..:
当您只希望一次处理每个键时,最好的解决方案是侦听键回调事件,而不是在每个帧中查询键状态。键回调是一个函数,可以将其挂接到glfw中,并且对于每个键事件都调用一次。
回调应该看起来像这样:
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_RIGHT && action == GLFW_PRESS)
{
currentXPos--;
if (currentXPos <0)
currentXPos = 0;
}
}
然后可以在创建窗口之后的某个位置注册此回调:
glfwSetKeyCallback(window, key_callback);
可以在《GLFW输入指南》中找到更多详细信息。