2024-05-15 02:44:01 -07:00
|
|
|
import { _decorator, assetManager, Component, ImageAsset, JsonAsset, Node, SpriteFrame, Texture2D } from 'cc';
|
|
|
|
import Singleton from '../Singleton';
|
2024-06-09 05:12:08 -07:00
|
|
|
import Utils from '../Utilities';
|
2024-05-15 02:44:01 -07:00
|
|
|
|
|
|
|
const { ccclass, property } = _decorator;
|
|
|
|
|
|
|
|
@ccclass('DynamicSpriteManager')
|
|
|
|
export default class DynamicSpriteManager extends Singleton<DynamicSpriteManager>() {
|
|
|
|
@property(JsonAsset)
|
|
|
|
private jsonConfig: JsonAsset;
|
|
|
|
|
|
|
|
private spriteMap: Map<string, SpriteFrame> = 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<SpriteFrame> {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
assetManager.loadRemote<ImageAsset>(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<SpriteFrame> {
|
2024-06-09 05:12:08 -07:00
|
|
|
await Utils.waitUntil(() => this.initialized);
|
2024-05-15 02:44:01 -07:00
|
|
|
return this.spriteMap.get(id);
|
|
|
|
}
|
|
|
|
}
|