removeFromParent()奇怪的行为
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了removeFromParent()奇怪的行为相关的知识,希望对你有一定的参考价值。
我的功能removeFromParent
真的很奇怪
lazy var buttonAds: SKSpriteNode = {
let n = SKSpriteNode(imageNamed: "ButtonAds")
n.position = CGPoint(x: size.width / 2, y: 600)
n.zPosition = 100
n.setScale(1.4)
return n
}()
在didMove(...)
中添加此按钮与addChild(buttonAds)
,后者在touchesBegan
:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first!
if buttonAds.contains(touch.location(in: self)) {
// ...
doAds()
buttonAds.removeFromParent()
}
}
如果你点击广告按钮,将被删除,但如果再次点击那个地方,这将再次调用函数doAds()
...这很奇怪,buttonAd在场景中不存在。
初始:
点击后:
谢谢
答案
您要做的是检查您触摸的节点是否属于它应该的类型。将您的代码更改为:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first!
if nodeAtPoint(touch.locationInNode(self)) == buttonAds {
doAds()
buttonAds.removeFromParent()
}
}
这应该做的伎俩!
编辑:至于为什么这样做,你是从场景中删除节点,但它仍然是内存中的一个对象(否则你将无法在其上使用buttonAds.contains(...)
)所以它仍然存储它的位置。
以上是关于removeFromParent()奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章
SKNode 上的 removeFromParent 是不是会破坏实例?
LLVM 错误:发现损坏的函数,编译中止!在 removeFromParent() 之后