你是不是从文件加载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