你是不是從文件加載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。所需的步驟如下:
- 如果存在應用程序的包中找到sks文件的路徑。
- 將該文件中的字節加載到NSData對象中。
- 初始化Unarchiver,它將讀取NSData中的字節並從中加載+配置對象。
- 告訴unarchiver在文件中讀取SKScene時創建
***YourSceneName***
的實例。
- 解碼的數據,並轉換返回的對象
***YourSceneName***
- 告訴存檔我們讀完文件數據
- 返回未存檔的場景
- 如果SKS文件找不到,返回nil 方法需要被覆蓋,以便
self.classForNSKeyedUnarchiver
爲您的場景返回正確的類。
謝謝霍加皮的回覆,但是當我這樣做你描述我得到以下錯誤:「雨燕動態轉換失敗」 – Petschuschkah 2015-02-08 15:25:42
@Petschuschkah見上編輯 – Okapi 2015-02-08 15:28:32
現在它的工作原理,但你可以給我解釋一下發生了什麼這裏 ?我們爲什麼需要重寫它。謝謝 :) – Petschuschkah 2015-02-08 15:43:04