GLFW切换布尔切换

时间:2018-09-25 07:05:03

标签: c++ opengl glfw

我使用GLFW进行键盘输入,但是处理速度太快,因此每按一次输入一次,我的布尔开关就会改变大约10次,因为输入每帧都要处理一次。我只需要按一下空格键即可切换状态。我当前的代码如下:

if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
{
    show = !show;
}

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

是的。 glfwGetKey用于连续按键输入。如果您想一次性收到有关按键的通知,GLFW manual会列出glfwSetKeyCallback作为更好的选择。

因此,对于您的情况,应该是这样的:

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_SPACE && action == GLFW_PRESS)
        show = !show;
}

如果出于某种原因不想使用此方法,则始终可以自己实现类似的操作。您将需要一个表示键状态的布尔值(或值数组)。然后,在输入处理中,您必须仅对按钮状态的 change 做出反应,就像这样:

bool spacePressed;

// in handling
bool spaceCurrentlyPressed = glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS;

if (!spacePressed && spaceCurrentlyPressed) { // wasn't before, is now
    show = !show;
}
spacePressed = spaceCurrentlyPressed;

答案 1 :(得分:1)

我建议您使用GLFW key callbacks,而不要在每个帧中自己获取关键状态。这样,您每个按键只会收到一个按键和一个按键释放事件。

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if(action == GLFW_RELEASE) return; //only handle press events
    if(key == GLFW_KEY_SPACE) show = !show;
}

//in main or init
glfwSetKeyCallback(window, key_callback);