정적 UI 클래스로 잘못된 접근 방식을 취하고 있습니다. 정적 콜백에서 인스턴스 함수로 "바운스"하는 일반적인 방법은 정적 콜백에서 액세스 할 수있는 위치에 점프 할 수있는 항목을 저장하는 것입니다.
이러한 종류의 정적 콜백이 필요한 GLFW 및 기본 Win32와 같은 대부분의 API는 위의 연결 방법을 제공합니다. : GLFW 창은 할당 할 수있는 저장 장치의 포인터 크기의 블록이 사용자 포인터를 . 당신은 얻 거나 설정할 수 있습니다필요에 따라이 사용자 포인터를 .
가장 일반적인 패턴은 Game
"HandleKeyPress (Key key)"와 같은 메소드가 있거나없는 클래스 가있는 것입니다 . 프로그램을 시작할 때 Game
객체 를 만들고 모든 GLFW 초기화를 수행 한 다음 Game
포인터를 사용자 데이터 저장소에 넣습니다.
int main () {
GLFWindow * window = ... create GLFW window ...
Game game(... game constructor parameters ...);
glfwSetWindowUserPointer(window, &game);
... main game loop ...
}
그런 다음 키보드 콜백 (및 다른 모든 정적 콜백)은 Game *
사용자 포인터 저장소에서 압축을 풀고 전달할 수 있습니다.
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
game->HandleKeyDown(...);
}
인스턴스 의 HandleKeyDown
메소드는 Game
필요한 경우 UI 객체로 전달할 수 있습니다 (또는 실제로 UI 객체에 대한 키보드 입력 만 필요한 경우 사용자 저장소에 UI 객체에 대한 포인터를 넣을 수 있지만 게임과 같은 것을 채울 수 있습니다) 또는 창마다 사용할 포인터가 하나뿐이므로 일반적으로 더 높은 수준의 것이 좋습니다.