2016-03-31 10 views
0

同じタイプ/親の複数のスプライトノードを作成しようとしていますが、別のノードを生成しようとするとエラーが発生します。 'NSInvalidArgumentExceptionは'、理由: 'は既に親を持つSKNodeを追加するAttemped'SKSpriteNodeは複数の子を持つことができません

は、ここに私のコードです:

import SpriteKit 

class GameScene: SKScene { 
    //global declarations 
    let player = SKSpriteNode(imageNamed: "mage") 
    let fireball = SKSpriteNode(imageNamed: "fireball") 

    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 
     createScene() 
    } 
    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
     /* Called when a touch begins */ 
     for touch in (touches as! Set<UITouch>) { 
      let location = touch.locationInNode(self) 
      spawnFireball(location) 

     } 
    } 
    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
     self.enumerateChildNodesWithName("fireball", usingBlock: ({ 
      (node,error) in 
      if (self.fireball.position.x < -self.fireball.size.width/2.0 || self.fireball.position.x > self.size.width+self.fireball.size.width/2.0 
       || self.fireball.position.y < -self.fireball.size.height/2.0 || self.fireball.position.y > self.size.height+self.fireball.size.height/2.0) { 
       self.fireball.removeFromParent() 
       self.fireball.removeAllChildren() 
       self.fireball.removeAllActions() 
      } 
     })) 
    } 
    func createScene() { 
     //player 
     player.size = CGSizeMake(100, 100) 
     player.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2 + 50) 
     player.zPosition = 2.0 
     self.addChild(player) 
    } 
    func spawnFireball(point: CGPoint) { 
     //setup 
     fireball.name = "fireball" 
     fireball.size = CGSizeMake(100, 50) 
     let fireballCenter = CGPointMake(fireball.size.width/4 * 3, fireball.size.height/2) 
     fireball.position = player.position 
     fireball.physicsBody = SKPhysicsBody(circleOfRadius: fireball.size.height/2, center: fireballCenter) 
     fireball.physicsBody?.affectedByGravity = false 
     //action 
     var dx = CGFloat(point.x - player.position.x) 
     var dy = CGFloat(point.y - player.position.y) 
     let magnitude = sqrt(dx * dx + dy * dy) 
     dx /= magnitude 
     dy /= magnitude 
     let vector = CGVector(dx: 32.0 * dx, dy: 32.0 * dy) 

     var rad = atan2(dy,dx) 
     fireball.runAction(SKAction.rotateToAngle(rad, duration: 0.0)) 
     self.addChild(fireball) 
     fireball.physicsBody?.applyImpulse(vector) 
    } 
} 

答えて

1

あなたは別のSKSpriteNodeをインスタンス化する必要があります。既存のコードでは、単一の火球を作成してシーンに追加します。同じ火球をもう一度追加しようとすると、プログラムがクラッシュします。

まず、let fireball = SKSpriteNode...行を削除してください。そのように、spawnFireball()メソッド内に移動:

func spawnFireball(point: CGPoint) { 
    let fireball = SKSpriteNode(imageNamed: "fireball") 
    //Insert all customization here (your existing code should mostly work) 
    self.addChild(fireball) 
} 

fireball変数はローカル変数なので、あなたは今、新しいものに関数を呼び出すたびにインスタンス化することができます。今度はupdate()メソッドをenumerateChildrenWithName()を正しく使用するように変更し、self.fireballをすべてnodeに変更してください。

このようにして、コードは現在のコードではなく、現在シーンにある既存のすべての火球をループします。現在のコードでは、1つの火球しか作成できません。

関連する問題