我想使用多个 .sks 文件来存储一些复杂的 SKNode 层次结构,例如游戏菜单。我有一个移动物体的背景,我想在整个游戏中保留它,所以呈现不同的 SKScenes 并不能达到我想要的效果。我被限制在一个场景中,但我仍然想尽可能地将我的代码与艺术品分开,并且试图将所有内容压缩到一个 .sks 文件中很快就会变得拥挤!
所以我想要多个 .sks 文件,每个文件存储不同的菜单:titleMenu、getReadyMenu、pauseMenu、gameOverMenu,每个菜单的所有元素都是空 SKNode 的后代。
我已经设法加载文件,将 SKNode 缓存在局部变量中,并将其显示在屏幕上,但是当我点击菜单按钮时,touchesBegan 函数永远不会被调用,当我点击按钮外部时在菜单上它是正常的响应链功能。非常令人费解。
我确信我的解决方案非常复杂,如果有人可以发布一个从 .sks 文件中仅抓取 SKNode(和子节点)而不呈现新场景的示例,会更简单。
那么,有人可以在 Swift 中发布一个这样的例子吗?
最佳答案
创建新项目时,选择游戏模板。 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 的这些东西相当有经验,而且效果很好。
关于swift - 在 Swift 中从 .sks 场景文件加载 SKNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32066375/