2016-03-31 19 views
0

Aynı türde/üst öğeden birden çok hareketli düğüm oluşturmaya çalışıyorum ancak başka bir düğümü oluşturmaya çalıştığımda bir hata alıyorum. 'NSInvalidArgumentException', nedeni:SKSpriteNode çoklu çocuk sahibi olamaz

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) 
    } 
} 

cevap

1

başka SKSpriteNode örneğini Sen gerekir:

İşte benim kod 'Zaten bir ebeveyni bir SKNode eklemek attemped'. Mevcut kodunuzda, tek bir ateş topu oluşturun ve sahneyi ekleyin; Aynı ateş topu eklemeyi denediğinizde programınız çöküyor.

İlk önce, let fireball = SKSpriteNode... hattınızı kaldırın. böylece gibi spawnFireball() yöntemi içinde taşıyın: fireball değişken bir yerel değişkendir

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

Çünkü, artık yeni bir tane işlevi çağırmak her zaman örneğini. Şimdi, her self.fireball'u sadece node'a değiştirerek'u doğru şekilde kullanmak için update() yöntemini değiştirin.

Bu yolla, kod, geçerli kodunuzdan ziyade, yalnızca tek bir ateş topu oluşturmanıza izin veren, şu anda sahnede bulunan mevcut tüm ateş topu boyunca dönecektir.