错误:尝试添加已经有父节点的 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的主要内容,如果未能解决你的问题,请参考以下文章

尝试添加已经有父节点的 SKNode

Swift:尝试添加一个已经有父节点的 SKNode:

Swift SpriteKit - “尝试添加一个已经有父节点的 SKNode”,同时添加关节

尝试添加一个已经有父错误的 SKNode

尝试添加一个已经有父节点的 SKNode

SpriteKit: NSInvalidArgumentException - 试图添加一个已经有父节点的 SKNode