如何在SpriteKit中从Web API加载精灵表

时间:2016-07-21 16:59:22

标签: ios sprite-kit sprite-sheet texturepacker

我是SpriteKit的新手,我的问题是如何从Web API加载精灵表。

目前,我有一个API返回一个大的PNG图像,其中包含所有精灵表,以及一个关于单个帧信息的json。 (文件和json由TexturePacker生成)API如下所示:

enter image description here

格式就像一个.atlasc文件夹,其中包含一个大图像和一个plist(XML)文件。

我正在考虑下载图像和plist文件并将其保存在磁盘中以加载。但是,SKTextureAtlas.init(named: String)只能从应用包中加载。

总之,我想在运行时从Web加载精灵动画。

我可以控制API,因此我可以更新API以实现我的目标。

2 个答案:

答案 0 :(得分:1)

我想出的方法是下载image,创建sourceTexture,例如:let sourceTexture = SKTexture(image: image)

然后使用frame中的json信息,使用方法init(rect rect: CGRect, inTexture texture: SKTexture)

创建单个纹理

示例代码为:

    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)
    }

答案 1 :(得分:0)

与@Honghao Zhang 的回答基本相同,但乍一看我对整个结构有点困惑。

所以我将我的代码片段分享给以后的读者。

快乐编码:)

    func getSpriteTextures() -> [SKTexture]? {
        guard let spriteSheet = loadSpriteJson(name: "sprite_json_file", codable: SpriteJson.self) else { return nil }
        let sourceImage = UIImage(named: "sprite_img_file.png")!
        let sourceTexture = SKTexture(image: sourceImage)
        var textures: [SKTexture] = []
        
        let sourceWidth = spriteSheet.meta.size.w
        let sourceHeight = spriteSheet.meta.size.h
        
        let orderedFrameImgNames = spriteSheet.frames.keys.sorted()
        
        for frameImgName in orderedFrameImgNames {
            let frameMeta = spriteSheet.frames[frameImgName]!
            let rect = CGRect(x: frameMeta.frame.x / sourceWidth,
                              y: 1.0
                                - (frameMeta.sourceSize.h / sourceHeight)
                                - (frameMeta.frame.y / sourceHeight),
                              width: frameMeta.frame.w / sourceWidth,
                              height: frameMeta.frame.h / sourceHeight)
            let texture = SKTexture(rect: rect, in: sourceTexture)
            textures.append(texture)
        }
        return textures
    }