如何将SpriteKit存档与SKSpriteNode子类一起使用

时间:2014-06-28 11:53:33

标签: swift sprite-kit

如何使用SpriteNode所在的spritekit存档文件,并将SpriteNode实例化为“子”(使用Swift?)

我可以使用scene.childNodeWithName(“mysprite”)找到该节点,但我不知道如何将它变成我的SKSpriteNode子类的实例。

2 个答案:

答案 0 :(得分:5)

在Xcode 6的SpriteKit编辑器中无法为节点设置自定义类。(但这对于向Apple提交的文件来说是个很棒的feature request。)

但是,您在Xcode中生成的sks文件只是NSKeyedArchiver个存档,您可以使用NSKeyedUnarchiver选项来控制在加载时实例化对象的方式。因此,有一个(有限的)选项可以在加载时更改类 - 当您在Xcode 6中创建一个新的SpriteKit Game项目时,您可以在模板代码中看到这一点。

SKNode中查看GameViewController.m扩展程序(或ObjC版本中的类别):它使用NSKeyedUnarchiver方法setClass(_:, forClassName:)来处理SKScene实例存档作为模板项目的GameScene类的实例。您可以扩展此模式以从Xcode创建的存档创建其他自定义场景类。

您会注意到,setClass(_:forClassName:)基于类名工作,因此如果您的存档包含同一类的多个对象并且您想要解码一个unarchiver(_:didDecodeObject:)委托方法中的对象。

答案 1 :(得分:1)

您可以使用此委托https://github.com/ice3-software/node-archive-delegate 或者,为了迅速实施,smt像这样:

class func unarchiveNodeFromFile(file:String)-> SKNode? {
    if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
        var fileData = NSData.dataWithContentsOfFile(path, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil)
        var archiver = NSKeyedUnarchiver(forReadingWithData: fileData)
        archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKNode")
        let node = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKNode
        archiver.finishDecoding()
        return node
    } else {
        return nil
    }
}