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!