我正在使用新的SDL2 Python封装库PySDL2,与手柄事件有关的事件似乎未能显示在事件队列中。按键事件没有问题,当我显式地轮询手柄时,可以正常获取轴状态(并观察到随着移动轴而相应改变)。以下是使用队列的代码:
import sdl2
import sdl2.ext
sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
sdl2.SDL_Init(sdl2.SDL_INIT_JOYSTICK)
joystick = sdl2.SDL_JoystickOpen(0)
sdl2.ext.Window("test", size=(800,600),position=(0,0),flags=sdl2.SDL_WINDOW_SHOWN)
window.refresh())
while True:
for event in sdl2.ext.get_events():
if event.type==sdl2.SDL_KEYDOWN:
print sdl2.SDL_GetKeyName(event.key.keysym.sym).lower()
elif event.type==sdl2.SDL_JOYAXISMOTION:
print [event.jaxis.axis,event.jaxis.value]
这段代码会将所有的按键事件打印出来,但是不会打印任何轴向运动事件。相比之下,下面是我用来显式轮询轴状态的代码:
import sdl2
import sdl2.ext
sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
sdl2.SDL_Init(sdl2.SDL_INIT_JOYSTICK)
joystick = sdl2.SDL_JoystickOpen(0)
while True:
sdl2.SDL_PumpEvents()
print sdl2.SDL_JoystickGetAxis(joystick,0)
这个方法能够很好地工作,但如果状态没有改变,我不想浪费时间轮询状态,所以我更喜欢使用事件队列方法。有什么建议吗?
如果有影响的话,我正在Mac OS 10.9上运行Python 2.7.5。我尝试过罗技USB游戏手柄和Xbox 360有线游戏手柄(通过tattiebogle.net驱动程序启用)。上面我谈论了轴事件,因为那正是我需要的,但我已经检查过,没有一个游戏手柄事件会发布到事件队列中。
SDL_CreateWindow(...)
),会发生什么?我已经完全使用了您的代码(除了打开一个窗口),一切正常。我可以打印出轴事件。您使用的是什么类型的游戏手柄?您是否尝试启用DEBUG_JOYSTICK和DEBUG_INPUT_EVENTS来构建SDL? - Mark Hildrethwindow = sdl2.ext.Window("test", size=(800,600),position=(0,0),flags=sdl2.SDL_WINDOW_SHOWN); window.refresh()
)不会改变上述报告的行为。我没有自己编译SDL2,而是简单地安装了Mac框架。我将尝试按照您的建议获取源代码并进行调试构建。 - Mike LawrenceCFLAGS
中定义它们。 - Mark Hildreth