使用GLFW按下某个键后,是否只能处理一个输入事件?

Ste*_*ski 2 c++ io glfw

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

我正在使用具有以下条件的processInput函数:

if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS) {
        currentXPos--;
        if (currentXPos < 0)
            currentXPos = 0;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

这确实适用于单个键,但是如果我也使用右箭头键实现此功能(用于增加相同的值),则以下函数在首次发布后会不断返回GLFW_RELEASE,将canMove bool设置为true并最终使多余的

if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_RELEASE) {
            canMove = true;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用glfwWaitEvents(),但是当帮助时间超过0.5秒左右时,它仍会处理多个输入(与在搜索栏/文本编辑器中按住键盘上的任何字符相同的效果)。

BDL*_*BDL 5

当您只希望一次处理每个键时,最好的解决方案是侦听键回调事件,而不是在每个帧中查询键状态。键回调是一个函数,可以将其挂接到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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

glfwSetKeyCallback(window, key_callback);
Run Code Online (Sandbox Code Playgroud)

可以在《GLFW输入指南》中找到更多详细信息。