SKAction似乎没有像我期望的那样表现

时间:2017-01-17 17:35:13

标签: swift sprite-kit skaction

我有很多动作,我一起排序,然后运行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) 

1 个答案:

答案 0 :(得分:1)

我没有完全遵循你的代码,它也是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版本并进行尝试,因此当您弄清楚它是如何工作的时,您将能够轻松地将其应用于您的需求。