SpriteKit(Swift 3)中的延迟功能无法正常工作

时间:2017-08-23 13:48:15

标签: swift sprite-kit skaction

在看了这样的其他几个问题之后,他们问题的所有答案都不适合我。我有一个暂停标签,当用户按下播放时,我希望标签来自" Paused"从3到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()

    }

作为我的延迟,这是其他人似乎正在做的事情,但它并不适合我。

{{1}}

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您的所有操作都在同时运行。

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

SKAction之后的{}括号是completion:的简写,因此它指定在操作完成后运行的代码。您的代码只是立即运行所有操作,延迟也在运行,但运行后没有任何操作。

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()
                }
            }
        }
    }
}

答案 1 :(得分:0)

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

// 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...