Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Preloading textures in SpriteKit

I've done some research and I can't seem to find anything that clearly explains how to go about preloading both single textures and textures within animations. I'm currently using Atlas's in Assets.xcassets to group related animation images. Does having my images in the Atlas mean that they are preloaded? As far as single images, does it make sense to declare the texture before GameScene like this: let laserImage = SKTexture(imageNamed: "Sprites/laser.jpg") and then (for example) within one of my SKSpriteNode subclass I can just pass laserImage through?

I ultimately wanted to know if there was a well defined way of going about this or if I should just store each texture as a constant before GameScene. Any advice on the proper (and most efficient) way of going about this would be great.

like image 511
muZero Avatar asked Aug 07 '16 20:08

muZero


2 Answers

I tried to implement appzYourLife answer but it increased the time to load every texture. So I ended up putting all the most used Sprites in one single atlas and puting it in a singleton.

class Assets {
    static let sharedInstance = Assets()
    let sprites = SKTextureAtlas(named: "Sprites")

    func preloadAssets() {
        sprites.preloadWithCompletionHandler {
            print("Sprites preloaded")
        }
    }
}

I call Assets.sharedInstance.preloadAssets() in menuScene. And:

let bg1Texture = Assets.sharedInstance.sprites.textureNamed("background1")
bg1 = SKSpriteNode(texture: bg1Texture)

to reference a texture already loaded in memory.

like image 86
Sanf0rd Avatar answered Sep 18 '22 02:09

Sanf0rd


One Single Texture Atlas

Put all your assets into a single Sprite Atlas. If they don't fit, try at least to put all the assets of a single scene into a single Sprite Atlas

Preloading

If you want you can preload the texture atlas in memory with this code

SKTextureAtlas(named: "YourTextureAtlasName").preloadWithCompletionHandler { 
    // Now everything you put into the texture atlas has been loaded in memory
}

Automatic caching

You don't need to save a reference to the texture atlas, SpriteKit has an internal caching system. Let it do it's job.

Which name should I use to reference my image?

Forget the name of the file image, the name you assign to the image into Asset Catalog is the only name you will need.

enter image description here

How can I create a sprite from an image into a texture atlas?

let texture = SKTextureAtlas(named:"croc").textureNamed("croc_walk01")
let croc = SKSpriteNode(texture: texture)
like image 26
Luca Angeletti Avatar answered Sep 19 '22 02:09

Luca Angeletti