错误:尝试添加已经有父节点的 SKNode
Posted
技术标签:
【中文标题】错误:尝试添加已经有父节点的 SKNode【英文标题】:Error: Attemped to add a SKNode which already has a parent 【发布时间】:2017-01-02 17:36:15 【问题描述】:我正在使用 Swift 3 和 SpriteKit 做游戏,我试图声明一个全局变量以在 GameScene 类的其余部分中使用它,但我不能。我做了什么:
class GameScene: SKScene
...
let personaje = SKSpriteNode(imageNamed: "Ball2.png")
...
在全局声明之后,我尝试像这样在 sceneDidLoad 中使用它:
...
personaje.position = CGPoint.zero
addChild(personaje)
...
我不知道为什么,但 Xcode 返回此错误:
*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试添加一个 SKNode 已经有一个父母:名称:'(null)' 纹理:['Ball2.png' (150 x 146)] 位置:0, 0 比例:1.00, 1.00 大小:150, 146 锚点:0.5, 0.5 旋转:0.00'
提前感谢您的想法和解决方案!
【问题讨论】:
在addChild(personaje)
上放一个断点,看看它被调用了多少次。我怀疑它被多次调用。
【参考方案1】:
我怀疑您试图添加一个已经有父节点的 SKNode,这是不可能的。
在将节点添加到新父节点之前,将其从前一个父节点中删除:
personaje.removeFromParent();
addChild(personaje)
或创建一个新节点:
let newPersonaje = SKSpriteNode(imageNamed: "Ball2.png")
addChild(newPersonaje)
【讨论】:
【参考方案2】:错误是说您不能添加已经有父级的SKNode
。当您将personaje
节点声明为场景的属性时,您可以在场景中的任何位置引用它,但只需将其添加到场景中一次即可。
如果需要再次添加,必须先从其父级中移除:
personaje.removeFromParent()
addChild(personaje)
【讨论】:
【参考方案3】:正如其他答案中所述,您已声明并初始化了 var ,因此无需添加到当前类,因为它已经添加。
除了这种语法(如果由于 getter 只读属性而无需更改精灵),您还可以编写:
var personaje : SKSpriteNode!
get
return SKSpriteNode(imageNamed: "Ball2.png")
// you can also use only one line for convenience:
// var personaje : SKSpriteNode! get return SKSpriteNode(imageNamed: "Ball2.png")
override func didMove(to view: SKView)
addChild(personaje)
使用此代码,您可以声明您的全局变量,但当您将其添加到您的类时,它只会通过 getter 模式进行初始化。
【讨论】:
您甚至可以删除get
关键字及其personaje
属性的大括号(因为它是只读计算属性),只保留return
语句。以上是关于错误:尝试添加已经有父节点的 SKNode的主要内容,如果未能解决你的问题,请参考以下文章
Swift SpriteKit - “尝试添加一个已经有父节点的 SKNode”,同时添加关节
SpriteKit: NSInvalidArgumentException - 试图添加一个已经有父节点的 SKNode