Swift Singleton用于在代理中预加载纹理,而不将数据传输到其他类

Swift Singleton用于在代理中预加载纹理,而不将数据传输到其他类,swift,sprite-kit,singleton,textures,preload,Swift,Sprite Kit,Singleton,Textures,Preload,我正在制作一个SpriteKit游戏,我正在尝试使用一个单例在AppDelegate中预加载我的所有纹理,以便稍后我可以将类的实例与游戏场景中的纹理一起使用。这些纹理都正确地保存在代理的单例中,但当我稍后在游戏场景中尝试获取该实例时,我的单例中的SKTexture数组为空。以下是myAppDelegate func preLoadAllAssets() { var assets = Assets() //make instance of the assets let mon

我正在制作一个SpriteKit游戏,我正在尝试使用一个单例在AppDelegate中预加载我的所有纹理,以便稍后我可以将类的实例与游戏场景中的纹理一起使用。这些纹理都正确地保存在代理的单例中,但当我稍后在游戏场景中尝试获取该实例时,我的单例中的SKTexture数组为空。以下是my
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
}
这是我的单身资产

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
}

如您所见,我正在从singleton设置游戏场景中的
[SKTexture]
变量。这是当他们是空的,游戏崩溃。我的单身汉怎么了?它有很多代码,所以非常感谢您的帮助

在didFinishLaunchingWithOptions中的AppDelegate中加载所有内容是个坏主意。如果加载时间过长,您可能会被拒绝,或者应用程序将被系统终止。您可以将加载场景作为第一个视图,然后从单例类中加载它。对于单身汉也可以试试这个

    private let _sharedInstance = Assets()

    class Assets {        
         class var sharedInstance : Assets {
           return _sharedInstance
         } 

    // The rest of your code here
    }

我不知道斯威夫特,但从您的描述来看,您似乎没有向场景传递AppDelegate的引用。我没有传递AppDelegate的引用,而是传递singleton的引用。我可能错了,但我很确定单例的意义在于能够在一个类中实例化它,然后在另一个类中使用它,只需使用
sharedInstance
对象。再说一遍,我不熟悉Swift,但看起来您正在将值存储在AppDelegate类中,并将其用作单例。如果是这样,则需要传递引用才能访问AppDelegate。如果没有,请忽略我的注释:)当我调用所有assets.init方法(如
assets.initMonkies()
)时,我不是将atlas属性存储在AppDelegate中,然后将纹理存储在singleton中吗?尝试此singleton实现时,它会说assets.type没有名为_sharedInstance的成员。这就是我如何实现singleton更新代码的地方,我错放了一行,这正是我在一个工作应用程序中使用它的方式(除了名称)。它在操场上不起作用,但在代码中起作用。
    private let _sharedInstance = Assets()

    class Assets {        
         class var sharedInstance : Assets {
           return _sharedInstance
         } 

    // The rest of your code here
    }