在 for 循环中等待 SKAction 完成

Waiting for SKAction completion inside a for loop

我有一个运行 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()
        }

    }

您可以使用操作来实现。

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

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)

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

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

所以你枚举字符,其中 i 是 i-th 字符,从 0 开始。对于每个字符,你只需将其在字符串中的索引位置乘以 1 秒间隔即可等待持续时间。