Mit einer statischen UI-Klasse gehen Sie falsch vor. Der übliche Weg, um von einem statischen Rückruf zu einer Instanzfunktion zu "springen", besteht darin, etwas zu speichern, das den Sprung an einer Stelle ausführen kann, auf die über den statischen Rückruf zugegriffen werden kann.
Die meisten APIs, wie GLFW und natives Win32, die diese Art von statischen Rückrufen erfordern, bieten eine Möglichkeit, die obige Zuordnung herzustellen. GLFW-Fenster verfügen über einen Speicherblock in Zeigergröße, dem Sie Folgendes zuweisen können: den Benutzerzeiger . Sie können bekommen oder einstellen diesen Benutzerzeiger nach Bedarf .
Ein sehr häufiges Muster ist eine Game
Klasse mit Methoden wie "HandleKeyPress (Key Key)" oder so weiter. Wenn Sie das Programm starten, erstellen Sie das Game
Objekt, führen die gesamte GLFW-Initialisierung durch und fügen den Game
Zeiger in den Benutzerdatenspeicher ein:
int main () {
GLFWindow * window = ... create GLFW window ...
Game game(... game constructor parameters ...);
glfwSetWindowUserPointer(window, &game);
... main game loop ...
}
Anschließend kann Ihr Tastaturrückruf (und alle anderen statischen Rückrufe) den Game *
Speicherplatz aus dem Benutzerzeiger entpacken und an diesen weiterleiten:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
game->HandleKeyDown(...);
}
Die HandleKeyDown
Methode auf der Game
Instanz kann bei Bedarf an Ihr UI-Objekt weitergeleitet werden (oder wenn Sie wirklich nur Tastatureingaben für das UI-Objekt benötigen, können Sie einfach einen Zeiger auf Ihr UI-Objekt im Benutzerspeicher einfügen, jedoch so etwas wie das Spiel oder etwas höheres ist im Allgemeinen besser, da Sie nur einen Zeiger pro Fenster verwenden können).