由于拼写错误或文件不在mainBundle中,它可能会过渡到灰色场景。我已经测试过了,而且效果很好。您需要确保在加载时写入.sks文件的确切名称,否则会出现灰色屏幕。
实例
如果文件被调用
GameScreen.sks
这个类叫做
GameScene
然后,如果在加载.sks文件时输入类名,则会出现灰色屏幕。
let doors = SKTransition.doorwayWithDuration(1.0)
let archeryScene = GameScene(fileNamed: "GameScreen")
self.view?.presentScene(archeryScene, transition: doors)
因此,如果我们查看第二行代码,就会发现它正在加载名为.sks的文件
GameScreen
与类名相对
游戏场景
。我们还中止使用文件扩展名,因为编译器默认知道它是我们在mainBundle中搜索的.sks文件。
如果你一直得到一个灰色屏幕,那么这可能是拼写错误或给你的GameViewController,在SKNode扩展中,请确保更改
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 GameScene
archiver.finishDecoding()
return scene
} else {
return nil
}
}
}
对此。。
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
}
}
}
我们刚刚编辑了这行代码,
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene
到此为止
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKScene
这将允许我们加载多个
.sks
文件没有任何错误或崩溃。