2013-04-04 4 views
4

Я использую объект pygame.joystick.Joystick и хочу иметь возможность распечатать сообщение с просьбой повторно подключить джойстик USB после его отсоединения.pygame: обнаружение разъединения джойстика и ожидание его повторного подключения

прямо сейчас у меня есть (примерно):

js = pygame.joystick.Joystick(0) 
#... some game code and stuff 
pygame.joystick.quit() 
pygame.joystick.init() 
while pygame.joystick.get_count() == 0: 
    print 'please reconnect joystick' 
    pygame.joystick.quit() 
    pygame.joystick.init() 

js = pygame.joystick.Joystick(0) 
js.init() 

но не восстановить должным образом, ИДК, что именно он делает, но это определенно не так. Любое направление на это было бы полезно

+0

Пожалуйста, не говорите мне, что вы делаете это потому, что ваш джойстик наполовину сломан. – LtWorf

+0

@LtWorf no haha, я делаю что-то полностью управляемое джойстиком, поэтому было бы полезно, чтобы программа могла продолжить, когда кто-то временно отключает ее. –

+0

Вам не повезло с этим, я думаю, поскольку pygame основан на SDL, а SDL не поддерживает динамическое соединение и разъединение джойстиков. Но я слышал слухи, что будущие версии SDL должны поддерживать это ... – sloth

ответ

1

Пришлось запустить старую XBOX площадку, но я сделал функцию, которая проверяет отключениях и, кажется, работает нормально:

discon = False 
def check_pad(): 
    global discon 
    pygame.joystick.quit() 
    pygame.joystick.init() 
    joystick_count = pygame.joystick.get_count() 
    for i in range(joystick_count): 
     joystick = pygame.joystick.Joystick(i) 
     joystick.init() 
    if not joystick_count: 
     if not discon: 
      print "reconnect you meat bag" 
      discon = True 
     clock.tick(20) 
     check_pad() 
    else: 
     discon = False 

Так что, если вы запустите эту функцию в главном он будет продолжать работать, пока не получит соединение с джойстиком. Он работает для маленького тестового кода я нашел:

http://programarcadegames.com/python_examples/show_file.php?file=joystick_calls.py

Также найдено:

http://demolishun.net/?p=21

Где я украл идею у, у него не было никаких примеров кода, который был хромым

И, наконец, поскольку вы всегда должны проверять документы:

http://www.pygame.org/docs/ref/joystick.html

+0

Сначала у меня было что-то вроде этого, но оно не работает, потому что оно теряет следы действий игровых приставок со всеми «quit'ing» и «init». Сначала это работает, чтобы проверить, подключен ли контроллер вообще, но не эффективно проверять во время работы –

+0

во время работы в моем коде, тем самым я имею в виду в примере, связанном с комментарием, который я могу отключить и повторно заново, и все кнопки и do-dads на моей панели xbox работают на дисплеях? Что происходит с твоим? некоторые кнопки не работают после перезапуска или просто странного поведения? (как вы закончили?) – Noelkd

+1

это может быть так, как у меня есть все остальное, или мой контроллер. Я получаю 0 на мои оси и не нажал на все кнопки снова и снова. финал пошел хорошо btw haha ​​спасибо –

0

мне удалось получить мое работы с предложением Noelkd, но у меня была аналогичная проблема, описанный Ryan хейнинг

У меня было что-то вроде этого на первый, но он не работает, потому что она теряет след действий геймпадов со всеми quiting и initing. Первоначально это работает, чтобы проверить, подключен ли контроллер вообще, но не для эффективного контроля во время работы

У меня тоже была эта проблема. Я думаю, что вы правы, слишком часто звонящий quit не дает подушке достаточно времени для повторной инициализации - по крайней мере, на моем компьютере. Я обнаружил, что если вы ограничиваете количество звонков каждую секунду, это работает.

Это может привести к тому, что проигрыватель будет временно отключен, поэтому любые вызовы на joystick не будут работать.

Лучше всего запустить этот код только в том случае, если вы обнаружите, что на какое-то время не было ввода (скажем, 5 секунд или что-то еще). Таким образом, вы не quit, пока пользователь на самом деле с помощью устройства

import pygame 
import time 

INACTIVITY_RECONNECT_TIME = 5 
RECONNECT_TIMEOUT = 1 

class ControllerInput(): 
    def __init__(self): 
    pygame.joystick.init() 
    self.lastTime = 0 
    self.lastActive = 0 

    def getButtons(self, joystickId): 
    joystick = pygame.joystick.Joystick(joystickId) 
    joystick.init() 

    buttons = {} 

    for i in range(joystick.get_numbuttons()): 
     buttons[i] = joystick.get_button(i) 
     if buttons[i]: 
     self.lastActive = time.time() 

    return buttons 

    def hasController(self): 
    now = time.time() 
    if now - self.lastActive > INACTIVITY_RECONNECT_TIME and now - self.lastTime > RECONNECT_TIMEOUT: 
     self.lastTime = now 
     pygame.joystick.quit() 
     pygame.joystick.init() 

    return pygame.joystick.get_count() > 0 

Использование

# ... some constructor 
controller = ControllerInput() 

# ... game loop 
if not controller.hasController(): 
    # handle disconnect 
    print('reconnect') 
    return 

buttons = controller.getButtons(0) 

if buttons[0]: 
    # buttons[0] was pressed!