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

【讨论】:

一开始我有这样的东西,但它不起作用,因为它会丢失所有quiting 和initing 的游戏手柄动作。这最初用于检查控制器是否已插入,但不能在运行时有效检查 在运行时在我的代码中工作,我的意思是在评论中链接的示例中,我可以取消和侦察,并且我的 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:检测操纵杆断开连接,并等待它重新连接的主要内容,如果未能解决你的问题,请参考以下文章

TCP协议及TCP正常连接与断开

如何检测Socket IO中的重新连接事件

如何检测 socket.io 上的断开连接?

如何用C语言检测网络是不是连接上、已连接、已断开状态

如何检测和删除扭曲的死TCP连接?

Android InputStream Internet 断开连接