UNPKG

1.99 kBTypeScriptView Raw
1import { Entity } from './Entity';
2declare type NonFunctionPropertyNames<T> = {
3 [K in keyof T]: T[K] extends (args: unknown) => void ? never : K;
4}[keyof T];
5export declare type NonFunctionProperties<T> = Pick<T, NonFunctionPropertyNames<T>>;
6export declare type ComponentClassType<P> = new (data: Partial<NonFunctionProperties<P>>) => Component<P> & P;
7export declare abstract class Component<P> {
8 constructor(data?: Partial<NonFunctionProperties<P>>);
9}
10/**
11 * 管理某一类 Component,尽可能做到 AoS 而非 SoA
12 * @see https://wickedengine.net/2019/09/29/entity-component-system/
13 * @see https://github.com/turanszkij/WickedEngine/blob/master/WickedEngine/wiECS.h
14 */
15export declare class ComponentManager<P> {
16 private clazz;
17 private components;
18 private entities;
19 /**
20 * 不在 Entity 中维护拥有的 Component 列表,反之亦然
21 */
22 private lookup;
23 constructor(clazz: ComponentClassType<P>);
24 clear(): void;
25 contains(entity: Entity): boolean;
26 create(entity: Entity, data?: Partial<NonFunctionProperties<P>>): Component<P> & P;
27 remove(entity: Entity): void;
28 removeKeepSorted(entity: Entity): void;
29 moveItem(srcIndex: number, destIndex: number): void;
30 getEntity(index: number): number;
31 /**
32 * 由于缺少类似 C++ 的重载操作符,没法通过 [下标] 直接访问。因此只能增加该方法用于遍历。
33 */
34 getComponent(index: number): Component<P> & P;
35 getComponentByEntity(entity: Entity): (Component<P> & P) | null;
36 getCount(): number;
37 getEntityByComponentIndex(componentIdx: number): number;
38 find(callback: (component: Component<P> & P, i: number) => boolean): (Component<P> & P) | null;
39 findIndex(callback: (component: Component<P> & P, i: number) => boolean): number;
40 forEach(callback: (entity: Entity, component: Component<P> & P) => void): void;
41 map(callback: (entity: Entity, component: Component<P> & P) => void): void[];
42}
43export {};