Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift SpriteKit添加一个节点';把孩子传给别人_Swift_Sprite Kit - Fatal编程技术网

Swift SpriteKit添加一个节点';把孩子传给别人

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

在我的精灵工具包项目中,我有一个scene.sks文件,其中包含地面物理体和背景图形。场景将从此文件加载。它还包含一个名为container的空节点。我有另一个.sks文件为每个级别,其中包含块和敌人。当我的场景被初始化时,我从我的一个level.sks文件加载一个level(将SKScene转换为SKNode)并添加到空的“container”节点中。我使用以下代码:

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非常相似