UNPKG

@hiddentao/clockwork-engine

Version:

A TypeScript/PIXI.js game engine for deterministic, replayable games with built-in rendering

119 lines 4.32 kB
import type { Loader } from "../Loader"; import type { AudioLayer, RenderingLayer, TextureId } from "../platform"; import { Spritesheet } from "./Spritesheet"; export declare enum AssetType { SPRITESHEET = "spritesheet", STATIC_IMAGE = "staticImage", SOUND = "sound" } /** * Asset loader for managing game assets with registration and preloading. * Based on patterns from game-base and tiki-kong. * * Games can use directly or extend for custom loading behavior. * * Example usage (direct): * ```typescript * const assetLoader = new AssetLoader(loader, rendering, audio) * assetLoader.register('sprites/player.png', 'spritesheet') // Full path * assetLoader.register('images/logo.png', 'staticImage') * assetLoader.register('sounds/jump.mp3', 'sound') * * await assetLoader.preloadAssets((loaded, total) => { * console.log(`Loading: ${loaded}/${total}`) * }) * * const playerSheet = assetLoader.getSpritesheet('sprites/player.png') * ``` * * Example usage (custom subclass for path conventions): * ```typescript * class MyAssetLoader extends AssetLoader { * async loadSpritesheet(id: string): Promise<Spritesheet> { * // Add custom path prefix * const sheet = await Spritesheet.load( * this.loader, * this.rendering, * `assets/sprites/${id}.png` * ) * this.spritesheets.set(id, sheet) * return sheet * } * } * // Then use: assetLoader.register('player', 'spritesheet') * ``` */ export declare class AssetLoader { protected loader: Loader; protected rendering: RenderingLayer; protected audio: AudioLayer; protected spritesheets: Map<string, Spritesheet>; protected staticImages: Map<string, TextureId>; protected sounds: Set<string>; protected registeredSpritesheets: string[]; protected registeredStaticImages: string[]; protected registeredSounds: string[]; constructor(loader: Loader, rendering: RenderingLayer, audio: AudioLayer); /** * Register an asset for preloading. * Call this during game initialization for all required assets. * * @param id - Asset identifier * @param type - Asset type (spritesheet, staticImage, sound) */ register(id: string, type: AssetType): void; /** * Preload all registered assets. * Called by GameEngine.reset() before setup(). * * @param onProgress - Optional callback for tracking progress (loaded, total) */ preloadAssets(onProgress?: (loaded: number, total: number) => void): Promise<void>; /** * Load a spritesheet asset. * Virtual method - games can override in subclass for custom logic. * * Default implementation uses the ID as the file path directly. * Register with full path: `assetLoader.register('sprites/player.png', 'spritesheet')` * * @param id - Asset path (e.g., 'sprites/player.png') * @returns Promise resolving to Spritesheet instance */ loadSpritesheet(id: string): Promise<Spritesheet>; /** * Load a static image asset. * Virtual method - games can override in subclass for custom logic. * * Default implementation uses the ID as the file path directly. * Register with full path: `assetLoader.register('images/logo.png', 'staticImage')` * * @param id - Asset path (e.g., 'images/logo.png') * @returns Promise resolving to TextureId */ loadStaticImage(id: string): Promise<TextureId>; /** * Load a sound asset. * Virtual method - games can override in subclass for custom logic. * * Default implementation uses the ID as the file path directly. * Register with full path: `assetLoader.register('sounds/jump.mp3', 'sound')` * * @param id - Asset path (e.g., 'sounds/jump.mp3') */ loadSound(id: string): Promise<void>; /** * Get a loaded spritesheet by ID. * * @param id - Spritesheet identifier * @returns Spritesheet instance if loaded, undefined otherwise */ getSpritesheet(id: string): Spritesheet | undefined; /** * Get a loaded static image by ID. * * @param id - Image identifier * @returns TextureId if loaded, undefined otherwise */ getStaticImage(id: string): TextureId | undefined; } //# sourceMappingURL=AssetLoader.d.ts.map