使用GLFW按下键后,是否可以仅处理一个输入事件?

时间:2018-08-16 09:35:11

标签: c++ io glfw

当前,在按住所需键时,输入会多次注册。有没有一种方法可以仅在按下键后处理第一个事件,而忽略随后的事件直到释放键?

我正在使用具有以下条件的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 个答案:

答案 0 :(得分:3)

当您只希望一次处理每个键时,最好的解决方案是侦听键回调事件,而不是查询每个帧中的键状态。键回调是一个函数,可以将其挂接到glfw中,并且对于每个键事件都调用一次。

回调应该看起来像这样:

wherearethey[array, "Column"]

然后可以在创建窗口之后的某个位置注册该回调:

Column  {{From, To}}
10      {{1,2}}
14      {{7,10}}
17      {{13,14}}
18      {{15,17}}

更多详细信息可以在GLFW Input Guide中找到。