未显示SKS的内容

时间:2015-02-07 15:23:24

标签: sprite-kit

也许你可以帮助我。

我有一个名为GameScene.sks的主场景。在这个场景中,当玩家输掉游戏时,我会尝试在场景中显示游戏。出于这个原因,我创建了一个带有GameOver标签和Color Sprite背景图像的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 Editor中显示GameOverScene.sks的所有节点。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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. 告诉unarchiver在文件中读取SKScene时创建***YourSceneName***的实例。
  5. 解码数据并将返回的对象强制转换为***YourSceneName***
  6. 告诉归档人员我们已经完成了阅读文件数据
  7. 返回未归档的场景
  8. 如果找不到sks文件,则返回nil 需要重写该方法,以便self.classForNSKeyedUnarchiver返回场景的正确类。