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ó:
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:
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!