有没有办法在使用 GLFW 按下一个键后只处理一个输入事件?

Posted

技术标签:

【中文标题】有没有办法在使用 GLFW 按下一个键后只处理一个输入事件?【英文标题】:Is there a way to process only one input event after a key is pressed using GLFW? 【发布时间】:2018-08-16 09:35:11 【问题描述】:

目前,当按住所需键时,输入会注册多次。有没有办法只处理按键后的第一个事件并忽略后续事件,直到按键被释放?

我正在使用 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_PRESSGLFW_RELEASEGLFW_REPEAT @Scheff 是的,这就是我想要做的。感谢您的回复:) 【参考方案1】:

当您只想处理每个按键一次时,最好的解决方案是监听按键回调事件,而不是在每一帧中查询按键状态。按键回调是一个可以挂接到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 Input Guide。

【讨论】:

这正是我试图实现的行为。谢谢你:)

以上是关于有没有办法在使用 GLFW 按下一个键后只处理一个输入事件?的主要内容,如果未能解决你的问题,请参考以下文章

按下home键后iPhone应用程序没有声音

按下键后如何获取编辑文本的文本

在按键期间不会不断调用来自 GLFW 的 glfwSetKeyCallback()

int 16h/ah=1 即使在用户按下另一个键后也重复给出相同的按键

在 Pyqt 窗口中使用 glfw 窗口

将终端设置为原始模式:仅在按下下一个键后才显示字符