Загрузить уровни SpriteKit из имени файла
Для игры, которую я создаю, я хочу иметь возможность создавать множество пользовательских уровней, которые можно легко загружать. Каждый уровень должен иметь файл интерфейса .sks и собственный файл .swift подкласса SKScene.XCode http://i62.tinypic.com/14lhml2.png
Прямо сейчас это работает:
extension SKScene {
class func unarchiveFromFile(file : NSString, theClass : AnyClass!) -> SKScene? {
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(theClass, forClassName: "SKScene")
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKScene
archiver.finishDecoding()
return scene
} else {
return nil
}
}
}
Где я создаю сцену так:
if let scene = SKScene.unarchiveFromFile("Level1", theClass: Level1.classForKeyedUnarchiver())
Но это не работает для больших коллекций, потому что я не могу перебирать каждый уровень, скажем, в их папке. Мне нужно что то подобное
if let scene = SKScene.unarchiveFromFile("Level1", className:"Level1")
Я пытался с помощьюэтот ответ чтобы получить класс из строки, подобной этой, но сцена загружается так, как будто это просто сценарий SKScene, а не объект Level1.
let classFromString: AnyClass! = NSObject.swiftClassFromString("Level1")
if let scene = SKScene.unarchiveFromFile("Level1", theClass: classFromString)
Пока я буду работать с этим, но я не думаю, что это лучший подход:
let levels = [
("Level1", Level1.classForKeyedUnarchiver()),
("Level2", Level2.classForKeyedUnarchiver())]
let level1 = levels[0]
let (fileName : String, theClass: AnyClass!) = classes[0]
if let scene = SKScene.unarchiveFromFile(fileName, theClass: theClass)
Я просто хочу иметь возможность создать большую коллекцию легко загружаемых подклассов SKScene, каждый из которых имеет свой собственный файл интерфейса.