SpriteKit 中的延迟功能 (Swift 3) 不工作

Delay function in SpriteKit (Swift 3) not working

在查看了其他几个类似的问题后,他们问题的所有答案都不适合我。我有一个暂停标签,当用户按下播放键时,我希望标签从 "Paused" 变为从 3 到 1 的倒计时。我已经声明了

let delay = SKAction.wait(forDuration: 1)

作为我的延迟,这就是其他人似乎在做的事情,但它对我不起作用。

func playButtonTapped(_ sender: Any?) -> Void {
        let delay = SKAction.wait(forDuration: 1)
        pauseLabel.text = "3"
        pauseLabel.run(delay)
        pauseLabel.text = "2"
        pauseLabel.run(delay)
        pauseLabel.text = "1"
        pauseLabel.run(delay)
        pauseLabel.removeFromParent()
        pauseLabel.run(delay)
        addChild(scoreLabel)
        addChild(levelLabel)
        addChild(hero)
        addEnemies()
        play.removeFromSuperview()
        createPauseButton()

    }

有什么想法吗?

您的所有操作都运行一次完成。

您需要做的是...(顺便说一句,“-> void”不是必需的)

SKAction 之后的 {} 括号是 completion: 的 shorthand,因此它会在操作完成后将代码指定为 运行。您的代码只是 运行 一次执行所有操作,延迟也是 运行ning,但在它们 运行.

之后没有任何触发
func playButtonTapped(_ sender: Any?) {

    let delay = SKAction.wait(forDuration: 1)

    pauseLabel.text = "3"
    pauseLabel.run(delay) {

        pauseLabel.text = "2"
        pauseLabel.run(delay) {

            pauseLabel.text = "1"
            pauseLabel.run(delay) {

                pauseLabel.removeFromParent()
                pauseLabel.run(delay) {

                    addChild(scoreLabel)
                    addChild(levelLabel)
                    addChild(hero)
                    addEnemies()
                    play.removeFromSuperview()
                    createPauseButton()
                }
            }
        }
    }
}

当您在一个节点上调用 运行 时,操作会立即发生,因此您的所有操作几乎都是同时进行的 运行。您需要创建一系列操作,例如:

// elementary actions
let remove = SKAction.removeFromParent()
let delay = SKAction.wait(forDuration: 1)
let text3 = SKAction.run({ pauseLabel="3" })
let text2 = SKAction.run({ pauseLabel="3" })
let text1 = SKAction.run({ pauseLabel="3" })
let end = SKAction.run({
    addChild(scoreLabel)
    addChild(levelLabel)
    addChild(hero)
    addEnemies()
    play.removeFromSuperview()
    createPauseButton()
})
// sequenced action
let seq = SKAction.sequence([ text3, delay, text2, delay, text1, delay, remove,end]}

pauseLabel.run(seq) // now launch the sequence...