Swift 如何一次生成多个相同的SpriteNode?

Swift 如何一次生成多个相同的SpriteNode?,swift,sprite-kit,Swift,Sprite Kit,所以我有3个不同的障碍物,它们随机产生,3秒后被移除,但是如果例如Obstacle1已经产生,并且随机数告诉程序产生另一个Obstacle1,我会得到一个错误 “由于未捕获异常而终止应用程序 “NSInvalidArgumentException”,原因:“试图添加一个 已经有一个家长“ 以下是障碍物代码1,其他两个几乎相同,只是名称不同: func createObst1(){ self.addChild(obst1) path=UIBezierPath(弧心:CGPoint(x:0,y:-1

所以我有3个不同的障碍物,它们随机产生,3秒后被移除,但是如果例如Obstacle1已经产生,并且随机数告诉程序产生另一个Obstacle1,我会得到一个错误

“由于未捕获异常而终止应用程序 “NSInvalidArgumentException”,原因:“试图添加一个 已经有一个家长“

以下是障碍物代码1,其他两个几乎相同,只是名称不同:
func createObst1(){
self.addChild(obst1)
path=UIBezierPath(弧心:CGPoint(x:0,y:-170),半径:circle.frame.size.height/2+obst1.frame.size.width/2-4,startAngle:CGFloat(rad)*2,端角:CGFloat(rad)+CGFloat(M_PI*2.5),顺时针:真)
让follow=SKAction.follow(path.cgPath,asOffset:false,orientToPath:true,duration:TimeInterval(roundDuration))
obst1.ishiden=false
让fadeOutInstant=SKAction.fadeOut(持续时间:0)
让fadeIn=SKAction.fadeIn(持续时间:0.3)
让衰减=SKAction.fadeOut(持续时间:0.3)
让暂停=SKAction.wait(持续时间:2.4)
让remove=SKAction.removeFromParent()
让序列=SKAction.sequence([fadeOutInstant,fadeIn,pause,fadeOut,remove])
让group=SKAction.group([follow,sequence])
obst1.run(组)
}

func obstSwitch() {
let rand = arc4random_uniform(3)    
switch rand{
case 0:
    createObst1()

case 1:
    createObst2()

case 2:
    createObst3()

default:
    break
    }
}
我是否必须使用相同的代码创建多个Obstacle1函数,还是有其他方法可以解决我的问题

下面是我如何随机生成障碍物以备不时之需的代码:func gameStarted(){ Timer.scheduledTimer(timeInterval:timeInterval(randomDelay),target:self,selector:#selector(gamesence.obstSwitch),userInfo:nil,repeats:true) }

func obstSwitch() {
let rand = arc4random_uniform(3)    
switch rand{
case 0:
    createObst1()

case 1:
    createObst2()

case 2:
    createObst3()

default:
    break
    }
}
请尝试以下代码:

class GameScene: SKScene, SKPhysicsContactDelegate {

    let obstacles = [
            SKSpriteNode(color:.brown, size:CGSize(width: 50, height: 50)),
            SKSpriteNode(color:.white, size:CGSize(width: 50, height: 50)),
            SKSpriteNode(color:.black, size:CGSize(width: 50, height: 50)),
        ]


    func getRandomObstacle(fromArray array:[SKSpriteNode])->SKSpriteNode{

        return array[Int(arc4random_uniform(UInt32(array.count)))]
    }


    func spawnObstacle(atPosition position:CGPoint) {

        if let obstacle = getRandomObstacle(fromArray: obstacles).copy() as? SKSpriteNode {

            obstacle.position = position

            //apply action that fade out and remove the node after 3 seconds

            let fadeOut = SKAction.fadeOut(withDuration: 3)
            let remove = SKAction.removeFromParent()

            let sequence = SKAction.sequence([fadeOut,remove])

            obstacle.run(sequence, withKey: "aKey")

            addChild(obstacle)

        }

    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        if let touch = touches.first {

            let location = touch.location(in: self)
            spawnObstacle(atPosition: location)
        } 
    }  
}

这完全是关于您的代码逻辑。展示你迄今为止所做的尝试,以便有人可以建议修复/更改什么。顺便说一句,您的问题不符合SO规则,可能会被搁置,直到它符合此网站的要求。已编辑的我的问题我将以…节点只能有一个父节点开始。所以你每次都要创建新的精灵。此外,使用该计时器可能会在将来影响您,因为它没有暂停功能,因此您将与无效计时器/重新创建计时器/存储经过的时间等一起跳舞。使用
SKAction
,因为当节点暂停时,它会自动暂停。确定,那么,我如何创建一个与Obstacle1相同的新精灵,以及计时器的替代品呢?请查看我的答案。我想我涵盖了您感兴趣的所有内容,因此您可能会很容易地将代码修改为类似这样的内容。您可以复制并粘贴此代码以了解其工作原理。我找到了另一种方法,可以一次生成多个相同的SpriteNode,但感谢您提供了计时器的替代方案!:)@卢卡斯·多梅森:嗯,类似于使用update:method的方法也可以工作。但我个人更喜欢行动。如果你愿意,你可以发布你的解决方案给未来的读者。你也可以接受自己的答案:)