在for循环中等待SKAction完成

时间:2017-01-17 03:59:43

标签: swift sprite-kit skaction

我有一个运行10次的for循环,每次创建一个节点并将其添加到场景中。但是,我希望在添加每个节点之间有一个延迟(添加节点,等待一秒,添加节点,等待一秒等)。

然而,在前1秒后,所有10个节点同时被添加。如何在添加的每个节点之间实现等待一秒的预期效果?

这是我的代码:

编辑:

func createText(correct: Bool) {
        let text = SKNode()
        var line: String!

        addChild(text)

        if correct {
            line = (GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(happyLines) as! [String])[0]
        } else {
            line = (GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(sadLines) as! [String])[0]
        }

        var xPos = self.frame.midX + 300
        var yPos = self.frame.midY

        var spaces = 1

        // For each character in sentence, create a node of it
        for character in line.characters {
        runAction(SKAction.waitForDuration(1.0)) {
            if spaces == 4 {
                spaces = 0
                print("space")
                xPos = self.frame.midX + 300
                yPos -= 30
            }

            xPos += 10

            if character != " " {
                let letter = SKLabelNode(fontNamed: GameScene.fontName)
                letter.fontSize = 14 * GameScene.fontScale
                letter.position = CGPoint(x: xPos, y: yPos)
                letter.text = String(character)
                text.addChild(letter)
            } else {
                spaces += 1
                xPos += 10
            }

        }
    }

        runAction(SKAction.waitForDuration(2.0)) {
            text.removeAllChildren()
            text.removeFromParent()
        }

    }

2 个答案:

答案 0 :(得分:1)

您可以使用操作来实现此目的。

首先,为延迟创建操作并将节点添加到场景中。

let waitAction = SKAction.wait(forDuration: 1)
let addNodeAction = SKAction.run {
    let node = SKSpriteNode(imageNamed: "example")
    self.addChild(node)
}

接下来,创建一系列操作,以便在将节点添加到场景之前始终发生延迟。

let sequenceAction = SKAction.sequence([waitAction, addNodeAction])

接下来,创建一个重复序列10次的动作。

let repeatAction = SKAction.repeat(sequenceAction, count: 10)

最后,运行此操作并观察节点!

run(repeatAction)

编辑:

要在关于需要访问当前字符的注释中解决第二个问题(使每个操作添加的节点略有不同),循环遍历characters以构建一系列操作,然后运行该问题动作。

var actions = [SKAction]()

let waitAction = SKAction.wait(forDuration: 1)

for character in line.characters {

    let addNodeAction = SKAction.run {
        let node = SKSpriteNode(imageNamed: "example")
        // use the character variable here
        self.addChild(node)
    }

    actions.append(waitAction)
    actions.append(addNodeAction)

}

let sequenceAction = SKAction.sequence(actions)
run(sequenceAction)

答案 1 :(得分:0)

这个怎么样? (未经测试:)

for (i, character) in line.characters.enumerate() {
   runAction(SKAction.waitForDuration(Double(i) * 1.0)) {
       // rest of your for loop

所以你通过字符枚举,其中i是第i个字符,从0开始。对于每个字符,你只需将字符串中的索引位置与1秒间隔相乘,即可得到等待时间。