← Back to docs

v0.20.0

Changelog

All notable changes to ECSpresso are documented here. Format loosely follows Keep a Changelog.

0.20.0

Changed

Added

0.19.2

Added

- createCamera3DPlugin({ projection: 'orthographic', minZoom?, maxZoom? }) clamps camera3DState.setZoom, initial zoom, camera sync at init, and built-in wheel zoom (defaults 0.110, matching the 2D camera plugin wheel limits).

0.19.1

Added

- Orthographic cameras now use wheel input to update camera3DState.zoom by default.

- createCamera3DPlugin({ wheelMode }) supports 'auto', 'distance', 'zoom', and 'disabled'.

0.19.0

Breaking

- onEnter({ entity, ecs }) instead of onEnter(entity).

- onExit({ entityId, ecs }) instead of onExit(entityId).

Added

- ScreenDefinition.onResume({ config, state, ecs }) runs after popScreen() restores a stacked screen as current.

- screenResume events and game.onScreenResume(screen, handler) expose the same resume point to centralized screen wiring.

0.18.0

Breaking

ScreenDefinition<Config> now defaults State to Config instead of Record<string, never>.

That means code like this may now fail typecheck:

type Screens = {

playing: ScreenDefinition<{ level: number }>;

};

const playing: Screens['playing'] = {

initialState: () => ({}),

};

Before, omitted State meant empty state. Now omitted State means state mirrors config, so initialState must return { level: number }.

Added

- SystemProcessFn<Cfg, Queries, ResourceKeys?, Singletons?> names the .setProcess(...) callback shape.

- SystemLifecycleFn<Cfg> names the .setOnInitialize(...) / .setOnDetach(...) callback shape.

- AssetConfiguratorFn<Assets, AssetGroups?> names the .withAssets(...) callback shape.

- ScreenConfiguratorFn<Screens> names the .withScreens(...) callback shape.

- ComponentsConfig<T>, EventsConfig<T>, ResourcesConfig<T>, AssetsConfig<T>, and ScreensConfig<T> build single-slot configs without spelling empty WorldConfigFrom parameters.

- spritesheetLoader<S>(url)AssetConfigurator-compatible loader; lazy-loads pixi.js and runtime-shape-checks the resolved value so non-atlas URLs error at load time instead of deep in the play loop.

- clipFromSheet(sheet, name, options?) and animationSetFromSheet(id, sheet, options?) — build clips/sets from a loaded Spritesheet<S>. Animation-name union is inferred when S is declared as an interface ... extends SpritesheetData. Both throw on zero-frame animations.

- clipFromGrid({ source, frameWidth, frameHeight, columns, rows?, count?, indices?, ... }) — slice a grid-arranged image without atlas JSON. Async (lazy-loads pixi) and validates inputs: exactly one of rows/count/indices is required, indices are integer- and bounds-checked when rows is given.

- New exported types: SheetClipOverrides<A>, SheetAnimationKeys<S>.

Internal

0.17.0

No breaking changes from 0.16.3.

Added

Performance

Internal