我正在使用Swift 3和SpriteKit进行游戏,我尝试在GameScene的其余部分中声明一个全局变量来处理它但我无法做到。我做了什么:
...
personaje.position = CGPoint.zero
addChild(personaje)
...
在全局声明之后,我试图在sceneDidLoad中使用它:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TableLayout
android:id="@+id/tableLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TableRow
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textSize="11sp"
android:text="Falta 220 V" />
<RadioGroup android:orientation="horizontal">
<RadioButton android:id="@+id/rdAlarma"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:textStyle="bold"
android:text="SI" />
<RadioButton android:id="@+id/rdCCTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:textStyle="bold"
android:text="NO" />
<RadioButton android:id="@+id/rdIncedio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11sp"
android:textStyle="bold"
android:text="NA" />
</RadioGroup>
</TableRow>
</TableLayout>
</LinearLayout>
</FrameLayout>
我不知道为什么但Xcode会返回此错误:
***由于未捕获的异常终止应用&#39; NSInvalidArgumentException&#39;,原因:&#39;尝试添加一个SKNode 已经有一个父母:姓名:&#39;(null)&#39; 质地:[&#39; Ball2.png&#39; (150 x 146)]职位:{0,0} 比例:{1.00,1.00}大小:{150,146}锚:{0.5,0.5}轮换:0.00&#39;
提前感谢您的想法和解决方案!
答案 0 :(得分:7)
我怀疑您是否尝试添加已有父级的SKNode,这是不可能的。
在将节点添加到新节点之前,从普通父节点中删除该节点:
personaje.removeFromParent();
addChild(personaje)
或创建一个新节点:
let newPersonaje = SKSpriteNode(imageNamed: "Ball2.png")
addChild(newPersonaje)
答案 1 :(得分:2)
错误在于您无法添加已有父级的SKNode
。当您将personaje
节点声明为场景的属性时,您可以在场景中的任何位置引用它,但您只需将其添加到场景一次。
如果您需要再次添加,则必须先将其从父目录中删除:
personaje.removeFromParent()
addChild(personaje)
答案 2 :(得分:2)
正如在其他答案中所解释的那样,您已声明并初始化了一个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模式进行初始化。