Vous adoptez la mauvaise approche avec une classe d'interface utilisateur statique. La façon habituelle de "rebondir" d'un rappel statique vers une fonction d'instance est de stocker quelque chose capable de faire le saut dans un endroit accessible à partir du rappel statique.
La plupart des API, comme GLFW et Win32 natif, qui nécessitent ces types de rappels statiques fournissent un moyen de faire l'association ci-dessus. Les fenêtres GLFW ont un bloc de stockage de la taille d'un pointeur que vous pouvez affecter à: le pointeur utilisateur . Vous pouvez obtenir ou définir ce pointeur utilisateur selon vos besoins.
Un modèle très courant consiste à avoir une sorte de Game
classe qui a des méthodes comme "HandleKeyPress (Key key)" ou autre chose. Lorsque vous programmez démarre, vous créez l' Game
objet et faites toute votre initialisation GLFW, puis placez le Game
pointeur dans le stockage de données utilisateur:
int main () {
GLFWindow * window = ... create GLFW window ...
Game game(... game constructor parameters ...);
glfwSetWindowUserPointer(window, &game);
... main game loop ...
}
Ensuite, votre rappel clavier (et tous les autres rappels statiques) peuvent décompresser le Game *
stockage du pointeur utilisateur et le transmettre:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
game->HandleKeyDown(...);
}
La HandleKeyDown
méthode sur l' Game
instance peut être transmise à votre objet d'interface utilisateur si nécessaire (ou, si vous n'avez vraiment besoin que d' une entrée au clavier pour l'objet d'interface utilisateur, vous pouvez simplement remplir un pointeur vers votre objet d'interface utilisateur dans le stockage utilisateur, cependant, en remplissant quelque chose comme le jeu ou quelque chose de niveau supérieur est généralement meilleur car vous n'avez qu'un seul pointeur par fenêtre à utiliser).