SKAction.run 在程序执行之前不工作 paused/resumed

SKAction.run not working until program execution paused/resumed

第一次使用 SpriteKit - 点击开始按钮会调用 GameScene 中的 startLevel 方法,其中玩家精灵会在 SKAction.sequence 中触发两个 SKAction.run 语句。 startLevel 方法有一个完成块,它会触发一条消息到控制台并更新游戏状态。

点击开始显示消息,但 SKAction.run 语句不起作用,除非我先暂停程序执行,然后在点击开始按钮之前单击恢复。如果我停止关卡并点击重试按钮,则会调用相同的 startLevel 方法,并且无需暂停执行即可正常工作。

这是方法(玩家、标记和门都是存储精灵的可选对象;点击开始时,我验证 none 个精灵为零,其中 none 个暂停,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 11 中,Apple 使 Spritekit 场景和对象默认暂停。

我为解决这个问题所做的是...

在我的 SKScene 中

override func didMove(to view: SKView) {

    //this ensures that the scene is not paused
    self.isPaused = false
}

并且在我的每个自定义对象设置或初始化中

self.isPaused = false