Xcode SKSpriteNode不能有多个孩子

Xcode SKSpriteNode不能有多个孩子,xcode,swift,skspritenode,Xcode,Swift,Skspritenode,我正试图拥有多个相同类型/父节点的精灵节点,但当我尝试生成另一个节点时,会出现错误。”NSInvalidArgumentException',原因:'试图添加已具有父级的SKNode' 这是我的密码: import SpriteKit class GameScene: SKScene { //global declarations let player = SKSpriteNode(imageNamed: "mage") let fireball = SKSpriteN

我正试图拥有多个相同类型/父节点的精灵节点,但当我尝试生成另一个节点时,会出现错误。”NSInvalidArgumentException',原因:'试图添加已具有父级的SKNode'

这是我的密码:

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)
    }
}
导入SpriteKit
类游戏场景:SKScene{
//全球宣言
让玩家=SKSpriteNode(图像名为:“法师”)
让fireball=SKSpriteNode(图像名为:“fireball”)
覆盖func didMoveToView(视图:SKView){
/*在这里设置场景*/
createScene()
}
覆盖func touchesBegined(触摸:设置,withEvent事件:UIEvent){
/*当触摸开始时调用*/
用于触摸输入(触摸设置为){
let location=touch.locationInNode(自)
火球(位置)
}
}
覆盖函数更新(currentTime:CFTimeInterval){
/*在渲染每个帧之前调用*/
self.枚举名为(“fireball”)的子节点,使用block:({
(节点,错误)在
如果(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.size=CGSizeMake(100100)
player.position=CGPointMake(self.frame.size.width/2,self.frame.size.height/2+50)
player.zPosition=2.0
self.addChild(播放器)
}
func生成火球(点:CGPoint){
//设置
fireball.name=“fireball”
fireball.size=CGSizeMake(100,50)
让fireballCenter=CGPointMake(fireball.size.width/4*3,fireball.size.height/2)
fireball.position=player.position
fireball.physicsBody=SKPhysicsBody(圆环半径:fireball.size.height/2,中心:fireball中心)
火球。物理体?。受重力影响=假
//行动
var dx=CGFloat(point.x-player.position.x)
var dy=CGFloat(point.y-player.position.y)
设幅值=sqrt(dx*dx+dy*dy)
dx/=震级
dy/=震级
设向量=CGVector(dx:32.0*dx,dy:32.0*dy)
var rad=atan2(dy,dx)
火球。奔跑动作(SKAction。旋转角度(弧度,持续时间:0.0))
self.addChild(火球)
火球。物理体?。应用脉冲(矢量)
}
}

您需要实例化另一个
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()
,方法是将every
self.fireball
更改为just
node

这样,代码将循环遍历当前在场景中的每个现有火球,而不是当前代码,因为当前代码只允许您创建一个火球