Python pygame:检测操纵杆断开,并等待重新连接

Python pygame:检测操纵杆断开,并等待重新连接,python,pygame,joystick,gamepad,Python,Pygame,Joystick,Gamepad,我正在使用一个pygame.mogage.mogage对象,希望能够打印一条消息,要求用户在拔下usb操纵杆后重新连接它 现在我(大致)有: 但它没有正确地重新连接,idk它到底在做什么,但它肯定是错的。这方面的任何指导都会很有帮助必须启动旧的xbox pad,但我做了一个功能,可以检查连接是否断开,并且似乎工作正常: discon = False def check_pad(): global discon pygame.joystick.quit() pygame.j

我正在使用一个
pygame.mogage.mogage
对象,希望能够打印一条消息,要求用户在拔下usb操纵杆后重新连接它

现在我(大致)有:


但它没有正确地重新连接,idk它到底在做什么,但它肯定是错的。这方面的任何指导都会很有帮助

必须启动旧的xbox pad,但我做了一个功能,可以检查连接是否断开,并且似乎工作正常:

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
所以,如果你在主循环中运行这个函数,它会一直运行,直到它恢复操纵杆连接。它适用于我发现的小测试代码:

还发现:

在我从他那里偷来这个想法的地方,他没有任何蹩脚的代码示例

最后,因为您应该始终检查文档:


我成功地按照诺埃尔克的建议工作,但我遇到了瑞安·海宁所描述的类似问题


起初我有类似的东西,但它不起作用,因为它失去了所有退出和启动的游戏板的行动轨道。这一功能最初用于检查控制器是否已插入,但在运行时无法有效检查

我也有这个问题。我想你是对的,太频繁地呼叫
退出
并没有给键盘足够的时间重新初始化-至少在我的电脑上是这样。我发现如果你把通话时间限制在每秒钟,它就会起作用

但是,它可能会导致播放器输入暂时断开,因此对
操纵杆的任何调用都不会起作用

如果您检测到有一段时间(比如5秒或其他时间)没有输入,最好只运行此代码。这样,您就不会在用户实际使用设备时退出

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
用法


请不要告诉我你这样做是因为你的游戏杆坏了一半。@LtWorf不,哈哈,我正在制作一个完全由游戏杆控制的东西,这样当有人暂时拔下它时,程序能够继续运行会很有用。我想你在这里运气不好,因为pygame是基于SDL的,SDL不支持动态连接和断开操纵手柄。但我听说SDL的未来版本应该支持这个…@RyanHaining我的答案有用吗@Noelkd我在过去几天(期末考试周)没有回到我的系统,但我很快就会尝试。我想我已经尝试过类似的方法,然后在操纵杆模块上执行quit()和init(),导致了一些不理想的效果。起初我有过类似的方法,但它不起作用,因为它在所有的
quit
ing和
init
ing过程中都无法跟踪Gamepad动作。这一功能最初是为了检查控制器是否已插入,但不是为了在运行时进行有效检查,而是在运行时在我的代码中起作用,我的意思是在注释中链接的示例中,我可以discon和RESCON以及xbox pad上的所有按钮和DAD在显示器上工作吗?你的怎么样了?一些按钮在重启后不工作,或者只是奇怪的行为?(你期末考考得怎么样?)可能是我安排其他一切的方式,或者是我的控制器。我在我的轴上得到0,所有的按钮都没有按下。总决赛进行得很顺利,顺便说一句,哈哈,谢谢。等我有时间的时候,我会再看一看,你有在github上工作的代码吗?
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!