pygame:检测操纵杆断开连接,并等待它重新连接
Posted
技术标签:
【中文标题】pygame:检测操纵杆断开连接,并等待它重新连接【英文标题】:pygame: detect Joystick disconnect, and wait for it to be reconnected 【发布时间】:2013-04-04 04:57:37 【问题描述】:我正在使用pygame.joystick.Joystick
对象并希望能够打印一条消息,要求用户在拔下 USB 游戏杆后重新连接它。
现在我有(大致):
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()
但它没有正确重新连接,我知道它到底在做什么,但这绝对是错误的。这方面的任何方向都会有所帮助
【问题讨论】:
请不要告诉我你这样做是因为你的操纵杆坏了一半。 @LtWorf 不哈哈,我正在制作完全由操纵杆控制的东西,因此当有人暂时拔掉它时,程序能够继续运行会很有用。 我认为您在这里不走运,因为pygame基于SDL,而SDL不支持动态连接和断开操纵杆。但我听说未来版本的 SDL 应该支持这个... @RyanHaining 我的回答有用吗?! @Noelkd 最近几天(决赛周)我还没有回到我的系统,但我很快就会尝试。我想我已经尝试过这样的事情,并且在操纵杆模块上执行 quit() 和 init() 会导致一些不良影响 【参考方案1】:不得不启动旧的 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
因此,如果您在主循环中运行此函数,它会继续运行,直到重新获得操纵杆连接。它适用于我发现的小测试代码:
http://programarcadegames.com/python_examples/show_file.php?file=joystick_calls.py
还发现:
http://demolishun.net/?p=21
我从哪里偷来的想法,他没有任何蹩脚的代码示例
最后,因为您应该经常查看文档:
http://www.pygame.org/docs/ref/joystick.html
【讨论】:
一开始我有这样的东西,但它不起作用,因为它会丢失所有quit
ing 和init
ing 的游戏手柄动作。这最初用于检查控制器是否已插入,但不能在运行时有效检查
在运行时在我的代码中工作,我的意思是在评论中链接的示例中,我可以取消和侦察,并且我的 xbox pad 上的所有按钮和 do-dads 都可以在显示器上工作?你怎么了?重启后某些按钮不起作用或只是奇怪的行为? (你的决赛怎么样?)
这可能只是我设置其他所有东西的方式,或者我的控制器。我在我的轴上得到 0,并且一遍又一遍地按下所有按钮。决赛很顺利,顺便说一句哈哈谢谢
我要再看看这个,然后当我有时间时,你在 github 上找到了你正在处理的代码?【参考方案2】:
我设法让我的工作与 Noelkd 的建议合作,但我遇到了 Ryan Haining 描述的类似问题
一开始我有这样的东西,但它不起作用,因为它在所有退出和初始化时都无法跟踪游戏手柄的动作。这最初用于检查控制器是否已插入,但不能在运行时有效检查
我也有这个问题。我认为你是对的,经常调用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!
【讨论】:
以上是关于pygame:检测操纵杆断开连接,并等待它重新连接的主要内容,如果未能解决你的问题,请参考以下文章