2017-01-17 5 views
1

私は一連のアクションをまとめていて、その後X回実行しています。最初に私は0.05秒待ってから、サウンドファイルを再生してから、ノードを画面に追加して、次回のサウンドファイルをランダム化します。しかし、これを実行すると、再生されるサウンドはすべての繰り返しで同じファイルになります。反復部分とノードを画面に追加すると、サウンドが毎回どのようにランダム化されないのでしょうか?SKActionが期待通りに動作していないようです。

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) 
+0

は、イテレータ変数の問題ですか? – bearacuda13

+0

アクションを作成するときには、そのアクションを再使用することしかできません。必要に応じて変更することはできません。 – Whirlwind

+0

@ bearacuda13イテレータ変数が正常に動作していません。問題はサウンド変数を再初期化する場所です。 – Brejuro

答えて

1

私はあなたのコードを正確に従わなかった、そしてそれはまた、3スウィフトであるが、この例は、次を行います。

それは2に、インデックス0からノードを追加し、その追加される最初のノードは白です紫と茶色が現れます。

また、毎回サウンドがランダム化されます。私はそれがあなたが達成したいと思ったものだと思います。

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) 

    } 
} 

あなたのコードと私のコードの違いは、あなたが健全なアクションを1回作成し、それを再利用していたことです。私は毎回新しいサウンドアクションを作成します。コードがテストされ、動作しています。 Swiftのバージョンに簡単に変換して試すことができますので、これがどのように機能するかを理解すると、必要に応じて簡単に採用することができます。

関連する問題