opengl GLFW开关布尔切换

c3frrgcw  于 2023-08-04  发布在  其他
关注(0)|答案(3)|浏览(136)

我使用GLFW进行键盘输入,但处理速度太快,因此我的布尔开关在一个单一的新闻得到改变像10倍,因为输入是处理每一帧。所有我需要的是,一个单一的按空格键,它会切换状态。我的当前代码如下:

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

字符集
有没有更好的办法?

ylamdve6

ylamdve61#

是的。glfwGetKey用于连续按键输入。GLFW手册列出了glfwSetKeyCallback作为一个更好的替代品,如果你想一次性通知按键。
因此,对于您的情况,它会是这样的:

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

字符集
如果您出于某种原因不想使用此方法,您可以自己实现类似的东西。您需要一个布尔值(或值数组)来表示键状态。然后,在你的输入处理中,你必须只对按钮状态的 * 改变 * 做出React,就像这样:

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;

xmakbtuz

xmakbtuz2#

我再次推荐使用GLFW键回调,而不是每帧都自己获取键状态。这样,每个键只会收到一次按键和一次按键释放事件。

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);

字符集

bqf10yzr

bqf10yzr3#

我有点晚了这个问题,但我也有麻烦实现一个关键切换像你一样。下面是我在不使用key_callback的情况下修复它的方法(在脑海中编写w.r.t代码):
yourClass.h文件中:

class yourClass {
    ...
    bool spacePressed = false;
    ...
}

字符集
yourClass.cpp文件中:

void yourClass::yourFunction(...) {
    ...
    if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)    
    {
        if (!spacePressed) {
            show = !show;
            spacePressed = true;
        }
    } else if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_RELEASE) {
        spacePressed = false;
    }
    ...
}

相关问题