使用 PySDL2 捕获操纵杆事件



我正在使用用于python的新(ish)SDL2包装器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 2.7.5上运行python 10.9。我尝试了罗技 USB 游戏手柄和 Xbox 360 有线游戏手柄(通过 tattiebogle.net 驱动程序启用)。上面我讨论了轴事件,因为这是我所需要的,但我已经检查过,没有一个操纵杆事件发布到事件队列。

事实证明,从源代码构建 SDL2(2.0-1;通过 PySDL2-0.7.0 访问)会产生一个构建,其中操纵杆事件发布到事件队列(尽管您确实需要创建一个窗口)。似乎问题出在我使用的 SDL2 的 mac 框架版本(从这里开始)。

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)

相关内容

  • 没有找到相关文章

最新更新