import { Assets, Texture } from 'pixi.js';
/**
* Загрузчик ассетов поверх Assets из PixiJS: группы, прогресс, готовые Texture.
* URL ассетов передаётся функцией-резолвером (приложение решает, где лежат файлы).
*/
export class AssetLoader {
private textures = new Map<string, Texture>();
private initPromise: Promise<void> | null = null;
constructor(private resolveUrl: (key: string) => string) {}
/** Assets требует однократной инициализации до первой загрузки. */
private ensureInit(): Promise<void> {
if (!this.initPromise) {
this.initPromise = Assets.init({});
}
return this.initPromise;
}
/** Загрузить группу ключей; onProgress получает долю 0..1. */
async load(keys: string[], onProgress?: (p: number) => void): Promise<void> {
await this.ensureInit();
let done = 0;
for (const key of keys) {
try {
const tex = await Assets.load<Texture>(this.resolveUrl(key));
this.textures.set(key, tex);
} catch (err) {
throw new Error(`Не удалось загрузить ${this.resolveUrl(key)}: ${String(err)}`);
}
done++;
onProgress?.(done / keys.length);
}
}
texture(key: string): Texture {
const t = this.textures.get(key);
if (!t) throw new Error(`Текстура не загружена: ${key}`);
return t;
}
has(key: string): boolean {
return this.textures.has(key);
}
}