GLFW 切换布尔切换

GLFW switching boolean toggle

我正在使用 GLFW 进行键盘输入,但处理速度太快,因此我的布尔开关在一次按下时被更改了 10 次,因为每帧都处理输入。我只需要按一下 space 栏,它就会切换状态。我当前的代码如下:

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

有更好的方法吗?

是的。 glfwGetKey 用于连续键输入。 GLFW manualglfwSetKeyCallback 列为更好的替代方案,如果您希望一次性获得有关按键的通知。

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

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;

我建议使用 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);