我已经成功连接了钢系列的Nimbus双模拟控制器,可以在我的iOS和tvOS应用程序中进行测试。但是我不确定如何正确设置valueChangeHandler属性的GCController部分。

到目前为止,我了解控制器的microGamepadgamepadextendedGamepad类以及它们之间的区别。我也了解您可以检查连接到设备的控制器上是否有相应的控制器类。

但是现在我在设置valueChangeHandler时遇到了麻烦,因为如果我像这样设置三个valueChangeHandler部分,那么只有有效的valueChangeHandler是按此顺序加载的最后一个:

self.gameController = GCController.controllers()[0]

self.gameController.extendedGamepad?.valueChangedHandler = { (gamepad, element) -> Void in
    if element == self.gameController.extendedGamepad?.leftThumbstick {
        //Never gets called
    }
}

self.gameController.gamepad?.valueChangedHandler = { (gamepad, element) -> Void in
    if element == self.gameController.gamepad?.dpad {
        //Never gets called
    }
}

self.gameController.microGamepad?.valueChangedHandler = { (gamepad, element) -> Void in
    if element == self.gameController.microGamepad?.dpad {
        //Gets called
    }
}

如果我切换它们并最后调用self.gameController.extendedGamepad.valueChangeHandler...,则这些方法将起作用,而gamepadmicroGamepad方法将无效。

有人知道怎么修这个东西吗?

最佳答案

您测试哪个配置文件可用,并根据配置文件设置valueChangedHandler。

重要的是要认识到ExtendedGamepad包含的功能最多,而microGamepad的功能最少(我认为microGamepad仅用于AppleTV遥控器)。因此,检查的顺序应不同。 ExtendedGamepad具有microGamepad的所有功能以及其他控件,因此在您的代码中,该方法将始终输入microGamepad配置文件。

Apple在DemoBots示例项目中使用以下代码:

private func registerMovementEvents() {
    /// An analog movement handler for D-pads and movement thumbsticks.
    let movementHandler: GCControllerDirectionPadValueChangedHandler = { [unowned self] _, xValue, yValue in
        // Code to handle movement here ...
    }

    #if os(tvOS)
    // `GCMicroGamepad` D-pad handler.
    if let microGamepad = gameController.microGamepad {
        // Allow the gamepad to handle transposing D-pad values when rotating the controller.
        microGamepad.allowsRotation = true
        microGamepad.dpad.valueChangedHandler = movementHandler
    }
    #endif

    // `GCGamepad` D-pad handler.
    // Will never enter here in case of AppleTV remote as the AppleTV remote is a microGamepad
    if let gamepad = gameController.gamepad {
        gamepad.dpad.valueChangedHandler = movementHandler
    }

    // `GCExtendedGamepad` left thumbstick.
    if let extendedGamepad = gameController.extendedGamepad {
        extendedGamepad.leftThumbstick.valueChangedHandler = movementHandler
    }
}

关于ios - 如何在Xcode中正确设置GCController valueChangeHandler?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35446369/

10-13 21:39