tutorial programas para juegos hechos games español codigos codigo arcade python pygame joystick gamepad

python - programas - pygame: detecta la desconexión de Joystick y espera a que se vuelva a conectar



pygame español (2)

Estoy usando un objeto pygame.joystick.Joystick y quiero poder imprimir un mensaje pidiéndole al usuario que vuelva a conectar un joystick usb una vez que lo desenchufe.

ahora tengo (más o menos):

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()

pero no se reconecta correctamente, no sé exactamente qué está haciendo, pero definitivamente está mal. Cualquier dirección en esto sería útil


Tuve que encender el viejo panel de Xbox pero hice una función que busca desconexiones y parece funcionar bien:

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

Entonces, si ejecuta esta función en su bucle principal, seguirá ejecutándose hasta que recupere la conexión de la palanca de mando. Funciona para el pequeño código de prueba que encontré:

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

También se encontró:

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

De donde robé la idea, él no tenía ningún ejemplo de código que fuera cojo

Y, por último, porque siempre debes verificar los documentos:

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


Logré que el mío funcionara con la sugerencia de Noelkd, pero tuve un problema similar descrito por Ryan Haining

Al principio tuve algo como esto, pero no funciona porque pierde la pista de las acciones de los gamepads con todos los gestos de invocación e initing. Esto funciona inicialmente para verificar si un controlador está enchufado, pero no para verificar de manera efectiva mientras se ejecuta

Tuve este problema también. Creo que está en lo cierto, llamar para quit demasiada frecuencia no le da a la libreta el tiempo suficiente para reiniciarse, al menos en mi computadora. Descubrí que si limita las llamadas a cada segundo, funciona.

Sin embargo, puede provocar que la entrada del reproductor se desconecte temporalmente, por lo que cualquier llamada a un joystick no funcionará.

Es mejor ejecutar este código solo si detecta que no ha habido entrada por un tiempo (digamos 5 segundos o algo así). De esta manera no se cerrará mientras un usuario esté realmente usando el dispositivo

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

Uso

# ... 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!