从Swift中的.sks场景文件加载SKNode

时间:2015-08-18 07:38:39

标签: swift sprite-kit skscene sknode

我想使用多个.sks文件来存储一些复杂的SKNode层次结构,例如游戏菜单。我有一个移动物体的背景我想在整个游戏中保持,所以呈现不同的SKScenes并没有实现我想要的。我只限于一个场景,但我仍然希望尽可能地将我的代码与艺术作品分开,并尝试将所有内容压缩成一个.sks文件快速拥挤!

所以我想要多个.sks文件,每个文件存储一个不同的菜单:titleMenu,getReadyMenu,pauseMenu,gameOverMenu,每个菜单的所有元素都是空SKNode的后代。

我已经设法加载文件,将SKNode缓存在局部变量中,并在屏幕上显示,但是当我点击菜单按钮时,当我点击按钮外面时,从不调用touchesBegan函数在菜单上它是正常的响应链功能。非常困惑。

我确信我的解决方案是如此令人费解,以至于可以更简单地询问是否有人可以发布一个从.sks文件中获取SKNode(和子项)的示例,而不会显示新场景。

那么,有人可以在 Swift 中发布一个例子吗?

1 个答案:

答案 0 :(得分:2)

创建新项目时,请选择游戏模板。 GameViewController.swift将在文件顶部定义以下扩展实现:

extension SKNode {
    class func unarchiveFromFile(file : String) -> 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
        }
    }
}

我还没有在Swift中做到这一点,但是使用Objective-C对这些东西有相当的经验,而且效果很好。