首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gamepad热插拔不工作

Gamepad热插拔不工作
EN

Stack Overflow用户
提问于 2015-05-12 15:37:31
回答 1查看 477关注 0票数 1

在OS中,我的游戏垫在应用程序启动时在SDL_PollEvent()中被正确识别。然而,当我尝试热插拔新的游戏垫或删除旧的游戏垫时,SDL_PollEvent()不会触发SDL_CONTROLLERDEVICEADDEDSDL_CONTROLLERDEVICEREMOVED。当我热插拔游戏控制器时,相同的代码在Windows中正确工作。

更有趣的是,如果我调整应用程序窗口的大小,热插拔就能工作。调整大小事件后,将触发所有热插拔事件。几乎可以看出,游戏垫事件被放置在某种等待队列中,当发生调整大小的事件时,该队列将被清除。我的SDL_PollEvent()代码非常标准,如下所示。

代码语言:javascript
复制
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;

还有其他人经历过吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-13 09:38:54

经过一些挣扎之后,我找到了解决方案:从主线程调用SDL_PollEvent()。最初,我从CVDisplayLink线程调用游戏垫处理方法,这导致了所描述的行为。

在我的例子中,解决方案只是将dispatch_async调用添加到我的游戏垫处理函数中。

代码语言:javascript
复制
dispatch_async(dispatch_get_main_queue(),^ { handleGamePad();});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30195528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档