Ошибка при нажатии на экран в области удаленного Узла в Sprite Kit

swift
spritekit

#1

Добрый день, подскажите пожалуйста как исправить возникшую проблему.
На сцене имеется сундук, при нажатии на который он открывается, из него выпадает банка.
Затем узел сундука удаляется постепенно становясь прозрачнее.
Однако если после удаления узла сундука нажать на область где он располагался, то игра крашится.
Ошибка:

*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘Attemped to add a SKNode which already has a parent: name:’(null)’ texture:[ ‘healthBottle1’ (400 x 440)] position:{667, 255} scale:{1.00, 1.00} size:{200, 220} anchor:{0.5, 0.5} rotation:0.00’

на сколько я понял ошибка говорит о том, что я повторно пытаюсь вызвать узел банки, который уже присутствует на сцене.

Я правильно понимаю, что необходимо либо сделать проверку по типу: если узел сундука присутствует на сцене, то отрабатывается код вызова банки, если нет то нет.
Либо сделать так, чтобы код открытия сундука и “вызова” банки срабатывал только 1 раз?

Подскажите как это реализовать.

    //сундук
    chest = SKSpriteNode(imageNamed: "closeChest")
    chest.position = CGPoint(x: size.width / 2 + 200, y: size.height / 2 - 90)
    chest.zPosition = 1
    addChild(chest)
    
    
    // банка здоровья
    healthBottle = SKSpriteNode(imageNamed: "healthBottle1")
    healthBottle.position = CGPoint(x: size.width / 2 , y: size.height / 2 - 120)
    healthBottle.zPosition = 2
    let healthBottleTexture = [SKTexture(imageNamed: "healthBottle2"), SKTexture(imageNamed: "healthBottle3"), SKTexture(imageNamed: "healthBottle4"), SKTexture(imageNamed: "healthBottle1")]
    let healthBottleAnimate = SKAction.animate(with: healthBottleTexture, timePerFrame: 0.3)
    let healthRepeat = SKAction.repeatForever(healthBottleAnimate)
    healthBottle.run(healthRepeat)
    
    
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch: AnyObject in touches {
        let location = touch.location(in: self)
        if chest.contains(location) {
            touchingChest = true
            addChild(healthBottle)
            let openChestTexture = SKTexture(imageNamed: "openChest")
            let openChestAction = SKAction.animate(with: [openChestTexture], timePerFrame: 1)
            let chestWait = SKAction.wait(forDuration: 1)
            let chestAlpha1 = SKAction.fadeAlpha(to: 0.7, duration: 1)
            let chestAlpha2 = SKAction.fadeAlpha(to: 0.3, duration: 1)
            let chestAlpha3 = SKAction.fadeAlpha(to: 0.1, duration: 1)
            let chestDelete = SKAction.removeFromParent()
            let chestSequence = SKAction.sequence([openChestAction, chestWait, chestAlpha1, chestAlpha2, chestAlpha3, chestDelete])
            chest.run(chestSequence)
            
        }
    }
    
}

#2

возможно так?)
var num = 0 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch: AnyObject in touches { let location = touch.location(in: self) num += 1 if chest.contains(location) { let openChestTexture = SKTexture(imageNamed: "openChest") let openChestAction = SKAction.animate(with: [openChestTexture], timePerFrame: 1) let chestWait = SKAction.wait(forDuration: 1) let chestAlpha1 = SKAction.fadeAlpha(to: 0.7, duration: 1) let chestAlpha2 = SKAction.fadeAlpha(to: 0.3, duration: 1) let chestAlpha3 = SKAction.fadeAlpha(to: 0.1, duration: 1) let chestDelete = SKAction.removeFromParent() let chestSequence = SKAction.sequence([openChestAction, chestWait, chestAlpha1, chestAlpha2, chestAlpha3, chestDelete]) if (num == 1){ touchingChest = true chest.run(chestSequence) addChild(healthBottle) } else{ touchingChest = false } } } }


#3

Cпасибо большое:)

Пойду ка я заново базовый курс проходить:sweat_smile: