GLFW вызов функции нестатического класса в static key_callback

Я много осматривался и много читал о статических функциях и переменных, я понял, что нельзя просто вызывать нестатическую переменную / функцию в статической функции и т. Д., Поэтому мой вопрос заключается в том, как мне решить эту проблему. Я имею с GLFW key_callback.

В GLFW у нас есть это:

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}

и мы добавляем это как другие вызовы, связанные с окном:

glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, window_key_callback);

Но теперь я хочу иметь возможность вызывать другую функцию класса, если в key_callback нажата клавиша «пробел» следующим образом:

в .h файле у меня есть

#include "A.h"
...

private:
A *anotherClass;

и в файле .cpp у меня в конструкторе

anotherClass = new A();

и остальное

 static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_SPACE && action == GLFW_PRESS)
antoherClass->draw();
}

и этот anotherClass не является статичным, я просто хочу начать рисовать, если пробел нажат.

Может кто-то помочь мне с этим?

0

Решение

Вам нужно сделать antherClass глобальная переменная, другого пути нет. Обычно функция обратного вызова должна принимать указатель данных, предоставленный пользователем, чтобы разрешить передачу внешней информации, похоже, здесь есть недостаток API.

Редактировать: Оказывается, вы можете использовать glfwSetWindowUserPointer а также glfwGetWindowUserPointer сделать это.

2

Другие решения

Как указал Ингум, вы можете использовать glfwSetWindowUserPointer а также glfwGetWindowUserPointer иметь доступ к указателю void * по вашему выбору.

Вот простой пример для тех, кто проходит как я:

int main(void)
{
t_MyDatas     datas;
GLFWwindow    *window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
//[...]
glfwSetWindowUserPointer(window, (void *)&datas);
glfwSetKeyCallback(window, &KeyCallback);
}

void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
t_MyDatas *datas;
datas = (t_MyDatas *)glfwGetWindowUserPointer(window);
//[...]
}

Важно помнить, что приведение из (void *) затем приведение к исходной структуре.

0

По вопросам рекламы [email protected]