SpriteKit удалить узел с помощью removeFromParent не работает - PullRequest
0 голосов
/ 25 июня 2019

В моей игре мне нужно полностью удалить некоторые узлы и попытаться сделать это, используя кнопку Delete!.Мой тестовый узел исчезает, но по-прежнему имеет размер, цвет и положение (см. Распечатки в моем коде).Я нашел несколько предыдущих обсуждений на похожую тему, но это не помогает.Как это возможно?Что я делаю не так?

вот мой код:

import SpriteKit
import GameplayKit

class GameScene: SKScene, ButtonDelegate {

  // Basic for dynamic sizes step 01
  var width = CGFloat()
  var height = CGFloat()

  var btnDelete = Button() // new button class
  var testNode = SKSpriteNode()

  override func didMove(to view: SKView) {

     // Basic for dynamic sizes step 02
     width = self.frame.size.width
     height = self.frame.size.height

     setBtnDelete()
     setTestNode()
     self.backgroundColor = UIColor.purple

  }

  func deleteNode(){
     testNode.removeFromParent()
     testNode.color = UIColor.cyan
     print("# func deleteNode() testNode.position after delete :\(testNode.position)")
     print("# func deleteNode() testNode.color after delete :\(testNode.color)")
     print("# func deleteNode() testNode.size after delete :\(testNode.size)")
  }

  func setTestNode(){
     testNode.size = CGSize(width: width*0.3, height: width*0.3)
     testNode.position = CGPoint(x: width*0.5, y: height*0.5)
     testNode.color = UIColor.red
     self.addChild(testNode)
  }

  func buttonClicked(sender: Button) {
    //print("# you clicked the button named \(sender.name!)")
    deleteNode()
  }

  func setBtnDelete(){

    btnDelete = Button(texture: nil, color: .orange, size: CGSize(width: width*0.2, height: width*0.1))
    btnDelete.name = "btnDelete"
    btnDelete.position = CGPoint(x: width*0.5, y: height*0.18)

    btnDelete.delegate = self
    btnDelete.zPosition = 2
    addChild(btnDelete)

    btnDelete.label.text = "Delete!"
    print("# func setBtnDelete() btnDelete.name:\(btnDelete.name!)")

  }
}

код кнопки класса:

import Foundation
import SpriteKit

protocol ButtonDelegate: class {
   func buttonClicked(sender: Button)
}

class Button: SKSpriteNode {

   //weak so that you don't create a strong circular reference with the parent
   weak var delegate: ButtonDelegate!
   var label = SKLabelNode()

   override init(texture: SKTexture?, color: SKColor, size: CGSize) {
      super.init(texture: texture, color: color, size: size)
      setup()
   }

   required init?(coder aDecoder: NSCoder) {
      super.init(coder: aDecoder)
      setup()
   }

   func setup() {
      isUserInteractionEnabled = true
      setLabel()
   }

   func setLabel() {
      label.zPosition = 1
      label.text = "Test"
      label.fontName = "Chalkduster"
      label.fontSize = 34
      label.numberOfLines = 0
      label.horizontalAlignmentMode = .center
      label.verticalAlignmentMode = .center
      label.fontColor = UIColor.darkGray
      label.fontName = "Chalkduster"

      self.addChild(label)

   }

   func btnDie() {
      self.isHidden = true
      self.removeFromParent()
   }

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
      setScale(0.9)
      self.delegate.buttonClicked(sender: self)
   }

   override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
      setScale(1.0)
   }
}

1 Ответ

0 голосов
/ 03 июля 2019

Вот обновление (см. Комментарий выше):

testNode должен быть необязательным:

 var testNode:SKSpriteNode?

Тогда (с помощью функции удаления) его можно установить равным нулю, и память будетосвобожден.

...