2017-05-30 39 views
6

我已经按照此教程在这里:https://cartoonsmart.com/how-to-support-external-game-controllers-with-swift-2-and-sprite-kit-for-the-new-apple-tv/连接外部游戏控制器到苹果电视的精灵套件,但我无法做到与教程代码。我没有收到任何错误消息,但它根本不起作用。这里是我的代码:如何连接到外部游戏控制器在迅速 - 苹果电视

func setUpControllerObservers() { 
    NotificationCenter.default.addObserver(self, selector: #selector(connectControllers), name: NSNotification.Name.GCControllerDidConnect, object: nil) 
    NotificationCenter.default.addObserver(self, selector: #selector(disconnectController), name: NSNotification.Name.GCControllerDidDisconnect, object: nil) 
} 

func connectControllers() { 
    var count = 0 
    for controller in GCController.controllers() { 
     count = count + 1 
     print(count) 
     print(controller.extendedGamepad != nil) 
     print(controller.microGamepad != nil) 
     print(controller.gamepad != nil) 
     if (controller.extendedGamepad != nil && controller.playerIndex == .indexUnset) { 
      if (count == 1) { 
       controller.playerIndex = .index1 
      } 
      else if (count == 2) { 
       controller.playerIndex = .index2 
      } 
      else if (count == 3) { 
       controller.playerIndex = .index3 
      } 
      else if (count == 4) { 
       controller.playerIndex = .index4 
      } 
      controller.extendedGamepad?.valueChangedHandler = nil 
      setupExtendedController(controller: controller) 
     } 
    } 
} 

func disconnectController() { 

} 

func setupExtendedController(controller: GCController) { 
    controller.extendedGamepad?.valueChangedHandler = { (gamepad: GCExtendedGamepad, element: GCControllerElement) in 
     // not calling 
    } 
} 

调试时,我发现GCController.controllers()数组是空的,即使它连接到苹果电视。为了更加确定,我甚至在应用商店的应用程序上测试了控制器,这些应用程序运行良好。任何人都可以帮忙吗?

编辑:这里是我的didMove功能:

didMove(to view: SKView) { 
    setUpControllerObservers() 
    connectControllers() 
} 

回答

3

何时从哪个类被称为你的setUpControllerObservers功能?我们需要更多的背景来帮助你。

无论如何,请确保您至少自己手动调用您的connectControllers函数。你不能完全依靠传入的通知来为你调用该函数。他们提到这已经链接教程:

注意过,我们之后 setUpControllerObservers调用connectControllers自己。第一次运行应用程序时, setUpControllerObserver会导致我们的NSNotification也调用 connectControllers,但是如果我们要在我们的 GameScene和其他类之间来回切换,我们不能再依靠connectControllers从 调用通知。这就是我们自己称之为的原因。

你也应该确保你不会调用这些函数之前您的应用程序已完成启动(例如早在AppDelegate):

调用控制器类方法为所有连接的控制器检索一组GCController对象 。 [...]如果没有 连接的控制器,或者您的在您的应用程序启动时调用此方法,则该阵列将为空


编辑:

为了进行调试,可以尝试使用startWirelessControllerDiscovery(completionHandler:)功能 '发现' 的控制? (发现无线控制器Game Controller Programming Guide:发现无线控制器)

+0

我编辑我的问题,它从didMove函数调用,我didmove查看功能现在在问题中给出 – Rishi

+0

谢谢。你可以尝试“发现”控制器吗?见上面的编辑。 – Kymer