2017-01-02 10 views
6

Swift 3とSpriteKitでゲームをやっていて、残りのGameSceneクラスでグローバル変数を宣言しようとしていますが、 't。私がやったことを:エラー:既に親を持っているSKNodeを追加しようとしました

class GameScene: SKScene { 

    ... 
    let personaje = SKSpriteNode(imageNamed: "Ball2.png") 
    ... 

私はちょうどそのようなsceneDidLoadでそれを使用しようとしたグローバル宣言した後:

... 
personaje.position = CGPoint.zero 
addChild(personaje) 
... 

私はなぜ知らないが、Xcodeは、このエラーを返します:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent: name:'(null)' texture:[ 'Ball2.png' (150 x 146)] position:{0, 0} scale:{1.00, 1.00} size:{150, 146} anchor:{0.5, 0.5} rotation:0.00'

あなたのアイデアや解決策をお寄せいただきありがとうございます!

+0

'addChild(personaje)'にブレークポイントを設定し、呼び出された回数を確認します。私はそれが複数回呼び出されていると思う。 – Alexander

答えて

5

親が既に存在するSKNodeを追加しようとしたと思われますが、これは不可能です。

新しいものに追加する前にprevous親からノードを削除します。

personaje.removeFromParent(); 
addChild(personaje) 

または新しいノードを作成:

let newPersonaje = SKSpriteNode(imageNamed: "Ball2.png") 
addChild(newPersonaje) 
2

をエラーは、あなたがそのSKNodeを追加することはできませんと言っていますすでに親がいます。 personajeノードをシーンのプロパティとして宣言しているときは、シーン内の任意の場所を参照できますが、そのシーンに一度だけ追加する必要があります。

あなたは再びそれを追加する必要がある場合は、あなたが最初に親からそれを削除する必要があります。

personaje.removeFromParent() 
addChild(personaje) 
2

としては、あなたが宣言されている他の回答で説明してVARを初期化し、これに追加する必要はありません既に追加されているため、現在のクラスです。代わりに、この構文の

(あなたが原因ゲッター読み取り専用プロパティにあなたのスプライトを変更する必要がない場合)、あなたも書き込むことができます。

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) 
} 

このコードでは、あなたのグローバルなVARを宣言することができますが、クラスに追加すると、ゲッターモードでのみ初期化されます。

+0

'get'キーワードと' personaje'プロパティの中カッコを削除することもできます(読み込み専用の計算されたプロパティなので)。 'return'文だけを残してください。 – Whirlwind

+0

@Whirlwindうん、いい加減、ありがとう。 –

関連する問題