Stai prendendo un approccio sbagliato con una classe UI statica. Il solito modo di "rimbalzare" da un callback statico a una funzione di istanza è di archiviare qualcosa in grado di fare il salto in un posto accessibile dal callback statico.
La maggior parte delle API, come GLFW e Win32 nativo, che richiedono questo tipo di callback statici forniscono un modo per creare l'associazione sopra. Le finestre GLFW hanno un blocco di dimensioni di un puntatore che è possibile assegnare a: il puntatore dell'utente . Puoi ottenere o impostare questo puntatore utente secondo necessità.
Un modello molto comune è quello di avere un qualche tipo di Game
classe che ha metodi come "HandleKeyPress (Key key)" o quant'altro. All'avvio del programma, si crea l' Game
oggetto e si esegue tutta l'inizializzazione GLFW, quindi si esegue il rootingGame
puntatore nell'archivio dati utente:
int main () {
GLFWindow * window = ... create GLFW window ...
Game game(... game constructor parameters ...);
glfwSetWindowUserPointer(window, &game);
... main game loop ...
}
Quindi, il callback della tastiera (e tutti gli altri callback statici) può decomprimere il file Game *
dalla memoria del puntatore dell'utente e inoltrarlo:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
game->HandleKeyDown(...);
}
Il HandleKeyDown
metodo Game
sull'istanza può inoltrare all'oggetto dell'interfaccia utente se necessario (o, se in realtà hai solo bisogno dell'input da tastiera per l'oggetto dell'interfaccia utente, puoi semplicemente inserire un puntatore all'oggetto dell'interfaccia utente nella memoria utente, tuttavia, riempire qualcosa come il gioco o qualcosa di livello superiore è generalmente migliore poiché hai solo un puntatore per finestra da usare).