Перехват событий джойстика с помощью PySDL2

Я играю с новой оболочкой SDL2 для python, 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]

Это распечатывает все случаи нажатия клавиши, но никогда не события движения оси. Напротив, вот мой код для явного опроса состояния оси:

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)

Это прекрасно работает, но я не хочу тратить время на опрос состояния, если оно не меняется, поэтому я бы предпочел метод очереди событий, если бы я мог заставить его работать. Какие-либо предложения?

Если это имеет значение, я использую python 2.7.5 на Mac OS 10.9. Я пробовал как геймпад logitech usb, так и проводной геймпад xbox 360 (включенный через драйверы tattiebogle.net). Выше я обсуждаю события оси, потому что это то, что мне нужно, но я проверил, и ни одно из событий джойстика не отправляется в очередь событий.


person Mike Lawrence    schedule 30.10.2013    source источник
comment
Извините, но я не могу повторить это. Во-первых, с кодом, который у вас есть, вы не получите никакого вывода, потому что вы на самом деле не открыли окно. Ты просто забыл об этом? Что произойдет, если вы действительно откроете окно (используя SDL_CreateWindow(...))? Я точно использовал ваш код (кроме открытого окна), и все работает нормально. Я получаю события оси для печати. Какой тип джойстика вы используете? Вы пытались создать SDL с включенными DEBUG_JOYSTICK и DEBUG_INPUT_EVENTS?   -  person Mark Hildreth    schedule 01.11.2013
comment
Интересный. Код действительно выводит вывод без окна, и добавление окна (через window = sdl2.ext.Window("test", size=(800,600),position=(0,0),flags=sdl2.SDL_WINDOW_SHOWN); window.refresh()) не меняет поведение, описанное выше. Я не компилировал SDL2 сам, а просто установил mac framework. Я попробую взять исходный код и собрать отладки, как вы предлагаете.   -  person Mike Lawrence    schedule 01.11.2013
comment
На самом деле, хотя я знаком с ./configure; make; sudo make install, я не уверен, как добавить флаги отладки...   -  person Mike Lawrence    schedule 01.11.2013
comment
Вы должны иметь возможность определить их в переменной окружения CFLAGS.   -  person Mark Hildreth    schedule 01.11.2013
comment
@MarkHildreth Оказывается, все работает нормально, если я соберу SDL2 из исходного кода, а не использую предустановленную среду Mac. Хотите опубликовать ответ, чтобы получить признание за вашу помощь?   -  person Mike Lawrence    schedule 01.11.2013
comment
Давай, опубликуй ответ сам. Не забудьте указать номера версий, которые вы использовали.   -  person Mark Hildreth    schedule 01.11.2013


Ответы (1)


Оказывается, сборка SDL2 (2.0-1; доступ через PySDL2-0.7.0) из исходного кода дает сборку, для которой события джойстика делают отправку в очередь событий (хотя вам нужно создать окно ). Похоже, проблема связана с версией SDL2 для Mac (см. здесь). использовал.

person Mike Lawrence    schedule 01.11.2013