sprite kit - Swift Singleton for preloading Textures in the Delegate not Transferring data to other Classes -
i making spritekit game , trying use singleton preload textures in appdelegate can use instance of class textures in game scene later on. textures held correctly in singleton in delegate when try instance later in game scene sktexture arrays singleton empty. here code in appdelegate
func preloadallassets() { var assets = assets() //make instance of assets let monkiesatlas = sktextureatlas(named: "monkies") let monkiesatlasleft = sktextureatlas(named: "monkiesleft") let bananaanimatedatlas = sktextureatlas(named: "banana") let asteroidatlas1 = sktextureatlas(named: "smallasteroids") let asteroidatlas2 = sktextureatlas(named: "mediumasteroids") let asteroidatlas3 = sktextureatlas(named: "largeasteroids") let menuatlas = sktextureatlas(named: "menu") sktextureatlas.preloadtextureatlases([monkiesatlas, monkiesatlasleft, bananaanimatedatlas, asteroidatlas1, asteroidatlas2, asteroidatlas3, menuatlas], withcompletionhandler: { //initialize different textures assets.initatlases(monkiesatlas, monkiesatlasleft: monkiesatlasleft, bananaanimatedatlas: bananaanimatedatlas, asteroidatlas1: asteroidatlas1, asteroidatlas2: asteroidatlas2, asteroidatlas3: asteroidatlas3, menuatlas: menuatlas) assets.initmonkies() assets.initleftmonkies() assets.initbananaframes() assets.initsmallasteroids() assets.initmediumasteroids() assets.initlargeasteroids() assets.initmenu() println("finished preloading textures") }) } func application(application: uiapplication, didfinishlaunchingwithoptions launchoptions: [nsobject: anyobject]?) -> bool { // override point customization after application launch. fabric.with([crashlytics()]) //set assets preloadallassets() return true } here singleton assets
class assets : skscene { static let sharedinstance = assets() var monkiesatlas = sktextureatlas() var monkiesatlasleft = sktextureatlas() var bananaanimatedatlas = sktextureatlas() var asteroidatlas1 = sktextureatlas() var asteroidatlas2 = sktextureatlas() var asteroidatlas3 = sktextureatlas() var menuatlas = sktextureatlas() //monkey textures used in scene var monkeytextures:[sktexture]! var monkeylefttextures:[sktexture]! var bananaframes:[sktexture]! var smallasteroidtextures:[sktexture]! var mediumasteroidtextures:[sktexture]! var largeasteroidtectures:[sktexture]! var menutextures:[sktexture]! func initatlases(monkiesatlas:sktextureatlas, monkiesatlasleft:sktextureatlas, bananaanimatedatlas:sktextureatlas, asteroidatlas1:sktextureatlas, asteroidatlas2:sktextureatlas, asteroidatlas3:sktextureatlas, menuatlas:sktextureatlas) { self.monkiesatlas = monkiesatlas self.monkiesatlasleft = monkiesatlasleft self.bananaanimatedatlas = bananaanimatedatlas self.asteroidatlas1 = asteroidatlas1 self.asteroidatlas2 = asteroidatlas2 self.asteroidatlas3 = asteroidatlas3 self.menuatlas = menuatlas } //init monkies textures func initmonkies() /*-> [sktexture]*/ { //get textures atlas //let monkiesatlas = sktextureatlas(named: "monkies") var tempmonkeytextures = [sktexture]() let numimages = monkiesatlas.texturenames.count var = 1; <= numimages; i++ { //put atlas images array of textures tempmonkeytextures.append(monkiesatlas.texturenamed("monkey\(i)")) } //return tempmonkeytextures self.monkeytextures = tempmonkeytextures } //init monkies textures func initleftmonkies() /*-> [sktexture]*/ { //get textures atlas //let monkiesatlas = sktextureatlas(named: "monkiesleft") var tempmonkeytextures = [sktexture]() let numimages = monkiesatlas.texturenames.count var = 1; <= numimages; i++ { //put atlas images array of textures tempmonkeytextures.append(monkiesatlas.texturenamed("monkeyleft\(i)")) } //return tempmonkeytextures self.monkeylefttextures = tempmonkeytextures } //set banana frames func initbananaframes() /*-> [sktexture]*/ { //let bananaanimatedatlas = sktextureatlas(named: "banana") var tempbananaframes = [sktexture]() let numimages = bananaanimatedatlas.texturenames.count var = 1; <= numimages; i++ { tempbananaframes.append(bananaanimatedatlas.texturenamed("banana\(i)")) } //return tempbananaframes self.bananaframes = tempbananaframes } //init asteroids textures func initsmallasteroids() /*-> [sktexture]*/ { //get textures atlas //let asteroidatlas1 = sktextureatlas(named: "smallasteroids") var tempasteroidtextures = [sktexture]() let numimages = asteroidatlas1.texturenames.count var = 1; <= numimages; i++ { //put atlas images array of textures tempasteroidtextures.append(asteroidatlas1.texturenamed("asteroid\(i)")) } //return tempasteroidtextures self.smallasteroidtextures = tempasteroidtextures } //init asteroids textures func initmediumasteroids() /*-> [sktexture]*/ { //get textures atlas //let asteroidatlas2 = sktextureatlas(named: "mediumasteroids") var tempasteroidtextures = [sktexture]() let numimages = asteroidatlas2.texturenames.count var = 1; <= numimages; i++ { //put atlas images array of textures tempasteroidtextures.append(asteroidatlas2.texturenamed("asteroid\(i)")) } //return tempasteroidtextures self.mediumasteroidtextures = tempasteroidtextures } //init asteroids textures func initlargeasteroids() /*-> [sktexture]*/ { //get textures atlas //let asteroidatlas3 = sktextureatlas(named: "largeasteroids") var tempasteroidtextures = [sktexture]() let numimages = asteroidatlas3.texturenames.count var = 1; <= numimages; i++ { //put atlas images array of textures tempasteroidtextures.append(asteroidatlas3.texturenamed("asteroid\(i)")) } //return tempasteroidtextures self.largeasteroidtectures = tempasteroidtextures } //init menu textures func initmenu() /*-> [sktexture]*/ { //get textures atlas //let menuatlas = sktextureatlas(named: "menu") var tempmenutextures = [sktexture]() let numimages = menuatlas.texturenames.count var = 1; <= numimages; i++ { //put atlas images array of textures tempmenutextures.append(menuatlas.texturenamed("menu\(i)")) } //return tempmenutextures self.menutextures = tempmenutextures } }
and here use singleton's sharedinstance in gamescene
self.monkeytextures = assets.sharedinstance.monkeytextures self.monkeylefttextures = assets.sharedinstance.monkeylefttextures self.bananaframes = assets.sharedinstance.bananaframes self.smallasteroidtextures = assets.sharedinstance.smallasteroidtextures self.mediumasteroidtextures = assets.sharedinstance.mediumasteroidtextures self.largeasteroidtextures = assets.sharedinstance.largeasteroidtectures self.menutextures = assets.sharedinstance.menutextures as can see setting [sktexture] variables in game scene singleton. when empty , game crashes. doing wrong singleton? kind of lot of code thank ton in advance help!
it bad idea have load in appdelegate in didfinishlaunchingwithoptions. rejected if load times taking long, or app killed system. make loading scene first view , load singleton class there. try out singleton.
private let _sharedinstance = assets() class assets { class var sharedinstance : assets { return _sharedinstance } // rest of code here }
Comments
Post a Comment