如何使用SpriteNode所在的spritekit存档文件,并将SpriteNode实例化为“子”(使用Swift?)
我可以使用scene.childNodeWithName(“mysprite”)找到该节点,但我不知道如何将它变成我的SKSpriteNode子类的实例。
答案 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:)
基于类名工作,因此如果您的存档包含同一类的多个对象并且您想要解码一个1},则它的用途有限他们作为一个与其他人不同的阶级。在这种情况下,您可能会考虑使用其他unarchiver技巧 - 例如,替换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
}
}