Podchodzisz niewłaściwie do statycznej klasy interfejsu użytkownika. Zwykłym sposobem „odbicia” od statycznego wywołania zwrotnego do funkcji instancji jest przechowanie czegoś zdolnego do wykonania skoku w miejscu, które jest dostępne od statycznego wywołania zwrotnego.
Większość interfejsów API, takich jak GLFW i natywny Win32, które wymagają tego rodzaju statycznych wywołań zwrotnych, umożliwia utworzenie powyższego powiązania. Okna GLFW mają blok pamięci wielkości wskaźnika, do którego można przypisać: wskaźnik użytkownika . Możesz pobrać lub ustawić ten wskaźnik użytkownika w razie potrzeby.
Bardzo częstym wzorcem jest posiadanie jakiejś Game
klasy, która ma metody takie jak „HandleKeyPress (klawisz klucza)” lub coś w tym stylu. Po uruchomieniu programu tworzysz Game
obiekt i wykonujesz całą inicjalizację GLFW, a następnie umieszczasz Game
wskaźnik w pamięci danych użytkownika:
int main () {
GLFWindow * window = ... create GLFW window ...
Game game(... game constructor parameters ...);
glfwSetWindowUserPointer(window, &game);
... main game loop ...
}
Następnie oddzwanianie klawiatury (i wszystkie inne statyczne oddzwaniania) może rozpakować Game *
pamięć podręczną użytkownika i przesłać do niej:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
game->HandleKeyDown(...);
}
HandleKeyDown
Sposób na Game
przykład można przekazać wzdłuż do obiektu UI w razie potrzeby (lub, jeśli naprawdę tylko potrzebne wprowadzanie danych z klawiatury dla obiektu UI można po prostu rzeczy wskaźnik do obiektu UI w pamięci użytkownika, jednak farsz coś jak gra lub coś wyższego poziomu jest ogólnie lepsze, ponieważ masz tylko jeden wskaźnik na okno do użycia).