sprite kit - ¿Para qué sirve unarchiveFromFile en GameViewController?
sprite-kit skscene (2)
Cuando intenté agregar diferentes escenas a mi juego en Swift, encontré el método unarchiveFromFile. El problema con este método es que solo funciona con la clase GameScene. Si lo llamas desde
extension SKNode {
class func unarchiveFromFile(file : NSString) -> SKNode? {
if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
var sceneData = NSData.dataWithContentsOfFile(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
}
}
}
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
let skView = self.view as SKView
skView.ignoresSiblingOrder = true
skView.presentScene(scene)
}
// This won''t work for MenuScene.unarchiveFromFile("MenuScene") as? MenuScene
// nor MenuScene.unarchiveFromFile("MenuScene") as? GameScene
Para poder trabajar con otros SKScenes cambié todas las ocurrencias de la clase GameScene a SKScene. Si bien ahora funciona con otras clases de SKScene, todavía no entiendo de qué se trata.
¿Para qué sirve este método? Debería mantenerlo?
No he usado Xcode 6 mucho, pero entiendo que alguien (alguien puede corregirme o exponer):
Así es como su aplicación utiliza los datos de diseño, etc. para GameScene (o cualquier SKScene
). Si haces clic en el archivo GameScene.sks en el panel de Project Navigator, obtienes un editor visual para tu GameScene.
Si desea que se utilicen estos datos de diseño, usaría ese método. Puede diseñar visualmente su GameScene en el editor de escena sin necesidad de codificar ubicaciones, configuraciones, etc.
Siguiendo con el comentario de 0x141E, puede cambiar el método unarchiveFromFile para usar genéricos para que pueda usarlo para diferentes clases de SKS o SKScene:
extension SKNode {
class func unarchiveFromFile<T:SKScene>(file : NSString) -> T? {
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 T
archiver.finishDecoding()
return scene
} else {
return nil
}
}
}
Solo llámalo de la misma manera pero con el contenido de escena diferente que quieras y debería funcionar bien
if let scene = GameScene.unarchiveFromFile("Level1Scene") as? GameScene {
...
if let scene = GameScene.unarchiveFromFile("Level2Scene") as? GameScene {
...