import { _decorator, assetManager, Component, ImageAsset, JsonAsset, Node, SpriteFrame, Texture2D } from 'cc'; import Singleton from '../Singleton'; import Utils from '../Utilities'; const { ccclass, property } = _decorator; @ccclass('DynamicSpriteManager') export default class DynamicSpriteManager extends Singleton() { @property(JsonAsset) private jsonConfig: JsonAsset; private spriteMap: Map = new Map(); private initialized = false; protected onLoad(): void { super.onLoad(); this.init(); } private async init() { const config = this.jsonConfig.json; for (let i = 0; i < config.length; i++) { const el = config[i]; try { const spriteFrame = await this.loadSprite(el.URL); this.spriteMap.set(el.ID, spriteFrame); } catch (err) { console.log(err); } } this.initialized = true; } private loadSprite(url: string): Promise { return new Promise((resolve, reject) => { assetManager.loadRemote(url, (err, imageAsset) => { if (err) { reject(err); } else { const spriteFrame = new SpriteFrame(); const texture = new Texture2D(); texture.image = imageAsset; spriteFrame.texture = texture; resolve(spriteFrame); } }); }); } public async getSpriteFrame(id: string): Promise { await Utils.waitUntil(() => this.initialized); return this.spriteMap.get(id); } }