我想使用多个.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对这些东西有相当的经验,并且效果很好。

10-07 19:54
查看更多