Você está adotando a abordagem errada com uma classe de interface do usuário estática. A maneira usual de "devolver" de um retorno de chamada estático para uma função de instância é armazenar algo capaz de saltar em um local acessível a partir do retorno de chamada estático.
A maioria das APIs, como GLFW e Win32 nativo, que exigem esses tipos de retornos de chamada estáticos, fornece uma maneira de fazer a associação acima. As janelas do GLFW possuem um bloco de armazenamento do tamanho de um ponteiro ao qual você pode atribuir: o ponteiro do usuário . Você pode obter ou definir esse ponteiro do usuário, conforme necessário.
Um padrão muito comum é ter algum tipo de Game
classe que possua métodos como "HandleKeyPress (tecla Key)" ou outros enfeites. Ao iniciar o programa, você cria o Game
objeto e realiza toda a inicialização do GLFW e, em seguida, coloca o Game
ponteiro no armazenamento de dados do usuário:
int main () {
GLFWindow * window = ... create GLFW window ...
Game game(... game constructor parameters ...);
glfwSetWindowUserPointer(window, &game);
... main game loop ...
}
Em seguida, o retorno de chamada do teclado (e todos os outros retornos estáticos) pode descompactar o Game *
armazenamento do ponteiro do usuário e encaminhar para ele:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
game->HandleKeyDown(...);
}
O HandleKeyDown
método na Game
instância pode encaminhar para o seu objeto de interface do usuário, se necessário (ou, se você realmente precisar apenas de entrada de teclado para o objeto de interface do usuário, basta inserir um ponteiro para o objeto de interface do usuário no armazenamento do usuário, no entanto, colocar algo como o jogo ou algo de nível superior é geralmente melhor, pois você só tem um ponteiro por janela para usar).