мне удалось получить мое работы с предложением 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!
Пожалуйста, не говорите мне, что вы делаете это потому, что ваш джойстик наполовину сломан. – LtWorf
@LtWorf no haha, я делаю что-то полностью управляемое джойстиком, поэтому было бы полезно, чтобы программа могла продолжить, когда кто-то временно отключает ее. –
Вам не повезло с этим, я думаю, поскольку pygame основан на SDL, а SDL не поддерживает динамическое соединение и разъединение джойстиков. Но я слышал слухи, что будущие версии SDL должны поддерживать это ... – sloth