2017-04-05 27 views
3

我需要運行SKAction序列的一個未知量(來自一個字典數組),這些SKAction序列是動態創建的,並且在循環中使用延遲增加,並隨着循環的進行而增加。循環的打印輸出應該出現在以下順序如何循環一個動態延遲的SKActions序列

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

以獲得此功能我使用此代碼

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 
    } 
} 

如果序列只需要比它輸出作爲預期發生一次,但有次,我需要序列永遠不斷重複(直到用戶停止行動)。因爲它會重複每個單獨的序列並混淆順序,因此在該操作周圍重複進行重複操作無效。第一個序列每1秒重複一次,第二個序列每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

如果您唯一的擔心是重複永久性,未知數量的序列,您可以執行以下操作:

  • 創建所有所需的序列
  • 把他們在另一個序列
  • 循環,永遠

因此,例如,該代碼將創建四個盒子,並會在輸入/輸出(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並直接將其放入一個序列中。完美的工作,最好的部分是我能夠避免使用遞歸,這爲我節省了在每個循環中重新創建SKA的麻煩。謝謝 –