2017-01-02 12 views
6

bir ebeveyni bir SKNode eklemek attemped 't. Yaptıklarımı:Hata: zaten ben Swift 3 ve SpriteKit bir oyun yapıyorum ve GameScene sınıfın geri kalanında onunla çalışmak için global bir değişkeni bildirmek için çalışıyorum ama can

class GameScene: SKScene { 

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

Seni öyle sceneDidLoad bunu kullanmaya çalıştı küresel beyanı sonra:

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

Nedenini bilmiyorum ama Xcode bu hatayı döndürür:

*** 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'

fikirlerinizi ve çözüm için şimdiden

teşekkürler!

+0

addChild 'üzerinde (personaje)' Bir kesme noktası koyun ve denir kaç kez görüyoruz. Bir kereden fazla çağrıldığından şüpheleniyorum. – Alexander

cevap

5

ben zaten mümkün olmayan bir ebeveyn vardır bir SKNode ekleme girişiminde şüpheli. yeni bir düğüm

personaje.removeFromParent(); 
addChild(personaje) 

veya oluşturun:

yenisiyle eklemeden önce prevous ebeveynden düğümü çıkarın

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

hata bir SKNode ekleyemezsiniz söyleyerek olduğunu zaten bir ebeveyn var. Sahnenin bir özelliği olarak personaje düğümünü bildirdiğinizde, sahnede herhangi bir yere başvurabilirsiniz, ancak bunu yalnızca sahneye bir kez eklemeniz gerekir.

personaje.removeFromParent() 
addChild(personaje) 
2

olarak beyan ettiğiniz diğer yanıtlar açıkladı ve bir var başlatıldı, bu yüzden eklemek gerek yoktur:

yeniden eklemeniz gerekirse, önce üst öğesinden kaldırmanız gerekir mevcut sınıf zaten eklendiğinden. (Nedeniyle getter salt okunur özellik için sprite değiştirmek gerekmez varsa) yerine bu sözdizimi

, ayrıca yazabilirsiniz: Bu kod ile

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

global Var ilan edebilir ama dersinize eklediğinizde yalnızca alıcı moduyla başlatılacaktır.

+0

Hatta 'get' anahtar kelime ve' personaje' özellik için onun parantez çıkarın (salt okunur olduğu için hesaplanmış mülk) ve sadece 'return' deyimi bırakabilir. – Whirlwind

+0

@Whirlwind Evet, iyi bir ek, teşekkürler. –

İlgili konular