如何在swift中连接外部游戏控制器 - 苹果电视

时间:2017-05-30 09:15:17

标签: swift apple-tv gamecontroller

我在这里遵循了这个教程:https://cartoonsmart.com/how-to-support-external-game-controllers-with-swift-2-and-sprite-kit-for-the-new-apple-tv/将外部游戏控制器连接到sprite工具包中的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()数组为空,即使它连接到apple tv。为了更加确定,我甚至在应用程序商店的应用程序上测试了控制器,该工具运行良好。有人可以帮忙吗?

编辑:这是我的didMove函数:

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

1 个答案:

答案 0 :(得分:3)

您的setUpControllerObservers函数何时以及从哪个类调用?我们需要一些更多的背景来帮助你。

无论如何,请确保至少自己手动调用connectControllers功能一次。您不能完全依赖传入的通知来为您调用该功能。他们在您链接的教程中提到了这一点:

  

请注意,我们正在调用connectControllers   setUpControllerObservers。应用程序第一次运行时   setUpControllerObservers将导致我们的NSNotification也调用   connectControllers,但如果我们要在我们之间来回走动   GameScene和其他类一样,我们不能依赖connectControllers获取   从通知再次打电话。这就是为什么我们自己称呼它。

您还应确保在应用完成发布之前不要调用这些功能(例如AppDelegate的早期版本):

  

调用controllers类方法以检索GCController对象的数组   对于所有连接的控制器[...]如果没有   连接的控制器或你在你的应用程序时调用此方法   启动时,数组将为空

修改

出于调试目的,您可以尝试发现'控制器使用startWirelessControllerDiscovery(completionHandler:)功能? (在Game Controller Programming Guide:发现无线控制器中描述)