首页 > 解决方案 > 如何在没有glfwSetKeyCallback()的情况下仅检测一次按键

问题描述

我有一点问题。

我试图制作一个小游戏,总结起来我GLFWwindow* window是一个 Game.h 类变量。

如果我理解正确(或者至少对我来说是这样),以便使用不同的窗口回调函数,例如:

我需要传递静态函数,即static void key_callback(GLFWwindow* window, int, int, int, int)作为它们的参数。

所以这个函数看起来有点像这样:

void Game::key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) //this is declared as static
{
    if (key == GLFW_KEY_F11 && action == GLFW_PRESS) {
        changeScreen();
    }
    if (key == GLFW_KEY_M && action == GLFW_PRESS) {
        changeMouse();
    }
}

changeScreen()转化为:

void Game::changeScreen()
{
    screenState = !screenState;
    if (screenState) {
        glfwSetWindowMonitor(window, 0, 200, 200, 600, 600, GLFW_DONT_CARE);
    }
    else {
        glfwSetWindowMonitor(window, glfwGetPrimaryMonitor(), 0, 0, 2560, 1440, GLFW_DONT_CARE);
    }
}

问题是,window以及changeScreen()它的变量不是静态的,因此我不能使用它们。

因此,解决它的最简单方法是我使用所有其他键的方式,例如:

if (glfwGetKey(this->window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
    {
        glfwSetWindowShouldClose(this->window, GLFW_TRUE);
    }

所以我需要以某种方式能够使用这种方法只检测一次按键。我对我的问题的任何其他解决方案持开放态度。但是如果有一些愚蠢的方式(这真的不需要非常可靠地工作)我想使用它,因为在这个阶段重新设计项目并使窗口成为全局或至少不是班级成员会让我头疼。

标签: glfw

解决方案


这不是一个解决方案,但现在调用:

glfwWaitEventsTimeout(float time); //my time is set for 0.7 and its quite fluid

如果我按下按钮并迅速释放,则使按钮按下注册一次。

if (glfwGetKey(this->window, GLFW_KEY_F11) == GLFW_PRESS) {
    glfwWaitEventsTimeout(0.7);
    changeScreen();
}

推荐阅读