iossprite-kitsprite-sheettexturepacker

How to load sprite sheets from web API in SpriteKit


I'm new to SpriteKit, and my question is how to load sprite sheets from web API.

Currently, I have an API returns a big PNG image, which contains all sprite sheets, and a json about individual frame information. (file and json are generated by TexturePacker) The API looks like this:

enter image description here

The format just likes a .atlasc folder, which contains a big image and a plist (XML) file.

I was thinking about downloading image and plist file and save it in the disk to load. However, SKTextureAtlas.init(named: String) can only load from app bundle.

In one word, I want to load a sprite animation from the web at runtime.

I have control of the API, so I can update the API to accomplish my goal.


Solution

  • The way I've figured out is downloading image, create a sourceTexture, like: let sourceTexture = SKTexture(image: image)

    Then use the frame information in json to create individual textures with method init(rect rect: CGRect, inTexture texture: SKTexture)

    Sample code is:

    var textures: [SKTexture] = []
    
    let sourceTexture = SKTexture(image: image)
    for frame in spriteSheet.frames {
      let rect = CGRect(
        x: frame.frame.origin.x / spriteSheet.size.width,
        y:  1.0 - (frame.frame.size.height / spriteSheet.size.height) - (frame.frame.origin.y / spriteSheet.size.height),
        width: frame.frame.size.width / spriteSheet.size.width,
        height: frame.frame.size.height / spriteSheet.size.height
      )
      let texture = SKTexture(rect: rect, inTexture: sourceTexture)
      textures.append(texture)
    }