UNPKG

ecspresso

Version:

A minimal Entity-Component-System library for typescript and javascript.

42 lines (41 loc) 2.68 kB
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; }