SKAction 的行为似乎不像我预期的那样

SKAction doesn't seem to be behaving like I expect

我有一堆动作要一起排序,然后 运行宁 X 次。首先我等待 0.05 秒,然后我播放一个声音文件,然后我在屏幕上添加一个节点并为下一次随机播放声音文件。但是,当我 运行 这样做时,每次迭代播放的声音都是相同的文件。如果迭代部分和向屏幕添加节点有效,为什么声音不会每次都随机化?

    var iterator = 0
    var sound = "Content/text\(RandomInt(1, max: 5)).m4a"

    let waitAction = SKAction.waitForDuration(0.05)
    let addNode = SKAction.runBlock({
        text.addChild(letterNodes[iterator])
        iterator += 1
        sound = "Content/text\(RandomInt(1, max: 5)).m4a"
    })

    let sequenceAction = SKAction.sequence([waitAction, SKAction.playSoundFileNamed(sound, waitForCompletion: false), addNode])
    let repeatAction = SKAction.repeatAction(sequenceAction, count: letterNodes.count)

    runAction(repeatAction) 

我没有完全按照你的代码执行,它也是 Swift 3,但是这个例子接下来是:

它从索引 0 到 2 添加节点,因此首先添加的节点是白色,然后是紫色和棕色。

而且每次声音都会随机化。我想这就是你想要实现的目标。

class GameScene: SKScene {

    let letterNodes = [

        SKSpriteNode(color: .white, size: CGSize(width: 50, height: 50)),
        SKSpriteNode(color: .purple, size: CGSize(width: 50, height: 50)),
        SKSpriteNode(color: .brown, size: CGSize(width: 50, height: 50)),

        ]
    var iterator = 0


    override func didMove(to view: SKView) {


       let wait = SKAction.wait(forDuration: 2.0)

       run(SKAction.repeat(SKAction.sequence([wait,SKAction.run(spawn)]), count: letterNodes.count))

    }

    func spawn(){

        let file = "\(GKRandomDistribution.init(lowestValue: 1, highestValue: 5).nextInt()).wav"

        let sound = SKAction.playSoundFileNamed(file, waitForCompletion: false)

        let addNode = SKAction.run({[unowned self] in

            let node = self.letterNodes[self.iterator]
            node.position.y = CGFloat(GKRandomDistribution.init(lowestValue: 50, highestValue: 60).nextInt())
            self.addChild(node)
            self.iterator += 1
        })

        let sequence = SKAction.sequence([sound,addNode])
        self.run(sequence)

    }
}

你的代码和我的代码之间的区别在于你只创建了一次声音动作,然后重复使用它。我每次都创造新的声音动作。代码已经过测试并且可以正常工作。您可以轻松地将其转换为您的 Swift 版本并进行试用,因此当您了解其工作原理后,您将能够轻松地根据需要采用它。