2014-11-18 5 views
0

В моем проекте создания спрайтов у меня есть файл сценария .sks, который содержит наземную физику и фоновую графику. Сцена будет загружена из этого файла. Он также содержит пустой узел, называемый контейнером. У меня есть еще один файл .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 

поэтому мой вопрос: как я могу добавить ребенок одного узла к другому?
Я не могу сразу установить свойство детей (не назначаемое)
Я не могу заменить узел контейнера, как я потеряю все свои свойства

ответ

1

Просто перебрать children массив - вам нужно отливать из AnyObject обратно в SKNode добавить узел к новому родителю:

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]; 
} 

Копия необходима, чтобы избежать мутирования массива children при ее перечислении. В качестве альтернативы вы также можете использовать reverseObjectEnumerator. Удаление узла должно выполняться так: addChild: не будет жаловаться на узел, у которого уже есть родитель.

+0

Благодаря-это должно быть легко портировать на быстрое и спрайт комплект очень похож в некоторых частях на cocos2d – Okapi

Смежные вопросы