我一直在修补 Swift Playgrounds 来学习 Swift 和 SpriteKit。直到现在,事情进展顺利。我能够组装一个完全在 9.7 英寸 iPad Pro 上开发的简单但有趣的游戏。它所需要的只是游戏控制器支持。在设法移植网上找到的 Swift 2 教程后,游戏控制器在 xCode 8.1 中工作。但是我更喜欢开发平台,iPad 的表现也不尽如人意。
以下是适用于 macOS 的游戏控制器代码:
import SpriteKit
import PlaygroundSupport
import GameController
class GameScene: SKScene {
override init(size: CGSize) {
super.init(size: size)
setUpControllerObservers()
connectControllers()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public override func didMove(to view: SKView) {
setUpControllerObservers()
connectControllers()
}
public func setUpControllerObservers() {
NotificationCenter.default.addObserver(self, selector: #selector(GameScene.connectControllers), name: NSNotification.Name.GCControllerDidConnect, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(GameScene.controllerDisconnected), name: NSNotification.Name.GCControllerDidDisconnect, object: nil)
}
public func connectControllers() {
self.isPaused = false
print(GCController.controllers().count)
for controller in GCController.controllers() {
if (controller.extendedGamepad != nil) {
print("extendedGamepad")
controller.extendedGamepad?.valueChangedHandler = nil
setUpExtendedController(controller)
}
}
}
public func controllerDisconnected() {
print("disconnect")
self.isPaused = true
}
public func setUpExtendedController(_ controller:GCController) {
print("setUpExtendedController")
controller.extendedGamepad?.buttonA.pressedChangedHandler = {
(input: GCControllerButtonInput!, value:Float, pressed:Bool) in
print("!!!")
}
}
}
let frame = CGRect(x: 0, y: 0, width: 400, height: 600)
let view = SKView(frame: frame) //GameView(frame: frame)
let scene = GameScene(size: frame.size)
view.presentScene(scene)
PlaygroundPage.current.liveView = view
在 iPad 上,我发现有必要在 Swift Playgrounds 和另一个应用程序(或 Home)之间短暂切换并返回以识别控制器。但在那之后,设置一直进行到为 A 按钮分配处理程序。随心所欲地按 A 按钮,iPad 不会收到消息。如前所述,macOS 似乎工作得很好。
谁能指出导致 iPad 脾气暴躁的原因?谢谢您的帮助!