2017-04-05 4 views
3

動的に作成され、ループ内でオフセットされるSKActionシーケンスの不明な量(辞書の配列から)を実行する必要があります。ループの印刷出力は、シーケンスのみ予想通り、それは出力よりも一度発生する必要がある場合、私はこのコード動的に遅延されたSKActionsのシーケンスをループする方法

func display(winningLines: [Int : AnyObject]) { 

    var delay = 0.0 
    var actions = [SKAction]() 

    let hideAction = SKAction.run { 
     print("hiding everything") 
    } 

    for winningLine in winningLines { 

     let displayAction = SKAction.run { 
      print("line \(winningLine.key)") 
     } 

     let wait = SKAction.wait(forDuration: delay)    
     var action: SKAction! 

     //repeatForever = true 
     if !repeatForever { 
      action = SKAction.sequence([wait, displayAction, SKAction.wait(forDuration: 1.0), hideAction]) 
     } 
     else { 
      let seq = SKAction.sequence([wait, displayAction, SKAction.wait(forDuration: 1.0), hideAction]) 
      action = SKAction.repeatForever(seq) 
     } 
     self.run(action) 

     delay += 1.0 
    } 
} 

を使用するこの機能を得るために、次の順序

show line 5 
hiding everything 
show line 6 
hiding everything 
show line 2 
hiding everything 

に表示され、しかし、あります(ユーザーがアクションを停止するまで)繰り返し続けるだけのシーケンスが必要です。アクションを永遠に繰り返すことは、個々のシーケンスを繰り返して順序を混乱させるため、機能しません。最初のシーケンスは1秒ごとに繰り返され、2番目のシーケンスは2秒ごとに繰り返されます。

これを永遠に正しくループさせる方法についての提案はありますか?

line 5 
hiding everything 
line 5 
line 6 
hiding everything 
line 5 
hiding everything 
line 2 
hiding everything 
line 5 
line 6 
hiding everything 
hiding everything 
line 5 
hiding everything 
hiding everything 
line 5 
line 6 
line 2 
hiding everything 
line 5 
hiding everything 
hiding everything 

私もSKActionsの配列にアクションを追加し、最後にそれらを介してループしてみたが、それは...

var actions = [SKAction]() 

を動作しませんでした

actions.append(action) 

for action in actions { 
    self.run(action) 
} 
+0

永遠に増分しますか?それは 'customAction'を必要とします – Knight0fDragon

答えて

2

あなたの唯一の懸念事項が、シーケンスの未知の量である永遠に繰り返すことである場合、次のことができます:

  • すべての必要な配列を作成するには、別のシーケンスに永遠

だから例えば、このコードは4つのボックスを作成し、あなたから/アウト(displayAction/hideActionにフェードを適用する

  • ループを入れてコード)をすべてのボックスに順番に繰り返し、それを永遠に繰り返します:

    import SpriteKit 
    
    class GameScene: SKScene { 
    
    var boxes:[SKSpriteNode] = [] 
    
    override func didMove(to view: SKView) { 
    
        let distance:CGFloat = 10 
    
        for i in 0...3 { 
    
         let box = SKSpriteNode(color: .purple, size: CGSize(width: 50, height: 50)) 
         box.name = String(i) //name == index 
         box.position.x = CGFloat(i) * (box.size.width + distance) 
         box.alpha = 0.0 
         addChild(box) 
         boxes.append(box) 
    
        } 
    } 
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    
        var actions:[SKAction] = [] 
    
        let action = SKAction.sequence([ 
    
         SKAction.fadeIn(withDuration: TimeInterval(1)), 
         SKAction.fadeOut(withDuration: 0), 
        ]) 
    
        for index in 0...boxes.count { 
    
         let sequence = SKAction.sequence([ 
          SKAction.run(action, onChildWithName: String(index)), 
          SKAction.wait(forDuration: 1) 
         ]) 
    
         actions.append(sequence) 
    
        } 
    
        self.run(SKAction.repeatForever(SKAction.sequence(actions))) 
    } 
    } 
    
  • +1

    これは完璧です。私はSKActionsの配列を取ってシーケンスに直接ドロップすることを考えたことはなかった。完璧に働きました。そして最高の部分は、再帰を使わないようにすることができ、これはすべてのループでSKActionsを再作成する手間を省くことができました。ありがとう –

    関連する問題