首次使用SpriteKit-轻触开始按钮会在GameScene中调用startLevel方法,该方法具有一个播放器精灵,会在SKAction.sequence中触发两个SKAction.run语句。 startLevel方法具有一个完成块,该完成块触发向控制台发送消息并更新游戏状态。
点击开始将显示该消息,但是除非我先暂停程序执行,然后单击恢复,然后再点击开始按钮,否则SKAction.run语句将不起作用。如果我停止该级别并点击一个重试按钮,则将调用相同的startLevel方法,并且该方法可以正常运行而不会暂停执行。
这里是方法(玩家,标记和门都是存储其sprite的可选对象;点击开始时,我验证了sprite没有一个为nil,它们都没有暂停,并且GameScene和SKView也没有暂停):
func startLevel(finished: () -> ()) {
guard let player = player,
let marker = marker,
let door = door else {
fatalError()
}
player.sprite.run(SKAction.sequence([
SKAction.run({ marker.pop(appear: true) }),
SKAction.run({ door.slide(open: true) }),
]))
finished()
}
这是调用startLevel的GameScene代码:
startLevel(finished: { () -> () in
print("ALERT: startLevel finished")
levelStarted = true
})
我尝试添加带有控制台消息的运行方法完成块,但该消息从不打印。似乎只是忽略了player.sprite.run方法(除非我先暂停执行),而且我不明白为什么。感谢您的帮助。
顺便说一句-上面的所有代码都在GameScene的update方法之外,上面的marker和door方法都在didBegin()和didEnd()中使用,并且在那儿工作得很好。
答案 0 :(得分:0)
在iOS 11中,苹果默认将Spritekit场景和对象暂停。
我要做的就是...
在我的SKScene中
override func didMove(to view: SKView) {
//this ensures that the scene is not paused
self.isPaused = false
}
以及我每个自定义对象的设置或初始化
self.isPaused = false