【发布时间】:2018-12-29 21:33:10
【问题描述】:
第一次使用 SpriteKit - 点击开始按钮会调用 GameScene 中的 startLevel 方法,让玩家精灵在 SKAction.sequence 中触发两个 SKAction.run 语句。 startLevel 方法有一个完成块,它会触发向控制台发送消息并更新游戏状态。
点击开始会显示消息,但 SKAction.run 语句不起作用,除非我先暂停程序执行,然后在点击开始按钮之前单击恢复。如果我停止关卡并点击重试按钮,则会调用相同的 startLevel 方法,并且它可以正常工作而不会暂停执行。
方法如下(player、marker、door,都是可选的对象,存储自己的sprite;点击start的时候,我验证了没有一个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 的更新方法之外,上面的标记和门方法都在 didBegin() 和 didEnd() 中使用,它们在那里工作正常。
【问题讨论】:
标签: ios sprite-kit skaction completionhandler