我使用GLFW进行键盘输入,但是处理速度太快,因此每按一次输入一次,我的布尔开关就会改变大约10次,因为输入每帧都要处理一次。我只需要按一下空格键即可切换状态。我当前的代码如下:
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
{
show = !show;
}
有更好的方法吗?
答案 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);