swift - SpriteKit 使用 removeFromParent 删除节点不起作用
问题描述
在我的游戏中,我需要使用 button 完全删除一些节点并尝试这样做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)
}
}
解决方案
这是一个更新(见上面的评论):
testNode 应该是可选的:
var testNode:SKSpriteNode?
然后(通过 delete 函数)可以将其设置为 nil 并释放内存。
推荐阅读
- ckeditor - 如何避免ckfinder重新处理图像?
- javascript - 带有classyloader的猫头鹰轮播圆形进度条给出getContext错误
- excel - 遍历集合
- c# - CollisionOnEnter 如何检测物体是否发生碰撞?
- assembly - mulw、prodl 和 prodh 在汇编程序中如何协同工作?
- python - 根据键值存储到“@myID”的路由
- r - 在 open.connection(x, "rb") 中出现错误:HTTP 错误 504.while Web 抓取使用 rvest
- postgresql - 获取表中的列名列表(PostgreSQL)
- python-3.x - python函数中标题的自动化
- javascript - 反应库代码中的花括号是什么意思?