2017-01-02 62 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 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模式進行初始化。

+0

你甚至可以刪除'get'關鍵字及其對'personaje'屬性的大括號(因爲它是隻讀的計算屬性),只留下'return'語句。 – Whirlwind

+0

@Whirlwind是的,好的補充,謝謝。 –

相關問題