ecspresso
Version:
A minimal Entity-Component-System library for typescript and javascript.
103 lines (102 loc) • 3.35 kB
TypeScript
/**
* Steering Plugin for ECSpresso
*
* Provides simple move-to-target behavior with arrival detection.
* Entities with a `moveTarget` component move toward the target position
* at their configured `moveSpeed`. The `moveTarget` component is removed
* on arrival and an `arriveAtTarget` event is published.
*/
import { type BasePluginOptions } from 'ecspresso';
import type { ComponentsConfig, EventsConfig } from 'ecspresso';
import type { TransformWorldConfig } from '../spatial/transform';
/**
* Target position for an entity to move toward.
* Removed automatically when the entity arrives.
*/
export interface MoveTarget {
x: number;
y: number;
}
/**
* Component types provided by the steering plugin.
*/
export interface SteeringComponentTypes {
moveTarget: MoveTarget;
moveSpeed: number;
}
/**
* Event fired when an entity arrives at its move target.
*/
export interface ArriveAtTargetEvent {
entityId: number;
}
/**
* Event types provided by the steering plugin.
*/
export interface SteeringEventTypes {
arriveAtTarget: ArriveAtTargetEvent;
}
/**
* WorldConfig representing the steering plugin's provided types.
* Used as the `Requires` type parameter by plugins that depend on steering.
*/
export type SteeringWorldConfig = ComponentsConfig<SteeringComponentTypes> & EventsConfig<SteeringEventTypes>;
/**
* Configuration options for the steering plugin.
*/
export interface SteeringPluginOptions<G extends string = 'steering'> extends BasePluginOptions<G> {
/** Distance threshold to consider arrival (default: 2) */
arrivalThreshold?: number;
}
/**
* Create a moveTarget component.
*
* @param x Target x position
* @param y Target y position
* @returns Component object suitable for spreading into spawn()
*
* @example
* ```typescript
* ecs.addComponent(entityId, 'moveTarget', createMoveTarget(200, 300).moveTarget);
* ```
*/
export declare function createMoveTarget(x: number, y: number): Pick<SteeringComponentTypes, 'moveTarget'>;
/**
* Create a moveSpeed component.
*
* @param speed Movement speed in pixels per second
* @returns Component object suitable for spreading into spawn()
*
* @example
* ```typescript
* ecs.spawn({
* ...createTransform(100, 200),
* ...createMoveSpeed(150),
* });
* ```
*/
export declare function createMoveSpeed(speed: number): Pick<SteeringComponentTypes, 'moveSpeed'>;
/**
* Create a steering plugin for ECSpresso.
*
* Provides a `move-to-target` system that moves entities with `moveTarget`
* and `moveSpeed` components toward their target position. On arrival,
* the `moveTarget` component is removed and an `arriveAtTarget` event is published.
*
* @example
* ```typescript
* const ecs = ECSpresso.create()
* .withPlugin(createTransformPlugin())
* .withPlugin(createSteeringPlugin())
* .build();
*
* await ecs.initialize();
*
* ecs.spawn({
* ...createTransform(0, 0),
* ...createMoveSpeed(100),
* ...createMoveTarget(200, 200),
* });
* ```
*/
export declare function createSteeringPlugin<G extends string = 'steering'>(options?: SteeringPluginOptions<G>): import("ecspresso").Plugin<import("ecspresso").WithEvents<import("ecspresso").WithComponents<import("ecspresso").EmptyConfig, SteeringComponentTypes>, SteeringEventTypes>, TransformWorldConfig, "move-to-target", G, never, never>;