2015-05-12 1 views
1

В ОС X мои геймпады распознаются правильно в SDL_PollEvent() при запуске приложения. Однако, когда я пытаюсь подключить новые геймпады или удалять старые геймпады, SDL_PollEvent() не запускает ни SDL_CONTROLLERDEVICEADDED, ни SDL_CONTROLLERDEVICEREMOVED. Один и тот же код работает правильно в Windows, когда у меня есть горячие контроллеры игр.Глянцевый геймпад не работает

Более интересным является то, что если изменить размер окна приложения, то горячее подключение будет работать. После события изменения размера все события горячего подключения запускаются. Похоже, что события геймпада помещаются в какую-то очередь ожидания, которая очищается, когда происходит событие изменения размера. Мой код SDL_PollEvent() довольно стандартный, как показано ниже.

case SDL_CONTROLLERDEVICEADDED: 
     if (SDL_IsGameController(e.cdevice.which)) 
     { 
      SDL_GameController *pad = SDL_GameControllerOpen(e.cdevice.which); 

      if (pad) 
      { 
       SDL_Joystick *joy = SDL_GameControllerGetJoystick(pad); 
       int instanceID = SDL_JoystickInstanceID(joy); 
       if(m_gameControllers.count(instanceID) == 0) 
       { 
        m_gameControllers.insert(std::make_pair(instanceID, pad)); 
       } 
      } 
     } 
    break; 

    case SDL_CONTROLLERDEVICEREMOVED: 
    { 
     auto it = m_gameControllers.find(e.cdevice.which); 
     if (it != m_gameControllers.end()) 
     { 
      SDL_GameController* pad = m_gameControllers[e.cdevice.which]; 
      SDL_GameControllerClose(pad); 
      m_gameControllers.erase(it); 
     } 
    } 
    break; 

Неужели кто-нибудь еще испытал это?

ответ

2

После некоторого бою я нашел решение: Позвоните SDL_PollEvent() из основного потока. Первоначально я назвал метод обработки геймпада из потока CVDisplayLink, который привел к описанному поведению.

В моем случае решение было просто добавить dispatch_async вызов моей функции обработки геймпадала.

dispatch_async(dispatch_get_main_queue(),^ { handleGamePad();}); 
+1

Нитки являются корнем всего зла. – Zammalad

Смежные вопросы