我想使用多个.sks文件来存储一些复杂的SKNode层次结构,例如游戏菜单。我有一个移动物体的背景我想在整个游戏中保持,所以呈现不同的SKScenes并没有实现我想要的。我只限于一个场景,但我仍然希望尽可能地将我的代码与艺术作品分开,并尝试将所有内容压缩成一个.sks文件快速拥挤!
所以我想要多个.sks文件,每个文件存储一个不同的菜单:titleMenu,getReadyMenu,pauseMenu,gameOverMenu,每个菜单的所有元素都是空SKNode的后代。
我已经设法加载文件,将SKNode缓存在局部变量中,并在屏幕上显示,但是当我点击菜单按钮时,当我点击按钮外面时,从不调用touchesBegan函数在菜单上它是正常的响应链功能。非常困惑。
我确信我的解决方案是如此令人费解,以至于可以更简单地询问是否有人可以发布一个从.sks文件中获取SKNode(和子项)的示例,而不会显示新场景。
那么,有人可以在 Swift 中发布一个例子吗?
答案 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对这些东西有相当的经验,而且效果很好。