Estás tomando el enfoque equivocado con una clase de IU estática. La forma habitual de "rebotar" desde una devolución de llamada estática a una función de instancia es almacenar algo capaz de hacer el salto en un lugar al que se pueda acceder desde la devolución de llamada estática.
La mayoría de las API, como GLFW y Win32 nativo, que requieren este tipo de devoluciones de llamada estáticas proporcionan una forma de hacer la asociación anterior. Las ventanas GLFW tienen un bloque de almacenamiento del tamaño de un puntero que puede asignar a: el puntero del usuario . Puede obtener o configurar este puntero de usuario según sea necesario.
Un patrón muy común es tener algún tipo de Game
clase que tenga métodos como "HandleKeyPress (Key key)" o cualquier otra cosa. Cuando inicia el programa, crea el Game
objeto y realiza toda su inicialización GLFW, luego inserta el Game
puntero en el almacenamiento de datos del usuario:
int main () {
GLFWindow * window = ... create GLFW window ...
Game game(... game constructor parameters ...);
glfwSetWindowUserPointer(window, &game);
... main game loop ...
}
Luego, la devolución de llamada del teclado (y todas las demás devoluciones de llamada estáticas) pueden descomprimir el Game *
almacenamiento del puntero del usuario y reenviarlo:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
game->HandleKeyDown(...);
}
El HandleKeyDown
método en la Game
instancia puede reenviarlo a su objeto de interfaz de usuario si es necesario (o, si realmente solo necesita la entrada del teclado para el objeto de interfaz de usuario, podría simplemente colocar un puntero a su objeto de interfaz de usuario en el almacenamiento del usuario, sin embargo, rellenar algo como el juego o algo de nivel superior generalmente es mejor ya que solo tiene un puntero por ventana para usar).