2017-01-17 5 views
1

Ich habe eine for-Schleife, die 10 Mal ausgeführt wird, jedes Mal einen Knoten erstellen und es der Szene hinzufügen. Ich möchte jedoch, dass zwischen jedem hinzuzufügenden Knoten eine Verzögerung liegt (fügen Sie einen Knoten hinzu, warten Sie eine Sekunde, fügen Sie einen Knoten hinzu, warten Sie eine Sekunde usw.)Warten auf SKAction-Abschluss in einer for-Schleife

Jedoch nach der ersten 1 Sekunde alle 10 Knoten werden gleichzeitig hinzugefügt. Wie kann ich diesen gewünschten Effekt des Wartens einer Sekunde zwischen jedem hinzugefügten Knoten erreichen?

Hier ist mein Code:

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

Erstellen Sie eine Aktionsfolge (warten, blockieren, warten, blockieren ...) in einer for-Schleife. Auf diese Weise erstellen Sie einen Block pro Knoten (Zeichen). Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen. – Whirlwind

Antwort

0

Sie können dies mit Aktionen erreichen.

Zuerst Aktionen für die Verzögerung erstellen und den Knoten zur Szene hinzufügen.

Erstellen Sie als Nächstes eine Folge von Aktionen, sodass die Verzögerung immer auftritt, bevor der Knoten zur Szene hinzugefügt wird.

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

Als nächstes erstellen Sie eine Aktion, die die Sequenz 10 Mal wiederholt.

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

Schließlich, führen Sie diese Aktion und beobachten Sie die Knoten angezeigt werden!

run(repeatAction) 

EDIT:

Um Ihre zweite Frage in den Kommentaren zu lösen über den Zugriff auf das aktuelle Zeichen benötigen (jede Aktion zu machen, wo der Knoten etwas andere hinzugefügt wird), eine Schleife durch Ihre characters zu bauen eine Folge von Aktionen und dann diese Aktion ausführen.

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

Leider habe ich mein Problem irgendwie vereinfacht und ich weiß nicht, ob diese Strategie für meine tatsächliche Implementierung funktionieren wird. Ich habe meine Antwort auf meinen tatsächlichen Code bearbeitet – Brejuro

+0

Ich glaube nicht, dass ich diese Strategie verwenden kann, weil ich über eine Zeichenfolge iterieren muss, habe ich "zehn Mal" als Beispiel verwendet, aber es ist ein wenig komplizierter – Brejuro

+0

@Brejuro Ich bearbeitete meine Antwort um deine neue Frage zu lösen. – nathan

0

Wie wäre es damit? (Nicht getestet :)

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

So aufzählen Sie die Zeichen durch, wobei i die i-te Zeichen, wobei jedes Zeichen bei 0 beginnt, multiplizieren Sie nur seine Indexposition in der Zeichenfolge mit dem Intervall von 1 Sekunde um Ihnen die Wartezeit zu geben.

Verwandte Themen