如何将GLFW的键盘输入转发到另一个对象?


9

我在尝试使用GLFW3在另一个类中执行键盘事件时遇到麻烦。我遇到的问题是GLFW3使用静态函数进行输入,如下所示:

static UI u;
...
...
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    u.controls(window, key, action);
}

u也是静态的,控件保留WSAD键的输入(这是我获取键事件的唯一方法)。从这里开始,按下一个键将显示在控制台窗口中按下哪个键。我遇到的麻烦是试图使用按下的键来操纵另一个类中的变量。

我还有一个名为MainMenu的类,该类具有该功能。update().是否可以在此函数中使用UI类?

Answers:


16

您对静态UI类采用了错误的方法。从静态回调“反弹”到实例函数的通常方法是将能够进行跳转的内容存储在可从静态回调访问的位置。

大多数需要这类静态回调的API,例如GLFW和本机Win32,都提供了一种进行上述关联的方法。GLFW窗口具有指针大小的存储块,您可以将其分配给:用户指针。您可以根据需要获取设置此用户指针。

一个非常常见的模式是拥有某种类,Game该类具有诸如“ HandleKeyPress(Key key)” 之类的方法。程序启动时,创建Game对象并进行所有GLFW初始化,然后将Game指针填充到用户数据存储中:

int main () {
  GLFWindow * window = ... create GLFW window ...
  Game game(... game constructor parameters ...);

  glfwSetWindowUserPointer(window, &game);

  ... main game loop ...
}

然后,您的键盘回调(以及所有其他静态回调)可以Game *从用户指针存储中解压缩并转发给它:

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
  Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
  game->HandleKeyDown(...);
}

HandleKeyDown对方法Game的实例可以在需要沿转发给你的UI对象(或者,如果你真的需要键盘输入的UI对象,你可以只是把这些东西一个指向用户存储你的用户界面对象,然而,馅有点像游戏或更高级别的东西通常更好,因为每个窗口只能使用一个指针)。


0

我目前解决该问题的方法是使用单例对象,当我需要访问该类时,我可以只检索指向单例的指针:

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    InputManager * in_manager = InputManager::get_instance();
    in_manager->handle_key_press( params)
}

这样的事。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.