未显示 SKS 的内容

Content of SKS not displayed

也许你能帮我。

我有一个主场景叫GameScene.sks。在这个场景中,我尝试展示玩家输掉游戏时的游戏结束场景。为此,我创建了一个带有 GameOver 标签和彩色精灵背景图像的 GameOverScene.sks。

要显示游戏结束场景,我使用以下命令:

var secondScene = GameOverScene(size: self.size)
var transition = SKTransition.flipVerticalWithDuration(1.0)
secondScene.scaleMode = SKSceneScaleMode.AspectFill
self.scene!.view?.presentScene(secondScene, transition: transition)

显示了一个场景,但没有显示我在sks中定义的节点。我不知道为什么,你能帮帮我吗?在 Xcode 编辑器中显示 GameOverScene.sks 的所有节点。

谢谢!

您没有从文件加载 GameOverScene,只是初始化一个空对象,它不会因为同名而神奇地加载 :)

要从文件加载它,请使用 unarchivefromFile: 方法,该方法在新的 sprite 工具包项目中作为样板代码提供。

extension SKNode {
    class func unarchiveFromFile(file : NSString) -> 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 SKScene
            archiver.finishDecoding()
            return scene
        } else {
            return nil
        }
    }
}

并像这样使用它:

var secondScene = GameOverScene.unarchiveFromFile("<sks file name here>") as GameOverScene

注意:新场景的大小将是 sks 文件中设置的大小(默认值:1024x768),因此您可能需要更改它以适应设备。

此外,当您取消存档场景时调用的 init 方法是 init?(coder aDecoder: NSCoder),以防您需要覆盖它(请记住调用 super.init(coder: aDecoder) 以确保您的场景内容实际上是从文件。

编辑:在您自己的场景中使用它

在你想取消存档的场景中输入:

override class func unarchiveFromFile(file : NSString) -> 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 ***YourSceneNameHere***
        archiver.finishDecoding()
        return scene
    } else {
        return nil
    }
}

并将 ***YourSceneNameHere*** 替换为例如:GameOverScene

编辑:解释

此方法从应用程序包中的 sks 文件加载 SKScene。它采取的步骤是:

  1. 在您的应用程序包中查找 sks 文件的路径(如果存在)。
  2. 将该文件中的字节加载到 NSData 对象中。
  3. 初始化 Unarchiver,这将读取 NSData 中的字节并从中加载+配置对象。
  4. 告诉解压器在读取文件中的 SKScene 时创建 ***YourSceneName*** 的实例。
  5. 解码数据并将 returned 对象转换为 ***YourSceneName***
  6. 告诉存档器我们已完成读取文件数据
  7. Return未存档场景
  8. 如果找不到sks文件,return无 需要覆盖该方法,以便 self.classForNSKeyedUnarchiver return 适合您的场景 class。