使用.sks文件布局复杂对象与SKScene文件

时间:2017-01-24 21:17:57

标签: ios swift sprite-kit swift3 xcode8

是否可以使用SceneEditor进行布局和放大创建一个复杂的SKSpriteNode子类,加载该信息并根据sks文件在场景中创建自定义对象?

我的场景是我有一个弹出对话框(只不过是SKSpriteNodes的子类),对话框中有很多孩子。我希望在场景编辑器中将其列出类似于我如何布置SKScene,然后在需要时将其呈现在我的场景中。

我意识到我可以在我的GameScene.sks文件中创建这个对象,但发现那些可能很容易混乱,并认为如果每个都有自己的sks文件,它可能是存储这些拨号的更好方法。

我尝试过扩展SKSpriteNode以访问类似于Scene文件的文件,但它不起作用

if let teamDialog = SKSpriteNode.spriteWithClassNamed(className: "TeamDialog", fileName: "TeamDialog.sks") { }

extension SKSpriteNode {

    static func spriteWithClassNamed(className: String, fileName: String) -> SKSpriteNode? {

        guard let dialog = SKSpriteNode(fileNamed: fileName) else {
                return nil
        }

        return dialog
    }
}

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以使用此委托https://github.com/ice3-software/node-archive-delegate

或者,在swift中像这样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
    }
}

更新Swift 3并修复类转换:

func unarchiveNodeFromFile(file:String)-> SKNode? {
    if let path = Bundle.main.path(forResource: file, ofType: "sks") {
        let fileData = NSData.init(contentsOfFile: path)
        let archiver = NSKeyedUnarchiver.init(forReadingWith: fileData as Data!)
        archiver.setClass(SKNode.classForKeyedUnarchiver(), forClassName: "SKScene")
        let node = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! SKNode
        archiver.finishDecoding()
        return node
    } else {
        return nil
    }
}