在程序执行暂停/恢复之前,SKAction.run不起作用

时间:2018-07-22 03:12:29

标签: ios sprite-kit skaction completionhandler

首次使用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()中使用,并且在那儿工作得很好。

1 个答案:

答案 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