swift - 在 Swift 中从 .sks 场景文件加载 SKNode

标签 swift sprite-kit skscene sknode

我想使用多个 .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/

相关文章:

ios - 将导航堆栈的值存储在 iOS 字典中

swift - 编辑特定 ID 的核心数据键的值

ios - 如何为spritekit中的节点添加滑动手势

warnings - 关闭时的 UIAlertView 警告

swift - 重写 UILabel 文本 getter 不起作用

swift - 如果选择了按钮,如何在按钮周围绘制圆圈?

ios - 如何在 Swift 3 中将 SKSpriteNode 合并到 SKTexture 中以形成新的 SKSpriteNode?

ios - 使用 dispatch_async 在后台加载图像

swift - 在 swift 3 Spritekit 中返回上一个 View 时出错

swift - macOS - UserDefaults 在 Swift 和 Terminal 中是不同的