Попытка добавить SKNode, у которого уже есть родительский и поток 1: signal SIGABRT

#ios #swift #sprite-kit #sigabrt

#iOS #swift #sprite-kit #sigabrt

Вопрос:

Я пытаюсь использовать свой класс Asteroid, но продолжаю получать это сообщение об ошибке. Я перепробовал все, но, похоже, не могу понять это.

Появляется только один астероид, а затем появляется поток на

AppDelegate: поток 1: signal SIGABRT

Я новичок в swift, и любая помощь будет приветствоваться.

 class Asteroides:SKSpriteNode {

    init(img:String){
        let texture = SKTexture(imageNamed: img)
        super.init(texture: texture, color: .clear, size: texture.size())
        self.name = "Asteroid"
        self.setScale(0.2)
        self.zPosition = 2

        self.physicsBody = SKPhysicsBody(circleOfRadius: self.size.width/3.3, center: self.anchorPoint)
        self.physicsBody!.affectedByGravity = false
        self.physicsBody!.categoryBitMask = GameScene.physicsCategories.asteroid
        self.physicsBody!.collisionBitMask = GameScene.physicsCategories.none
        self.physicsBody!.contactTestBitMask  = GameScene.physicsCategories.planet | GameScene.physicsCategories.bullet
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func random() -> CGFloat {
        return CGFloat(Float(arc4random()) / 0xFFFFFFFF) //générer un nombre aléatoire
    }


    func random(min: CGFloat, max: CGFloat) -> CGFloat {
        return random() * (max - min)   min
    }


    func addAsteroid (parent: GameScene)  {

        let randomStart1 = random(min: self.size.height/2, max: parent.size.height - self.size.height/2)
        let startPoint1 =  CGPoint(x:randomStart1 , y:parent.size.width   self.size.width/2 )
        let endPoint1   =  CGPoint(x: randomStart1, y: -self.size.width/2)

        self.position = startPoint1
        parent.addChild(self)

        let moveAsteroid = SKAction.move(to: endPoint1 , duration: 3.5)
        let deleteAsteroide = SKAction.removeFromParent()
        let asteroidSeq = SKAction.sequence([moveAsteroid,deleteAsteroide])

        self.run(SKAction.repeatForever(asteroidSeq))
    }
 }
 

В игровой сцене :

  private var asteroide = Asteroides(img: "Asteroid")

    func newlevel(){
        func parametersLevel(spawn : SKAction){
            let spawning = spawn
            let waitSpawn = SKAction.wait(forDuration: 0.8)
            let sequence = SKAction.sequence([waitSpawn,spawning])//sequence:asteroides attendre 0.8 sec
            let spawnForever = SKAction.repeatForever(sequence)
            self.run(spawnForever)
        }
        parametersLevel(spawn:SKAction.run(asteroids))
    }

    func asteroids (){
        asteroide.addAsteroid(parent: self)
     }
 

Комментарии:

1. У вас есть только один узел asteroid. При каждом запуске asteroids вы добавляете этот узел; при втором запуске вы получаете сбой. Вам нужно каждый раз выделять новый астероид и добавлять его в массив или аналогичный

2. Не могли бы вы привести мне пример, пожалуйста? Я не вижу, как это сделать. Спасибо