【问题标题】:Loading an SKNode from a .sks scene file in Swift在 Swift 中从 .sks 场景文件加载 SKNode
【发布时间】:2015-08-18 07:38:39
【问题描述】:

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

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

我已设法加载文件,将 SKNode 缓存在局部变量中,并将其显示在屏幕上,但是当我单击菜单按钮时,当我在按钮外单击时,从不调用 touchesBegan 函数在菜单上,它是正常的响应者链功能。很费解。

我确信我的解决方案非常复杂,如果有人可以发布一个示例,从 .sks 文件中仅提取一个 SKNode(和子节点),而不呈现新场景,这会更简单。

那么,有人可以在 Swift 中发布一个这样的示例吗?

【问题讨论】:

  • 你在哪里处理触摸?如果它在场景内部,请确保场景接收到触摸,即没有将userInteractionEnabled 设置为 YES 的下杆节点。如果您在节点内部处理触摸,请确保接收触摸的节点(userInteractionEnabled = YES 也是如此)具有(至少)touchesBegan:withEvent 的自定义实现。

标签: swift sprite-kit skscene sknode


【解决方案1】:

创建新项目时,选择游戏模板。 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 的这些东西有相当的经验,而且效果很好。

【讨论】:

  • 它抱怨.DataReadingMappedIfSafeType of expression is ambitous without more context 有什么解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
相关资源
最近更新 更多