2017-12-04 21 views
0

이 루프는 정상적으로 작동하지만 배열의 이미지를 한 세트 씩 다른 시퀀스에 넣고 싶습니다. 나는 루프에 추가 한이 SKAction을 만든for 루프의 addChild가 지연되어 오류가 발생했습니다! Swift

if transitionSprite.name == nil || transitionSprite.name == "rd-d2c" || transitionSprite.name == "rd-f2c" { 
     for (index, roadImage) in cityArrays[randomIndex].enumerated() { 

      roadSprite = SKSpriteNode(imageNamed: roadImage) 
      roadSprite.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
      roadSprite.position = CGPoint(x: 0, y: CGFloat(screenCounter) * roadSprite.size.height) 
      roadSprite.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height)) 
      roadSprite.physicsBody?.categoryBitMask = PhysicsCategory.RoadImageCategory.rawValue 
      roadSprite.physicsBody?.collisionBitMask = PhysicsCategory.NoCollisionsCategory.rawValue 
      roadSprite.physicsBody?.contactTestBitMask = PhysicsCategory.BroomCategory.rawValue 
      roadSprite.physicsBody?.affectedByGravity = false 

      roadSprite.zPosition = 1 
      roadSprite.name = "Road \(index)" 

      // RUNNING THE SKACTION DELAY ON THIS 
      self.addChild(roadSprite) 

      addCollectables() 
      addJerryCans() 

      if roadImage == "rdc-02_05" { 
       addBackgroundDetail(detailType: "cityBridge2") 
      } 
      screenCounter += 1 
     } 

,

loopDelay = SKAction.wait(forDuration: Double(index + 1)) 
    let addRoad = SKAction.run {self.addChild(self.roadSprite)} 
    let action = SKAction.sequence([loopDelay, addRoad]) 
    self.run(action) 

하지 내가 그것을 만든 SKAction 지연을 실행할 때이 원인이 있지만 것이 무엇인지 충돌이 발생하고이 오류가 발생합니다.

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: 'Attemped to add a SKNode which already has a parent: 
<SKSpriteNode> name:'Road 4' texture:[<SKTexture> 'rdc-02_05' (750 x 
1334)] position:{0, 6670} scale:{1.00, 1.00} size:{750, 1334} 
anchor:{0.5, 0.5} rotation:0.00' 

왜 지연이 원인입니까? 감사합니다

답변

0

당신의 속성은 당신이 속성을 사용하여 roadSprite를 저장한다는 것입니다. 따라서 for-in 루프를 반복 할 때마다 해당 속성에 저장된 내용을 새로운 Sprite로 바꿉니다.

각 지연 시간이 지나면 동일한 스프라이트 (작성한 마지막 스프라이트)를 사용하여 addChild를 시도하므로 추가 된 첫 번째 시간과 두 번째로 위의 오류가 발생합니다. "추가를 시도했습니다. 이미 부모가있는 SKNode "라고합니다.

은 당신이 여기에 원하는 것은 대신 로컬 변수로 스프라이트를 생성하고 SKAction.run 폐쇄에 그 변수를 캡처하는 것입니다 : 당신은 아직도 어쩌면이 스프라이트의 모든에 대한 참조를 원하는 경우

let roadSprite = SKSpriteNode(imageNamed: roadImage) 

... 

let addRoad = SKAction.run {self.addChild(roadSprite)} //capture the local variable in your closure here 

당신 동일한 속성을 재정의하는 대신 배열에 붙여야합니다.

+0

와우는 간단했습니다. 실제로이 시간을 얼마나 소비했는지 조금 당황 스럽습니다. 고마워요, 시간을 절약 할 수 있어요! – Dave

+0

도움이 되니 기쁩니다;) – tanzolone