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

从Swift中的.sks场景文件加载SKNode,swift,sprite-kit,skscene,sknode,Swift,Sprite Kit,Skscene,Sknode,我想使用多个.sks文件来存储一些复杂的SKNode层次结构,例如游戏菜单。我有一个移动物体的背景,我想在整个游戏中保持它,所以呈现不同的场景并不能达到我想要的效果。我被限制在一个场景中,但我仍然希望尽可能多地将我的代码从艺术品中分离出来,并尝试将所有内容压缩到一个。sks文件会很快变得拥挤 因此,我希望有多个.sks文件,每个文件存储一个不同的菜单:titleMenu、getReadyMenu、pauseMenu、gameOverMenu,每个菜单的所有元素都是空SKNode的后代 我已成功加

我想使用多个.sks文件来存储一些复杂的SKNode层次结构,例如游戏菜单。我有一个移动物体的背景,我想在整个游戏中保持它,所以呈现不同的场景并不能达到我想要的效果。我被限制在一个场景中,但我仍然希望尽可能多地将我的代码从艺术品中分离出来,并尝试将所有内容压缩到一个。sks文件会很快变得拥挤

因此,我希望有多个.sks文件,每个文件存储一个不同的菜单:titleMenu、getReadyMenu、pauseMenu、gameOverMenu,每个菜单的所有元素都是空SKNode的后代

我已成功加载文件,将SKNode缓存在局部变量中,并在屏幕上显示它,但当我单击菜单按钮时,从未调用ToucheSBegind函数,当我在菜单按钮外单击时,这是正常的响应器链功能。非常令人困惑

我确信我的解决方案非常复杂,只需询问某人是否可以发布一个示例,从.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使用这种东西有着相当丰富的经验,而且效果很好。

您在哪里处理触摸?如果它在场景内,请确保场景接收到触摸,即不存在
userInteractionEnabled
为YES的较低级别节点。如果您在节点内部处理触摸,请确保接收触摸的节点(因此使用
userInteractionEnabled=YES
)具有(至少)的自定义实现
touchsbegind:withEvent
。它抱怨
。DataReadingMappedIfSafe
带有
的表达式类型是模糊的,没有更多上下文
对此有任何解决方案吗?