Swift SpriteKit添加一个节点';把孩子传给别人
在我的精灵工具包项目中,我有一个scene.sks文件,其中包含地面物理体和背景图形。场景将从此文件加载。它还包含一个名为container的空节点。我有另一个.sks文件为每个级别,其中包含块和敌人。当我的场景被初始化时,我从我的一个level.sks文件加载一个level(将SKScene转换为SKNode)并添加到空的“container”节点中。我使用以下代码:Swift SpriteKit添加一个节点';把孩子传给别人,swift,sprite-kit,Swift,Sprite Kit,在我的精灵工具包项目中,我有一个scene.sks文件,其中包含地面物理体和背景图形。场景将从此文件加载。它还包含一个名为container的空节点。我有另一个.sks文件为每个级别,其中包含块和敌人。当我的场景被初始化时,我从我的一个level.sks文件加载一个level(将SKScene转换为SKNode)并添加到空的“container”节点中。我使用以下代码: import SpriteKit extension SKNode { class func unarchiveFr
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
场景
-背景
-地面
-容器
--水平场景(投射到SKNode)这应该可以完成技巧(未测试),只需逐个添加它们:
for (CCNode* node in [oneNode.children copy])
{
[node removeFromParent];
[anotherNode addChild:node];
}
需要该副本以避免在枚举子数组时对其进行变异。或者,也可以使用reverseObjectEnumerator。必须删除节点,以便addChild:不会抱怨节点已经有父节点。只需迭代子节点
数组-您需要从任何对象
转换回SKNode
,将节点添加到新的父节点:
for node in oldParentNode.children {
node.removeFromParent()
newParentNode.addChild(node as AnyObject)
}
感谢它应该很容易移植到swift,而且sprite工具包在某些方面与cocos2d非常相似