Как мне подключиться к внешнему игровому контроллеру в swift - apple tv

Я следовал этому руководству здесь: https://cartoonsmart.com/how-to-support-external-game-controllers-with-swift-2-and-sprite-kit-for-the-new-apple-tv/ чтобы подключить внешний игровой контроллер к 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 ответ

Решение

Когда и из какого класса ваш setUpControllerObservers функция называется? Нам нужно больше контекста, чтобы помочь вам.

В любом случае, убедитесь, что вы вручную звоните connectControllers по крайней мере один раз работай сам. Вы не можете полагаться только на входящее уведомление, чтобы вызвать эту функцию для вас. Они упоминают это в уроке, который вы связали:

Также обратите внимание, что мы вызываем connectControllers сразу после setUpControllerObservers. При первом запуске приложения setUpControllerObservers заставит наше NSNotification также вызывать connectControllers, но если мы будем переходить назад и вперед между нашим GameScene и другим классом, мы не можем полагаться на повторный вызов connectControllers из уведомления. Вот почему мы называем это сами.

  • Из вашего связанного учебника на CartoonSmart

Вы также должны убедиться, что вы не вызываете эти функции до того, как ваше приложение завершит запуск (например, в начале AppDelegate):

Вызовите метод класса контроллеров, чтобы получить массив объектов GCController для всех подключенных контроллеров. [...] Если подключенных контроллеров нет или вы вызываете этот метод во время запуска вашего приложения, массив будет пустым.


Редактировать:

В целях отладки, не могли бы вы попытаться "обнаружить" контроллер с помощью startWirelessControllerDiscovery(completionHandler:) функционировать? (описано в Руководстве по программированию игровых контроллеров: Обнаружение беспроводных контроллеров)

Другие вопросы по тегам