我已成功连接钢系列Nimbus双模拟控制器,用于在我的iOS和tvOS应用程序中进行测试。但我不确定如何正确设置valueChangeHandler
属性的GCController
部分。
到目前为止,我了解到microGamepad
,gamepad
和extendedGamepad
类控制器以及它们之间的差异。我也了解您可以检查连接到设备的控制器上是否有相应的控制器类。
但是现在我在设置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...
,那么这些方法将起作用,而gamepad
和microGamepad
方法则不会。
任何人都知道如何解决这个问题?
答案 0 :(得分:3)
您可以测试哪个配置文件可用,并根据配置文件设置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
}
}