2014-11-18 9 views
0

내 스프라이트 키트 프로젝트에는 지상 physicsBody 및 배경 그래픽이 포함 된 장면 .sks 파일이 있습니다. 장면이이 파일에서로드됩니다. 또한 container라는 빈 노드가 있습니다. 블록과 적을 포함하는 각 레벨마다 다른 .sks 파일이 있습니다. 내 장면을 초기화 할 때 내 수준 .sks 파일 중 하나에서 수준을로드하고 (SKScene을 SKNode로 캐스팅) 빈 "컨테이너"노드에 추가합니다.SpriteKit은 한 노드의 자식을 다른 노드에 추가합니다.

import SpriteKit 

extension SKNode { 
    class func unarchiveFromFile(file : NSString) -> SKNode? { 
     if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") { 
      var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)! 
      var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData) 

      archiver.setClass(SKNode.classForKeyedUnarchiver(), forClassName: "SKScene") 
      let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKNode 
      archiver.finishDecoding() 
      return scene 
     } else { 
      return nil 
     } 
    } 
} 

class GameScene: SKScene { 
    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     self.childNodeWithName("//container")?.addChild(SKNode.unarchiveFromFile("level1")!) 
    } 

    override class func unarchiveFromFile(file : NSString) -> SKNode? { 
     if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") { 
      var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)! 
      var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData) 

      archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene") 
      let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene 
      archiver.finishDecoding() 
      return scene 
     } else { 
      return nil 
     } 
    } 
} 

그러나이 노드 계층 구조에 빈되지 않는 노드가 있음을 의미 : 나는이 코드를 사용

Scene 
-background 
-ground 
-container 
--level scene(cast to SKNode) <- empty node here 
---block 
---enemy 

그래서 내 질문은 : 어떻게 하나 개의 노드의 아이들이 다른 추가하는 방법은 무엇입니까?
-I 직접 내가이 (안된) 트릭을 할해야

답변

1

는 그냥 children 배열을 반복 - 새 부모에 노드를 추가 할 다시 SKNode-AnyObject에서 캐스팅해야합니다 :

for node in oldParentNode.children { 
    node.removeFromParent() 
    newParentNode.addChild(node as AnyObject) 
} 
0

모든 속성을 풀로 - 난 컨테이너 노드를 대체 할 수
(할당되지 않음) 어린이 속성을 설정할 수 없습니다, 단지 그들에게 하나 하나를 추가

for (CCNode* node in [oneNode.children copy]) 
{ 
    [node removeFromParent]; 
    [anotherNode addChild:node]; 
} 

어린이 배열을 열거하는 동안 변형시키지 않으려면 사본이 필요합니다. 또는 reverseObjectEnumerator를 사용할 수도 있습니다. addChild : 이미 부모가있는 노드에 대해 불평하지 않도록 노드를 제거해야합니다.

+0

감사합니다 - 그것 빠른에 포트에 쉽게해야하고, 스프라이트 키트는 일부 부품에서 cocos2d와 매우 유사합니다. – Okapi

관련 문제