(Swift + Spritekit) — полностью удалить узел и его данные

Я работаю над небольшой игрой для iOS.

У меня есть SKSpriteNode в моей сцене — когда я удаляю его с помощью «removeFromParent» и касаюсь области, в которой он был последним, я все равно получаю функцию.

Мой код выглядит следующим образом:

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    /* Called when a touch begins */

    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)

        if tapToPlayNode.containsPoint(location){
            tapToPlayNode.removeFromParent()
            startNewGame()
        }
    }
}

func startNewGame(){
    //Starts a new game with resetted values and characters in position
    println("Ready.. set.. GO!")

    //Shows the ui (value 1)
    toggleUiWithValue(1)
}

Другими словами, я получаю "Готово.. установлено.. ВПЕРЕД!" вывод, когда я касаюсь области, даже после того, как она была удалена.

Любые подсказки?

Бестс,


person doingSomeSwiftHere    schedule 23.03.2015    source источник


Ответы (1)


Ваш tapToPlayNode по-прежнему сохраняется у себя и удаляется от своего родителя. Вы должны сделать его необязательным var tapToPlayNode:SKSpriteNode? и обнулить его после удаления из родителя следующим образом:

if let playNode = self.tapToPlayNode {
   for touch: AnyObject in touches {
   let location = touch.locationInNode(self)

        if playNode.containsPoint(location) {
            playNode.removeFromParent()
            startNewGame()
            self.tapToPlayNode = nil // il it here!
            break
        }
    }
}

Вы также можете не сохранять ссылку на свой tapToPlayNode и давать ему имя при инициализации следующим образом:

node.name = @"tapToPlayNodeName"
// Add node to scene and do not keep a var to hold it!

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
/* Called when a touch begins */

    // Retrieve the ode here
    let tapToPlayNode = container.childNodeWithName("tapToPlayNodeName")!
    for touch: AnyObject in touches {
       let location = touch.locationInNode(self)

        if tapToPlayNode.containsPoint(location){
            tapToPlayNode.removeFromParent()
            startNewGame()
        }
    }
}
person bsarr007    schedule 23.03.2015
comment
Большое спасибо за быстрый ответ, Бсарр! Однако один краткий рассказ: когда я использую var tapToPlayNode:SKSpriteNode? Кажется, я не могу текстурировать узел? - person doingSomeSwiftHere; 23.03.2015
comment
@ bsarr007 Нужно ли обнулять SKSpriteNode после перезапуска новой игры или он все еще работает после удаления его из родителя перед запуском новой игры? В настоящее время мне нужно стереть список необязательных SKSpriteNodes, но, похоже, он не работает, установив для них значение nil после их удаления из родителя. Спасибо. - person J.Treutlein; 20.01.2017
comment
@J.Treutlein, я точно не знаю вашей проблемы, но во втором примере, который я привел, вам не нужно ничего обнулять, на SpriteKitNode "tapToPlayNodeName" просто ссылаются по имени, нет переменной, которая его удерживает, после ее удаления от его родителя он больше не упоминается. - person bsarr007; 23.01.2017