我正在使用python的新(ish)SDL2包装器PySDL2,我似乎无法看到事件队列中弹出任何操纵杆事件。 Keydown事件很好,当我明确地轮询操纵杆时,我可以使轴状态变好(并观察它随着我移动轴而改变,如预期的那样)。这是我使用队列的代码:
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]
这将打印出所有keydown事件,但不会打印任何轴运动事件。相比之下,这是我的代码显式轮询轴状态:
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驱动程序启用)。上面我讨论了轴事件,因为这是我需要的,但我已经检查过,并且没有一个操纵杆事件发布到事件队列。
答案 0 :(得分:3)
事实证明,从源代码构建SDL2(2.0-1;通过PySDL2-0.7.0访问)会产生一个构建,其中操纵杆事件执行发布到事件队列中(尽管您需要创建一个窗口)。似乎问题在于我使用的SDL2的mac框架版本(来自here)。
答案 1 :(得分:0)
import ctypes
import time
from sdl2 import *
class Joystick:
def __init__(self):
SDL_Init(SDL_INIT_JOYSTICK)
self.axis = {}
self.button = {}
def update(self):
event = SDL_Event()
while SDL_PollEvent(ctypes.byref(event)) != 0:
if event.type == SDL_JOYDEVICEADDED:
self.device = SDL_JoystickOpen(event.jdevice.which)
elif event.type == SDL_JOYAXISMOTION:
self.axis[event.jaxis.axis] = event.jaxis.value
elif event.type == SDL_JOYBUTTONDOWN:
self.button[event.jbutton.button] = True
elif event.type == SDL_JOYBUTTONUP:
self.button[event.jbutton.button] = False
if __name__ == "__main__":
joystick = Joystick()
while True:
joystick.update()
time.sleep(0.1)
print(joystick.axis)
print(joystick.button)