GLFW의 키보드 입력을 다른 객체로 전달하려면 어떻게해야합니까?


9

GLFW3을 사용하여 다른 클래스에서 키보드 이벤트를 실행하는 데 문제가 있습니다. 내가 겪고있는 문제는 GLFW3가 표시된 것처럼 정적 함수를 입력에 사용한다는 것입니다.

static UI u;
...
...
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    u.controls(window, key, action);
}

u또한 정적이며 컨트롤은 WSAD 키에 대한 입력을 보유합니다 (키 이벤트를 얻을 수있는 유일한 방법). 여기에서 키를 누르면 콘솔 창에서 누른 키가 표시됩니다. 내가 겪고있는 어려움은 다른 클래스의 변수를 조작하기 위해 눌린 키를 사용하려고합니다.

MainMenu라는 다른 클래스 update().가 있는데 함수 가 있습니다.이 함수 내에서 UI 클래스를 사용할 수있는 방법이 있습니까?

답변:


16

정적 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 객체에 대한 포인터를 넣을 수 있지만 게임과 같은 것을 채울 수 있습니다) 또는 창마다 사용할 포인터가 하나뿐이므로 일반적으로 더 높은 수준의 것이 좋습니다.


0

내가 지금 가지고있는 방법은 싱글 톤 객체를 사용하는 것이 었습니다. 클래스에 액세스해야 할 때 싱글 톤에 대한 포인터를 검색 할 수있었습니다.

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    InputManager * in_manager = InputManager::get_instance();
    in_manager->handle_key_press( params)
}

그런 식 으로요

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.