2017-12-04 12 views
0

このループはうまくいきましたが、アレイからの画像を、あらかじめ設定された時間間隔で並べて表示したいのです。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 
     } 

私はループに追加したこのSKAction、

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に置き換えます。

それぞれの遅延が経過すると、同じSprite(作成した最後のもの)を使用してaddChildを試行します。したがって、最初に追加され、2回目に上記のエラーが表示されます: "追加しようとしました既に親を持っている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

関連する問題