GLFW 切换布尔切换
GLFW switching boolean toggle
我正在使用 GLFW 进行键盘输入,但处理速度太快,因此我的布尔开关在一次按下时被更改了 10 次,因为每帧都处理输入。我只需要按一下 space 栏,它就会切换状态。我当前的代码如下:
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
{
show = !show;
}
有更好的方法吗?
是的。 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;
我建议使用 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);
我正在使用 GLFW 进行键盘输入,但处理速度太快,因此我的布尔开关在一次按下时被更改了 10 次,因为每帧都处理输入。我只需要按一下 space 栏,它就会切换状态。我当前的代码如下:
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
{
show = !show;
}
有更好的方法吗?
是的。 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;
我建议使用 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);