2017-01-02 3 views
6

저는 Swift 3 및 SpriteKit으로 게임을하고 있으며 전역 변수를 GameScene 클래스의 나머지 부분에서 사용할 수 있도록 선언하려고합니다. '티. 내가 무슨 짓을 :오류 : 이미 부모가있는 SKNode를 추가하려고 시도했습니다.

class GameScene: SKScene { 

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

을 내가 그냥 같은 sceneDidLoad에서 그것을 사용하려 글로벌 선언 후 :

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

그 이유를 모르지만 엑스 코드는이 오류를 반환

*** 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를 추가하려했으나 가능하지 않습니다. 새 노드

personaje.removeFromParent(); 
addChild(personaje) 

을 만들거나 :

새에 추가하기 전에 prevous 부모에서 노드를 제거

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를 선언 할 수 있지만, 클래스에 추가 할 때 getter 모드를 통해서만 초기화됩니다.

+0

'get' 키워드와'personaje' 속성에 대한 중괄호 (읽기 전용 계산 속성이기 때문에)를 제거하고'return' 문만 남겨 둘 수 있습니다. – Whirlwind

+0

@Whirlwind 네, 좋았어, 고마워. –

관련 문제