2017-01-17 18 views
1

ノードを作成してシーンに追加するたびに、forループが10回実行されます。しかし、私は、各ノードの追加(ノードの追加、秒の追加、ノードの追加、秒の待機など)に遅れがあるようにしたい。forループ内でSKActionの完了を待つ

ただし、最初の1秒後には、同時に追加されます。どのようにして、追加されている各ノードの間に秒間待機するという、この望ましい効果を達成できますか?ここで

は私のコードです:

EDIT:

func createText(correct: Bool) { 
     let text = SKNode() 
     var line: String! 

     addChild(text) 

     if correct { 
      line = (GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(happyLines) as! [String])[0] 
     } else { 
      line = (GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(sadLines) as! [String])[0] 
     } 

     var xPos = self.frame.midX + 300 
     var yPos = self.frame.midY 

     var spaces = 1 

     // For each character in sentence, create a node of it 
     for character in line.characters { 
     runAction(SKAction.waitForDuration(1.0)) { 
      if spaces == 4 { 
       spaces = 0 
       print("space") 
       xPos = self.frame.midX + 300 
       yPos -= 30 
      } 

      xPos += 10 

      if character != " " { 
       let letter = SKLabelNode(fontNamed: GameScene.fontName) 
       letter.fontSize = 14 * GameScene.fontScale 
       letter.position = CGPoint(x: xPos, y: yPos) 
       letter.text = String(character) 
       text.addChild(letter) 
      } else { 
       spaces += 1 
       xPos += 10 
      } 

     } 
    } 

     runAction(SKAction.waitForDuration(2.0)) { 
      text.removeAllChildren() 
      text.removeFromParent() 
     } 

    } 
+0

forループでアクションシーケンス(wait、block、wait、block ...)を構築します。この方法で、ノード(文字)ごとにブロックを作成します。詳細が必要な場合は、私に教えてください。 – Whirlwind

答えて

0

あなたは、この使用して、アクションを達成することができます。

まず、遅延のアクションを作成し、ノードをシーンに追加します。

let waitAction = SKAction.wait(forDuration: 1) 
let addNodeAction = SKAction.run { 
    let node = SKSpriteNode(imageNamed: "example") 
    self.addChild(node) 
} 

次に、ノードがシーンに追加される前に遅延が常に発生するように一連のアクションを作成します。

let sequenceAction = SKAction.sequence([waitAction, addNodeAction]) 

次に、シーケンスを10回繰り返すアクションを作成します。

let repeatAction = SKAction.repeat(sequenceAction, count: 10) 

最後に、このアクションを実行し、ノードが表示されるのを見てください!

run(repeatAction) 

EDIT:

現在の文字(ノードが若干異なる追加された各アクションを行う)へのアクセスを必要とする程度のコメントであなたの2番目の質問を解決するために、あなたのcharactersをループ構築します一連のアクションを実行し、そのアクションを実行します。

var actions = [SKAction]() 

let waitAction = SKAction.wait(forDuration: 1) 

for character in line.characters { 

    let addNodeAction = SKAction.run { 
     let node = SKSpriteNode(imageNamed: "example") 
     // use the character variable here 
     self.addChild(node) 
    } 

    actions.append(waitAction) 
    actions.append(addNodeAction) 

} 

let sequenceAction = SKAction.sequence(actions) 
run(sequenceAction) 
+0

残念ながら私は私の問題を単純化しましたが、この戦略が私の実際の実装に有効かどうかは分かりません。私の実際のコードに私の答えを編集 – Brejuro

+0

私は文字列を反復する必要があるため、私は例として "十倍"を使用したが、少し複雑にこの戦略を使用できるとは思わない – Brejuro

+0

@Brejuro私は私の答えを編集あなたの新しい質問を解決する。 – nathan

0

これはいかがですか? (テストされていない:)

for (i, character) in line.characters.enumerate() { 
    runAction(SKAction.waitForDuration(Double(i) * 1.0)) { 
     // rest of your for loop 

ですから、私は、各文字に0から始まる、i番目の文字であり、あなただけの1秒間隔での文字列でのインデックス位置を掛け、文字を列挙あなたに待ち時間を与える。

関連する問題