glfw - 如何在没有glfwSetKeyCallback()的情况下仅检测一次按键
问题描述
我有一点问题。
我试图制作一个小游戏,总结起来我GLFWwindow* window
是一个 Game.h 类变量。
如果我理解正确(或者至少对我来说是这样),以便使用不同的窗口回调函数,例如:
glfwSetFramebufferSizeCallback()
glfwSetKeyCallback()
我需要传递静态函数,即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);
}
所以我需要以某种方式能够使用这种方法只检测一次按键。我对我的问题的任何其他解决方案持开放态度。但是如果有一些愚蠢的方式(这真的不需要非常可靠地工作)我想使用它,因为在这个阶段重新设计项目并使窗口成为全局或至少不是班级成员会让我头疼。
解决方案
这不是一个解决方案,但现在调用:
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();
}
推荐阅读
- c++ - 如何消除分段错误?AA树
- javascript - 对所有测试用例强制执行“expect()”
- ruby-on-rails - 如何使用 HTTParty(或 ruby 中的任何其他方式)将原始数据传递到 post 请求中
- typescript - 如何从泛型 TypeScript 类型扩展?
- networking - 如何在不使用浮动 IP 的情况下直接访问 OPENSTACK 实例
- ios - 由于在 iOS 14.2 模拟器的 Excluded Architectures 中设置 arm64 导致的大量错误
- python - 您是否应该为尚未分配给变量的对象调用“deleteLater”?
- c# - AutoMapper 自定义异步解析器
- php - x 时间前发布的 PHP 返回变量等于 0
- asp.net - 如何将 CSS 文件添加到 ASPX (Sharepoint Online)