问题描述
我正在使用基于SDL2事件的操纵杆API来获取模拟操纵杆轴的位置,并且大多数情况下效果良好。
但是,在软件启动时,SDL2无法可靠地传递这些位置。即使在使用SDL_UpdateJoystick()
强制生成轴事件时,相应的事件也会报告默认位置(0),而不是反映所连接杆的实际物理位置的值。
除了调用SDL_UpdateJoystick()
之外,我还尝试在初始化之前设置SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
提示,以及调用SDL_GetJoystickGetAxis()
。进入后一个函数的源代码,我发现它并没有主动查询轴的位置,而是报告了存储的值。
通过实验,我终于想到了一个丑陋的骇客,似乎可以“欺骗”:
// My joystick axis querying function
SDL_JoystickUpdate();
for (auto i = 0U; i < 100; i ++) {
SDL_Delay(1);
SDL_PumpEvents();
}
return SDL_JoystickGetAxis((SDL_Joystick*)handle,axis);
我不知道为什么这样做还是幕后发生了什么。非常感谢您提供更好的解决方案。
UPDATE 2020-09-03:我仍然没有更好的解决方案,但是我尝试了SDL的源代码,特别是SDL_DINPUT_JoystickUpdate()
中的功能SDL_dinputjoystick.c
。如果我在IDirectInputDevice8_Poll()
和对UpdateDINPUTJoystickState_Buffered()
的调用之间注入了50ms的人为延迟,这反过来又调用IDirectInputDevice8_GetDeviceData()
来收集数据,那么我得到了正确的值。 (不幸的是,这不能用作解决方案,因为SDL_DINPUT_JoystickUpdate()
一直在被调用。)这似乎表明在调用Poll()
和数据可用之间存在延迟。
UPDATE 2020-09-03#2:我已经向SDL的Bugzilla提交了一个暂定(不太令人满意)patch proposal。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)