5

我正在使用一个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()

但它没有正确重新连接,不知道它到底在做什么,但这绝对是错误的。这方面的任何方向都会有所帮助

4

2 回答 2

2

不得不启动旧的 xbox 垫,但我做了一个检查断开连接的功能,似乎工作正常:

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

于 2013-05-12T17:12:37.490 回答
2

我设法让我的工作与 Noelkd 的建议一起工作,但我遇到了 Ryan Haining 描述的类似问题

起初我有类似的东西,但它不起作用,因为它在所有退出和初始化时都失去了对游戏手柄动作的跟踪。这最初用于检查控制器是否已插入,但不能在运行时有效检查

我也有这个问题。我认为你是对的,调用quit太频繁并没有给键盘足够的时间来重新初始化——至少在我的电脑上是这样。我发现如果您将呼叫限制为每秒,它会起作用。

它可能会导致玩家输入暂时断开连接,因此任何对 a 的调用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!
于 2017-04-02T20:20:39.693 回答