我正在制作一个 SpriteKit 游戏,我正在尝试使用单例在 AppDelegate 中预加载我的所有纹理,以便稍后我可以在我的游戏场景中使用该类的实例和纹理。纹理都正确保存在委托(delegate)的单例中,但是当我稍后尝试在我的游戏场景中获取该实例时,单例中的 SKTexture 数组是空的。这是我的 AppDelegate
func preLoadAllAssets() {
var assets = Assets() //make instance of the 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 the 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 for customization after application launch.
Fabric.with([Crashlytics()])
//set up the assets
preLoadAllAssets()
return true
}
这是我的单例 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 that will be used in the 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 the monkies textures
func initMonkies() /*-> [SKTexture]*/ {
//get textures from the atlas
//let monkiesAtlas = SKTextureAtlas(named: "Monkies")
var tempMonkeyTextures = [SKTexture]()
let numImages = monkiesAtlas.textureNames.count
for var i = 1; i <= numImages; i++ { //put all the atlas images into array of textures
tempMonkeyTextures.append(monkiesAtlas.textureNamed("monkey\(i)"))
}
//return tempMonkeyTextures
self.monkeyTextures = tempMonkeyTextures
}
//init the monkies textures
func initLeftMonkies() /*-> [SKTexture]*/ {
//get textures from the atlas
//let monkiesAtlas = SKTextureAtlas(named: "MonkiesLeft")
var tempMonkeyTextures = [SKTexture]()
let numImages = monkiesAtlas.textureNames.count
for var i = 1; i <= numImages; i++ { //put all the atlas images into array of textures
tempMonkeyTextures.append(monkiesAtlas.textureNamed("MonkeyLeft\(i)"))
}
//return tempMonkeyTextures
self.monkeyLeftTextures = tempMonkeyTextures
}
//set up the banana frames
func initBananaFrames() /*-> [SKTexture]*/ {
//let bananaAnimatedAtlas = SKTextureAtlas(named: "Banana")
var tempBananaFrames = [SKTexture]()
let numImages = bananaAnimatedAtlas.textureNames.count
for var i = 1; i <= numImages; i++ {
tempBananaFrames.append(bananaAnimatedAtlas.textureNamed("banana\(i)"))
}
//return tempBananaFrames
self.bananaFrames = tempBananaFrames
}
//init the asteroids textures
func initSmallAsteroids() /*-> [SKTexture]*/ {
//get textures from the atlas
//let asteroidAtlas1 = SKTextureAtlas(named: "SmallAsteroids")
var tempAsteroidTextures = [SKTexture]()
let numImages = asteroidAtlas1.textureNames.count
for var i = 1; i <= numImages; i++ { //put all the atlas images into array of textures
tempAsteroidTextures.append(asteroidAtlas1.textureNamed("asteroid\(i)"))
}
//return tempAsteroidTextures
self.smallAsteroidTextures = tempAsteroidTextures
}
//init the asteroids textures
func initMediumAsteroids() /*-> [SKTexture]*/ {
//get textures from the atlas
//let asteroidAtlas2 = SKTextureAtlas(named: "MediumAsteroids")
var tempAsteroidTextures = [SKTexture]()
let numImages = asteroidAtlas2.textureNames.count
for var i = 1; i <= numImages; i++ { //put all the atlas images into array of textures
tempAsteroidTextures.append(asteroidAtlas2.textureNamed("asteroid\(i)"))
}
//return tempAsteroidTextures
self.mediumAsteroidTextures = tempAsteroidTextures
}
//init the asteroids textures
func initLargeAsteroids() /*-> [SKTexture]*/ {
//get textures from the atlas
//let asteroidAtlas3 = SKTextureAtlas(named: "LargeAsteroids")
var tempAsteroidTextures = [SKTexture]()
let numImages = asteroidAtlas3.textureNames.count
for var i = 1; i <= numImages; i++ { //put all the atlas images into array of textures
tempAsteroidTextures.append(asteroidAtlas3.textureNamed("asteroid\(i)"))
}
//return tempAsteroidTextures
self.largeAsteroidTectures = tempAsteroidTextures
}
//init the menu textures
func initMenu() /*-> [SKTexture]*/ {
//get textures from the atlas
//let menuAtlas = SKTextureAtlas(named: "Menu")
var tempMenuTextures = [SKTexture]()
let numImages = menuAtlas.textureNames.count
for var i = 1; i <= numImages; i++ { //put all the atlas images into array of textures
tempMenuTextures.append(menuAtlas.textureNamed("menu\(i)"))
}
//return tempMenuTextures
self.menuTextures = tempMenuTextures
}
这里是我在 GameScene
sharedInstance
的地方
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
如您所见,我在游戏场景中通过单例设置了 [SKTexture]
变量。这是当它们为空并且游戏崩溃时。我的单例做错了什么?代码有点多,非常感谢您的帮助!
最佳答案
在 didFinishLaunchingWithOptions 的 AppDelegate 中加载所有内容是一个坏主意。如果您的加载时间太长,您可能会被拒绝,或者该应用程序将被系统杀死。您可以将加载场景作为您的第一个 View ,然后从那里的单例类加载它。也可以为单例尝试这个。
private let _sharedInstance = Assets()
class Assets {
class var sharedInstance : Assets {
return _sharedInstance
}
// The rest of your code here
}
关于Swift Singleton 用于在委托(delegate)中预加载纹理而不将数据传输到其他类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31331432/