2017-01-17 5 views
1

노드를 만들고 장면에 추가 할 때마다 10 회 실행되는 for 루프가 있습니다. 그러나 추가 할 각 노드 사이에 지연이 있기를 원합니다 (노드 추가, 초 대기, 노드 추가, 초 대기 등)for 루프 내에서 SKAction 완료 대기

그러나 처음 1 초 후 모든 10 개의 노드 동시에 추가됩니다. 추가되는 각 노드 사이에서 잠깐 기다리면서 원하는 효과를 얻으려면 어떻게해야합니까?

편집 :

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) 

편집 :

가 (노드가 약간 다른 추가 될 때마다 동작을) 현재의 문자에 대한 액세스를 필요에 대한 코멘트에 두 번째 질문을 해결하기 위해, 루프 당신의 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

문자열을 반복해야하기 때문에이 전략을 사용할 수 없다고 생각합니다. 예를 들어 "10 번"을 예제로 사용했지만 다소 복잡합니다. – 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 개 초 간격으로 문자열의 인덱스 위치를 곱 대기 지속 시간을 제공합니다.