@hiddentao/clockwork-engine
Version:
A TypeScript/PIXI.js game engine for deterministic, replayable games with built-in rendering
119 lines • 4.32 kB
TypeScript
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