Newer
Older
rpg / packages / engine / src / assets / AssetLoader.ts
import { Assets, Texture } from 'pixi.js';

/**
 * Загрузчик ассетов поверх Assets из PixiJS: группы, прогресс, готовые Texture.
 * URL ассетов передаётся функцией-резолвером (приложение решает, где лежат файлы).
 */
export class AssetLoader {
    private textures = new Map<string, Texture>();

    constructor(private resolveUrl: (key: string) => string) {}

    /** Загрузить группу ключей; onProgress получает долю 0..1. */
    async load(keys: string[], onProgress?: (p: number) => void): Promise<void> {
        let done = 0;
        for (const key of keys) {
            const tex = await Assets.load<Texture>(this.resolveUrl(key));
            this.textures.set(key, tex);
            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);
    }
}