ecspresso
Version:
A minimal Entity-Component-System library for typescript and javascript.
42 lines (41 loc) • 2.68 kB
TypeScript
import type { Entity, FilteredEntity } from "./types";
export default class EntityManager<ComponentTypes> {
private nextId;
private entities;
private componentIndices;
/**
* Callbacks registered for component additions
*/
private addedCallbacks;
/**
* Callbacks registered for component removals
*/
private removedCallbacks;
createEntity(): Entity<ComponentTypes>;
addComponent<ComponentName extends keyof ComponentTypes>(entityOrId: number | Entity<ComponentTypes>, componentName: ComponentName, data: ComponentTypes[ComponentName]): this;
/**
* Add multiple components to an entity at once
* @param entityOrId Entity or entity ID to add components to
* @param components Object with component names as keys and component data as values
*/
addComponents<T extends {
[K in keyof ComponentTypes]?: ComponentTypes[K];
}>(entityOrId: number | Entity<ComponentTypes>, components: T & Record<Exclude<keyof T, keyof ComponentTypes>, never>): this;
removeComponent<ComponentName extends keyof ComponentTypes>(entityOrId: number | Entity<ComponentTypes>, componentName: ComponentName): this;
getComponent<ComponentName extends keyof ComponentTypes>(entityId: number, componentName: ComponentName): ComponentTypes[ComponentName] | null;
getEntitiesWithQuery<WithComponents extends keyof ComponentTypes = never, WithoutComponents extends keyof ComponentTypes = never>(required?: ReadonlyArray<WithComponents>, excluded?: ReadonlyArray<WithoutComponents>): Array<FilteredEntity<ComponentTypes, WithComponents extends never ? never : WithComponents, WithoutComponents extends never ? never : WithoutComponents>>;
removeEntity(entityOrId: number | Entity<ComponentTypes>): boolean;
getEntity(entityId: number): Entity<ComponentTypes> | undefined;
/**
* Register a callback when a specific component is added to any entity
* @param componentName The component key
* @param handler Function receiving the new component value and the entity
*/
onComponentAdded<ComponentName extends keyof ComponentTypes>(componentName: ComponentName, handler: (value: ComponentTypes[ComponentName], entity: Entity<ComponentTypes>) => void): this;
/**
* Register a callback when a specific component is removed from any entity
* @param componentName The component key
* @param handler Function receiving the old component value and the entity
*/
onComponentRemoved<ComponentName extends keyof ComponentTypes>(componentName: ComponentName, handler: (oldValue: ComponentTypes[ComponentName], entity: Entity<ComponentTypes>) => void): this;
}