2015-02-07 88 views
1

也许你可以帮助我。SKS的内容不显示

我有一个叫做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

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

从文件加载它使用unarchivefromFile:方法在一个新的精灵套件项目中作为样板代码提供。

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文件(默认:1024×768),所以你可能需要将其更改为适合一个设备。

还与当你解除存档场景叫做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为您的场景返回正确的类。
+0

谢谢霍加皮的回复,但是当我这样做你描述我得到以下错误:“雨燕动态转换失败” – Petschuschkah 2015-02-08 15:25:42

+0

@Petschuschkah见上编辑 – Okapi 2015-02-08 15:28:32

+0

现在它的工作原理,但你可以给我解释一下发生了什么这里 ?我们为什么需要重写它。谢谢 :) – Petschuschkah 2015-02-08 15:43:04