2015-02-07 112 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