mani-game-engine 1.0.0-pre.35 → 1.0.0-pre.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/clock.d.ts +2 -2
- package/lib/ecsInjector.d.ts +25 -7
- package/lib/ecsInjector.js +76 -27
- package/lib/ecsInjector.js.map +1 -1
- package/lib/entity.d.ts +7 -0
- package/lib/entity.js +59 -3
- package/lib/entity.js.map +1 -1
- package/lib/gameEngine.d.ts +3 -1
- package/lib/gameEngine.js +43 -39
- package/lib/gameEngine.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/injector.d.ts +20 -20
- package/lib/injector.js.map +1 -1
- package/lib/scope/scopeContext.d.ts +3 -3
- package/lib/systemContext.d.ts +3 -3
- package/lib/systemContext.js.map +1 -1
- package/lib/types.d.ts +7 -7
- package/lib/types.js.map +1 -1
- package/package.json +10 -10
- package/src/ecsInjector.ts +92 -30
- package/src/entity.ts +62 -2
- package/src/gameEngine.ts +44 -39
- package/src/index.ts +1 -1
- package/src/injector.ts +1 -0
- package/src/systemContext.ts +3 -2
- package/src/types.ts +1 -0
package/lib/clock.d.ts
CHANGED
|
@@ -6,12 +6,12 @@ declare const defaultOptions: {
|
|
|
6
6
|
maxFrameTime: number;
|
|
7
7
|
timeScale: number;
|
|
8
8
|
};
|
|
9
|
-
export
|
|
9
|
+
export type Timeout = {
|
|
10
10
|
recall?: number;
|
|
11
11
|
callback: Function;
|
|
12
12
|
callTime: number;
|
|
13
13
|
};
|
|
14
|
-
export
|
|
14
|
+
export type GameClockOptions = Partial<typeof defaultOptions>;
|
|
15
15
|
export interface Clock {
|
|
16
16
|
onPrepare: Signal<unknown>;
|
|
17
17
|
onEarlyUpdate: Signal<OnEarlyUpdateParams>;
|
package/lib/ecsInjector.d.ts
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
import { Signal } from 'mani-signal';
|
|
2
|
-
import { Class, ID, Injector, ResolverFunction } from './injector';
|
|
2
|
+
import { Class, Dependency, ID, Injector, ResolverFunction } from './injector';
|
|
3
3
|
import { SystemContext } from './systemContext';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import { Entity } from './entity';
|
|
5
|
+
type ComponentClass = Class;
|
|
6
|
+
type EntityClass = Class;
|
|
7
|
+
type ComponentDependency = Dependency & {
|
|
8
|
+
kind: 'component';
|
|
9
|
+
index: number;
|
|
10
|
+
type: Class;
|
|
11
|
+
};
|
|
12
|
+
type DynamicComponentDependency = Dependency & {
|
|
13
|
+
kind: 'dynamic';
|
|
14
|
+
index: number;
|
|
15
|
+
type: Class;
|
|
16
|
+
};
|
|
8
17
|
export declare const GetComponent: (dependantType: Class<any>, _propertyKey: string | symbol, index: number) => any;
|
|
18
|
+
export declare const GetDynamicComponent: (dependantType: Class<any>, _propertyKey: string | symbol, index: number) => any;
|
|
9
19
|
export declare const GetEntity: (dependantType: Class<any>, _propertyKey: string | symbol, index: number) => any;
|
|
10
20
|
export declare const GetContext: (dependantType: Class<any>, _propertyKey: string | symbol, index: number) => any;
|
|
11
21
|
export declare const GetSignal: (id: ID) => (dependantType: Class<any>, _propertyKey: string | symbol, index: number) => any;
|
|
@@ -15,13 +25,21 @@ export declare const signalHandlers: Map<Object, [string, ID][]>;
|
|
|
15
25
|
export declare const staticSignalHandlers: Map<Object, [string, ID][]>;
|
|
16
26
|
export declare const OnSignal: (id: ID) => (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void;
|
|
17
27
|
export declare class EcsInjector<SystemClass extends Class = Class> extends Injector {
|
|
28
|
+
static warnNoMatchingEntities: boolean;
|
|
29
|
+
static entityComponents: Map<EntityClass, Map<ComponentClass, string>>;
|
|
30
|
+
protected componentDependencyMap: Map<Class<any>, ComponentDependency[]>;
|
|
31
|
+
protected dynamicComponentDependencyMap: Map<Class<any>, DynamicComponentDependency[]>;
|
|
18
32
|
protected entitySystemMap: Map<Class, SystemClass[]>;
|
|
19
|
-
protected
|
|
33
|
+
protected dynamicComponentSystemMap: Map<Class, SystemClass[]>;
|
|
34
|
+
protected entitySystemResolverTuples: Map<Class, Map<SystemClass, ResolverFunction[]>>;
|
|
20
35
|
private signalMap;
|
|
21
36
|
constructor(parent?: EcsInjector<SystemClass>);
|
|
22
37
|
newSignalScope(): void;
|
|
23
38
|
registerSystem<T extends SystemClass>(systemClass: T): void;
|
|
24
|
-
|
|
39
|
+
createSystemsForDynamicComponents(dynamicComponentClass: Class, entity: Entity): Set<SystemContext<import("./types").System>>;
|
|
40
|
+
createSystemsForEntity(entity: Entity): Set<SystemContext>;
|
|
41
|
+
private createSystems;
|
|
42
|
+
private getSystemResolverTuples;
|
|
25
43
|
getSignal<T>(id: ID): Signal<T>;
|
|
26
44
|
dispose(): void;
|
|
27
45
|
}
|
package/lib/ecsInjector.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EcsInjector = exports.OnSignal = exports.staticSignalHandlers = exports.signalHandlers = exports.EntityComponent = exports.GetEntitySignal = exports.GetSignal = exports.GetContext = exports.GetEntity = exports.
|
|
3
|
+
exports.EcsInjector = exports.OnSignal = exports.staticSignalHandlers = exports.signalHandlers = exports.EntityComponent = exports.GetEntitySignal = exports.GetSignal = exports.GetContext = exports.GetEntity = exports.GetDynamicComponent = exports.GetComponent = void 0;
|
|
4
4
|
const mani_signal_1 = require("mani-signal");
|
|
5
5
|
const injector_1 = require("./injector");
|
|
6
6
|
const systemContext_1 = require("./systemContext");
|
|
7
|
-
exports.entityComponents = new Map();
|
|
8
7
|
exports.GetComponent = (0, injector_1.createDependencyAnnotation)((type, index) => ({ kind: 'component', type, index }));
|
|
8
|
+
exports.GetDynamicComponent = (0, injector_1.createDependencyAnnotation)((type, index) => ({
|
|
9
|
+
kind: 'dynamic',
|
|
10
|
+
type,
|
|
11
|
+
index,
|
|
12
|
+
}));
|
|
9
13
|
exports.GetEntity = (0, injector_1.createDependencyAnnotation)((_type, index) => ({ kind: 'entity', index }));
|
|
10
14
|
exports.GetContext = (0, injector_1.createDependencyAnnotation)((_type, index) => ({ kind: 'context', index }));
|
|
11
15
|
const GetSignal = (id) => (0, injector_1.createDependencyAnnotation)((_type, index) => ({ kind: 'signal', index, id }));
|
|
@@ -22,7 +26,7 @@ const EntityComponent = (target, propertyKey) => {
|
|
|
22
26
|
if (componentClass === Object) {
|
|
23
27
|
throw new Error(`Object component type not allowed. Forgot to specify type of ${entityClass.name}.${propertyKey}?`);
|
|
24
28
|
}
|
|
25
|
-
const componentSet = (0, injector_1.putIfAbsent)(
|
|
29
|
+
const componentSet = (0, injector_1.putIfAbsent)(EcsInjector.entityComponents, entityClass, () => new Map());
|
|
26
30
|
componentSet.set(componentClass, propertyKey);
|
|
27
31
|
};
|
|
28
32
|
exports.EntityComponent = EntityComponent;
|
|
@@ -39,15 +43,16 @@ const OnSignal = (id) => (target, propertyKey, descriptor) => {
|
|
|
39
43
|
}
|
|
40
44
|
};
|
|
41
45
|
exports.OnSignal = OnSignal;
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
const extractDependenciesWithType = (type) => {
|
|
47
|
+
const result = new Map();
|
|
48
|
+
injector_1.Injector.dependencyMap.forEach((dependency, system) => {
|
|
49
|
+
(0, injector_1.putIfAbsent)(result, system, () => [...dependency.filter((dependency) => dependency.kind === type)]);
|
|
50
|
+
});
|
|
51
|
+
return result;
|
|
47
52
|
};
|
|
48
53
|
const getEntityClassesForComponentDependencies = (componentTypes) => {
|
|
49
54
|
const result = [];
|
|
50
|
-
for (const [entityClass, componentMap] of
|
|
55
|
+
for (const [entityClass, componentMap] of EcsInjector.entityComponents) {
|
|
51
56
|
let allDependenciesMet = true;
|
|
52
57
|
for (const componentType of componentTypes) {
|
|
53
58
|
if (!componentMap.has(componentType)) {
|
|
@@ -68,9 +73,17 @@ const componentResolver = (context, dependency) => {
|
|
|
68
73
|
throw new Error(`Could not resolve Component ${type.name}. @GetComponent only allowed in system scope.`);
|
|
69
74
|
}
|
|
70
75
|
const entityClass = context.entityClass;
|
|
71
|
-
const key =
|
|
76
|
+
const key = EcsInjector.entityComponents.get(entityClass).get(dependency.type);
|
|
72
77
|
return (context) => context.entity[key];
|
|
73
78
|
};
|
|
79
|
+
const dynamicComponentResolver = (context, dependency) => {
|
|
80
|
+
const kind = context.kind;
|
|
81
|
+
const type = context.type;
|
|
82
|
+
if (kind !== 'system') {
|
|
83
|
+
throw new Error(`Could not resolve Component ${type.name}. @GetComponent only allowed in system scope.`);
|
|
84
|
+
}
|
|
85
|
+
return (context) => context.entity.getDynamicComponent(dependency.type);
|
|
86
|
+
};
|
|
74
87
|
const entityResolver = ({ type, kind }, _dependency) => {
|
|
75
88
|
if (kind !== 'system') {
|
|
76
89
|
throw new Error(`Could not resolve Entity in ${type.name}. @GetEntity only allowed in system scope.`);
|
|
@@ -92,13 +105,17 @@ const contextResolver = ({ type, kind }, _dependency) => {
|
|
|
92
105
|
class EcsInjector extends injector_1.Injector {
|
|
93
106
|
constructor(parent) {
|
|
94
107
|
super(parent);
|
|
108
|
+
this.componentDependencyMap = extractDependenciesWithType('component');
|
|
109
|
+
this.dynamicComponentDependencyMap = extractDependenciesWithType('dynamic');
|
|
95
110
|
this.signalMap = parent ? parent.signalMap : new Map();
|
|
96
111
|
this.entitySystemMap = new Map();
|
|
112
|
+
this.dynamicComponentSystemMap = new Map();
|
|
97
113
|
this.entitySystemResolverTuples = new Map();
|
|
98
114
|
this.map(EcsInjector).toValue(this);
|
|
99
115
|
if (!parent) {
|
|
100
116
|
this.addExtensionResolver('entity', entityResolver);
|
|
101
117
|
this.addExtensionResolver('component', componentResolver);
|
|
118
|
+
this.addExtensionResolver('dynamic', dynamicComponentResolver);
|
|
102
119
|
this.addExtensionResolver('context', contextResolver);
|
|
103
120
|
const signalResolver = ({ kind }, dependency) => {
|
|
104
121
|
const signal = (0, injector_1.putIfAbsent)(this.signalMap, dependency.id, () => new mani_signal_1.Signal());
|
|
@@ -112,12 +129,18 @@ class EcsInjector extends injector_1.Injector {
|
|
|
112
129
|
this.signalMap = new Map();
|
|
113
130
|
}
|
|
114
131
|
registerSystem(systemClass) {
|
|
115
|
-
|
|
132
|
+
var _a;
|
|
133
|
+
const componentDependencies = ((_a = this.componentDependencyMap.get(systemClass)) === null || _a === void 0 ? void 0 : _a.map(it => it.type)) || [];
|
|
134
|
+
const dynamicComponentDependencies = this.dynamicComponentDependencyMap.get(systemClass) || [];
|
|
135
|
+
for (const dynamicComponentDependency of dynamicComponentDependencies) {
|
|
136
|
+
const systemClassesForDynamicComponent = (0, injector_1.putIfAbsent)(this.dynamicComponentSystemMap, dynamicComponentDependency.type, () => []);
|
|
137
|
+
systemClassesForDynamicComponent.push(systemClass);
|
|
138
|
+
}
|
|
116
139
|
if (componentDependencies.length === 0) {
|
|
117
140
|
throw new Error(`${systemClass.name} needs at least one component dependency.`);
|
|
118
141
|
}
|
|
119
142
|
const entityClasses = getEntityClassesForComponentDependencies(componentDependencies);
|
|
120
|
-
if (entityClasses.length === 0) {
|
|
143
|
+
if (entityClasses.length === 0 && EcsInjector.warnNoMatchingEntities) {
|
|
121
144
|
console.warn(`System '${systemClass.name}' has no matching entities.`);
|
|
122
145
|
return;
|
|
123
146
|
}
|
|
@@ -126,21 +149,33 @@ class EcsInjector extends injector_1.Injector {
|
|
|
126
149
|
systemClasses.push(systemClass);
|
|
127
150
|
}
|
|
128
151
|
}
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
result.push([systemClass, this.createResolverArray({ type: systemClass, kind: 'system', entityClass: entity.constructor })]);
|
|
152
|
+
createSystemsForDynamicComponents(dynamicComponentClass, entity) {
|
|
153
|
+
const potentialSystems = this.getSystemResolverTuples(entity);
|
|
154
|
+
const systems = this.dynamicComponentSystemMap.get(dynamicComponentClass);
|
|
155
|
+
const finalSystemResolverEntries = new Map();
|
|
156
|
+
for (const system of systems) {
|
|
157
|
+
const resolverTuples = potentialSystems.get(system);
|
|
158
|
+
if (resolverTuples) {
|
|
159
|
+
finalSystemResolverEntries.set(system, resolverTuples);
|
|
138
160
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
161
|
+
}
|
|
162
|
+
return this.createSystems(finalSystemResolverEntries, entity);
|
|
163
|
+
}
|
|
164
|
+
createSystemsForEntity(entity) {
|
|
165
|
+
const systemResolverTuples = this.getSystemResolverTuples(entity);
|
|
166
|
+
return this.createSystems(systemResolverTuples, entity);
|
|
167
|
+
}
|
|
168
|
+
createSystems(systemResolverMap, entity) {
|
|
169
|
+
const systemInstances = new Set();
|
|
170
|
+
for (const [system, resolver] of systemResolverMap) {
|
|
143
171
|
const args = new Array(resolver.length);
|
|
172
|
+
const dynamicDependencies = this.dynamicComponentDependencyMap.get(system) || [];
|
|
173
|
+
const hasUnfulfilledDynamicDependencies = dynamicDependencies.some((dependency, index) => {
|
|
174
|
+
return !entity.hasDynamicComponentClass(dependency.type);
|
|
175
|
+
});
|
|
176
|
+
if (hasUnfulfilledDynamicDependencies) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
144
179
|
const systemContext = new systemContext_1.SystemContext(entity);
|
|
145
180
|
for (let i = 0; i < args.length; i++) {
|
|
146
181
|
args[i] = resolver[i](systemContext);
|
|
@@ -149,14 +184,26 @@ class EcsInjector extends injector_1.Injector {
|
|
|
149
184
|
const entitySignals = systemContext_1.entitySignalHandlers.get(system);
|
|
150
185
|
if (entitySignals === null || entitySignals === void 0 ? void 0 : entitySignals.length) {
|
|
151
186
|
for (const [propertyKey, id] of entitySignals) {
|
|
152
|
-
entity.getSignal(id).add(newSystem[propertyKey]);
|
|
187
|
+
entity.getSignal(id).add(newSystem[propertyKey], newSystem);
|
|
153
188
|
}
|
|
154
189
|
}
|
|
155
190
|
systemContext.system = newSystem;
|
|
156
|
-
systemInstances.
|
|
191
|
+
systemInstances.add(systemContext);
|
|
157
192
|
}
|
|
158
193
|
return systemInstances;
|
|
159
194
|
}
|
|
195
|
+
getSystemResolverTuples(entity) {
|
|
196
|
+
return (0, injector_1.putIfAbsent)(this.entitySystemResolverTuples, entity.constructor, () => {
|
|
197
|
+
const systems = this.entitySystemMap.get(entity.constructor);
|
|
198
|
+
if (!systems)
|
|
199
|
+
return [];
|
|
200
|
+
const result = new Map();
|
|
201
|
+
for (const systemClass of systems) {
|
|
202
|
+
result.set(systemClass, this.createResolverArray({ type: systemClass, kind: 'system', entityClass: entity.constructor }));
|
|
203
|
+
}
|
|
204
|
+
return result;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
160
207
|
getSignal(id) {
|
|
161
208
|
return (0, injector_1.putIfAbsent)(this.signalMap, id, () => new mani_signal_1.Signal());
|
|
162
209
|
}
|
|
@@ -167,4 +214,6 @@ class EcsInjector extends injector_1.Injector {
|
|
|
167
214
|
}
|
|
168
215
|
}
|
|
169
216
|
exports.EcsInjector = EcsInjector;
|
|
217
|
+
EcsInjector.warnNoMatchingEntities = true;
|
|
218
|
+
EcsInjector.entityComponents = new Map();
|
|
170
219
|
//# sourceMappingURL=ecsInjector.js.map
|
package/lib/ecsInjector.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ecsInjector.js","sourceRoot":"","sources":["../src/ecsInjector.ts"],"names":[],"mappings":";;;AACA,6CAAmC;AACnC,yCAAuI;AACvI,mDAAoE;
|
|
1
|
+
{"version":3,"file":"ecsInjector.js","sourceRoot":"","sources":["../src/ecsInjector.ts"],"names":[],"mappings":"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"}
|
package/lib/entity.d.ts
CHANGED
|
@@ -11,6 +11,12 @@ export declare class Entity {
|
|
|
11
11
|
private markRemoval;
|
|
12
12
|
private _detached;
|
|
13
13
|
private readonly signalMap;
|
|
14
|
+
private dynamicComponents;
|
|
15
|
+
addDynamicComponent<T extends Class>(component: InstanceType<T>): void;
|
|
16
|
+
hasDynamicComponentClass<T extends Class>(componentClass: T): boolean;
|
|
17
|
+
removeDynamicComponentClass<T extends Class>(componentClass: T): void;
|
|
18
|
+
removeDynamicComponent<T extends Class>(component: InstanceType<T>): void;
|
|
19
|
+
getDynamicComponent<T extends Class>(componentClass: T): InstanceType<T> | undefined;
|
|
14
20
|
get detached(): boolean;
|
|
15
21
|
constructor();
|
|
16
22
|
onBeforeRemove?(): Promise<void>;
|
|
@@ -23,4 +29,5 @@ export declare class Entity {
|
|
|
23
29
|
detach(): Promise<void>;
|
|
24
30
|
has(entity: Entity): boolean;
|
|
25
31
|
getAllEntities(target?: Entity[]): Entity[];
|
|
32
|
+
hasDynamicComponents(): boolean;
|
|
26
33
|
}
|
package/lib/entity.js
CHANGED
|
@@ -2,10 +2,63 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Entity = void 0;
|
|
4
4
|
const mani_signal_1 = require("mani-signal");
|
|
5
|
-
const ecsInjector_1 = require("./ecsInjector");
|
|
6
5
|
const injector_1 = require("./injector");
|
|
6
|
+
const ecsInjector_1 = require("./ecsInjector");
|
|
7
7
|
let idCounter = 0;
|
|
8
8
|
class Entity {
|
|
9
|
+
addDynamicComponent(component) {
|
|
10
|
+
var _a;
|
|
11
|
+
if (this.hasDynamicComponentClass(component.constructor)) {
|
|
12
|
+
throw new Error('component of this class already added');
|
|
13
|
+
}
|
|
14
|
+
this.dynamicComponents.set(component.constructor, component);
|
|
15
|
+
if (!this.gameEngine)
|
|
16
|
+
return;
|
|
17
|
+
const systemContexts = this.gameEngine.injector.createSystemsForDynamicComponents(component.constructor, this);
|
|
18
|
+
if (!systemContexts)
|
|
19
|
+
return;
|
|
20
|
+
const preparePromises = [];
|
|
21
|
+
for (const context of systemContexts) {
|
|
22
|
+
context.system.onPrepare && preparePromises.push(context.system.onPrepare());
|
|
23
|
+
}
|
|
24
|
+
for (const context of systemContexts) {
|
|
25
|
+
(_a = this.gameEngine['entitySystemMap'].get(this)) === null || _a === void 0 ? void 0 : _a.add(context);
|
|
26
|
+
}
|
|
27
|
+
if (preparePromises.length === 0) {
|
|
28
|
+
this.gameEngine['startSystems'](systemContexts, () => { });
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
Promise.all(preparePromises).then(() => { var _a; return (_a = this.gameEngine) === null || _a === void 0 ? void 0 : _a['startSystems'](systemContexts); });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
hasDynamicComponentClass(componentClass) {
|
|
35
|
+
return this.dynamicComponents.has(componentClass);
|
|
36
|
+
}
|
|
37
|
+
removeDynamicComponentClass(componentClass) {
|
|
38
|
+
var _a;
|
|
39
|
+
const systemContexts = (_a = this.gameEngine) === null || _a === void 0 ? void 0 : _a['entitySystemMap'].get(this);
|
|
40
|
+
systemContexts === null || systemContexts === void 0 ? void 0 : systemContexts.forEach(systemContext => {
|
|
41
|
+
var _a, _b, _c;
|
|
42
|
+
const systemToDependencies = (_a = this.gameEngine) === null || _a === void 0 ? void 0 : _a.injector['dynamicComponentDependencyMap'];
|
|
43
|
+
const dependencies = systemToDependencies === null || systemToDependencies === void 0 ? void 0 : systemToDependencies.get(systemContext.system.constructor);
|
|
44
|
+
if (!dependencies)
|
|
45
|
+
return;
|
|
46
|
+
if (dependencies.some(dependency => dependency.type === componentClass)) {
|
|
47
|
+
(_c = (_b = this.gameEngine) === null || _b === void 0 ? void 0 : _b['disposeContext']) === null || _c === void 0 ? void 0 : _c.call(_b, systemContext);
|
|
48
|
+
systemContexts === null || systemContexts === void 0 ? void 0 : systemContexts.delete(systemContext);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
if (!this.dynamicComponents.delete(componentClass)) {
|
|
52
|
+
throw new Error('component not found: ' + JSON.stringify(componentClass));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
removeDynamicComponent(component) {
|
|
56
|
+
this.removeDynamicComponentClass(component.constructor);
|
|
57
|
+
}
|
|
58
|
+
getDynamicComponent(componentClass) {
|
|
59
|
+
return this.dynamicComponents.get(componentClass);
|
|
60
|
+
}
|
|
61
|
+
get detached() { return this._detached; }
|
|
9
62
|
constructor() {
|
|
10
63
|
this.children = new Set();
|
|
11
64
|
this.parentChanged = new mani_signal_1.Signal();
|
|
@@ -13,9 +66,9 @@ class Entity {
|
|
|
13
66
|
this.markRemoval = false;
|
|
14
67
|
this._detached = false;
|
|
15
68
|
this.signalMap = new Map();
|
|
69
|
+
this.dynamicComponents = new Map();
|
|
16
70
|
this.id = idCounter++;
|
|
17
71
|
}
|
|
18
|
-
get detached() { return this._detached; }
|
|
19
72
|
getSignal(id) {
|
|
20
73
|
return (0, injector_1.putIfAbsent)(this.signalMap, id, () => new mani_signal_1.Signal());
|
|
21
74
|
}
|
|
@@ -30,7 +83,7 @@ class Entity {
|
|
|
30
83
|
return this._parent;
|
|
31
84
|
}
|
|
32
85
|
getComponent(componentClass) {
|
|
33
|
-
const componentMap = ecsInjector_1.entityComponents.get(this.constructor);
|
|
86
|
+
const componentMap = ecsInjector_1.EcsInjector.entityComponents.get(this.constructor);
|
|
34
87
|
if (!componentMap) {
|
|
35
88
|
throw new Error(`No components in entity of type '${this.constructor.name}'.`);
|
|
36
89
|
}
|
|
@@ -97,6 +150,9 @@ class Entity {
|
|
|
97
150
|
}
|
|
98
151
|
return target;
|
|
99
152
|
}
|
|
153
|
+
hasDynamicComponents() {
|
|
154
|
+
return this.dynamicComponents.size > 0;
|
|
155
|
+
}
|
|
100
156
|
}
|
|
101
157
|
exports.Entity = Entity;
|
|
102
158
|
//# sourceMappingURL=entity.js.map
|
package/lib/entity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":";;;AACA,6CAAmC;AAEnC
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"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"}
|
package/lib/gameEngine.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ declare const defaultOptions: {
|
|
|
8
8
|
fixedDeltaTime: number;
|
|
9
9
|
plugins: GameEnginePlugin[];
|
|
10
10
|
};
|
|
11
|
-
export
|
|
11
|
+
export type GameEngineOptions = Partial<typeof defaultOptions>;
|
|
12
12
|
declare global {
|
|
13
13
|
interface GameEngineActions {
|
|
14
14
|
'testAction': string;
|
|
@@ -79,5 +79,7 @@ export declare class GameEngine {
|
|
|
79
79
|
private getStaticSignalMap;
|
|
80
80
|
dispose(): void;
|
|
81
81
|
private prepareFrame;
|
|
82
|
+
private startSystems;
|
|
83
|
+
private disposeContext;
|
|
82
84
|
}
|
|
83
85
|
export {};
|
package/lib/gameEngine.js
CHANGED
|
@@ -11,6 +11,10 @@ const defaultOptions = {
|
|
|
11
11
|
};
|
|
12
12
|
let id = 0;
|
|
13
13
|
class GameEngine {
|
|
14
|
+
get started() { return this._started; }
|
|
15
|
+
get frameCount() { return this._frameCount; }
|
|
16
|
+
get fixedFrameCount() { return this._fixedFrameCount; }
|
|
17
|
+
get numEntities() { return this.entitySystemMap.size; }
|
|
14
18
|
constructor(injector, clock) {
|
|
15
19
|
this.injector = injector;
|
|
16
20
|
this.clock = clock;
|
|
@@ -52,10 +56,6 @@ class GameEngine {
|
|
|
52
56
|
this.setupClock();
|
|
53
57
|
this.prepareFrame();
|
|
54
58
|
}
|
|
55
|
-
get started() { return this._started; }
|
|
56
|
-
get frameCount() { return this._frameCount; }
|
|
57
|
-
get fixedFrameCount() { return this._fixedFrameCount; }
|
|
58
|
-
get numEntities() { return this.entitySystemMap.size; }
|
|
59
59
|
static createDefault(options) {
|
|
60
60
|
const opts = Object.assign(Object.assign({}, defaultOptions), options);
|
|
61
61
|
const clock = new clock_1.GameClock({
|
|
@@ -269,19 +269,7 @@ class GameEngine {
|
|
|
269
269
|
this.entitySystemMap.delete(entity);
|
|
270
270
|
if (systemContexts) {
|
|
271
271
|
for (const context of systemContexts) {
|
|
272
|
-
|
|
273
|
-
const system = context.system;
|
|
274
|
-
this.unmapAnnotatedSignals(system);
|
|
275
|
-
system.onEnd && system.onEnd();
|
|
276
|
-
system.onPreFixedUpdate && this.onPreFixedUpdateSet.delete(system);
|
|
277
|
-
system.onFixedUpdate && this.onFixedUpdateSet.delete(system);
|
|
278
|
-
system.onUpdate && this.onUpdateSet.delete(system);
|
|
279
|
-
system.onLateUpdate && this.onLateUpdateSet.delete(system);
|
|
280
|
-
system.onPhysicsUpdate && this.onPhysicsUpdateSet.delete(system);
|
|
281
|
-
system.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.delete(system);
|
|
282
|
-
system.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.delete(system);
|
|
283
|
-
system.onLateFixedUpdate && this.onLateFixedUpdateSet.delete(system);
|
|
284
|
-
system.onRender && this.onRenderUpdateSet.delete(system);
|
|
272
|
+
this.disposeContext(context);
|
|
285
273
|
}
|
|
286
274
|
}
|
|
287
275
|
entity.onRemove.dispatch();
|
|
@@ -292,41 +280,24 @@ class GameEngine {
|
|
|
292
280
|
this.removeQueue = [];
|
|
293
281
|
for (const [entity, resolve] of this.addQueue) {
|
|
294
282
|
const preparePromises = [];
|
|
295
|
-
const
|
|
283
|
+
const nextSystemContexts = [];
|
|
296
284
|
const entities = entity.getAllEntities();
|
|
297
285
|
for (const entity of entities) {
|
|
298
286
|
if (entity.gameEngine)
|
|
299
287
|
throw new Error('Entity already added to a gameEngine');
|
|
300
288
|
entity.gameEngine = this;
|
|
301
|
-
const systemContexts = this.injector.
|
|
289
|
+
const systemContexts = this.injector.createSystemsForEntity(entity);
|
|
302
290
|
for (const context of systemContexts) {
|
|
303
291
|
context.system.onPrepare && preparePromises.push(context.system.onPrepare());
|
|
304
|
-
|
|
292
|
+
nextSystemContexts.push(context);
|
|
305
293
|
}
|
|
306
294
|
this.entitySystemMap.set(entity, systemContexts);
|
|
307
295
|
}
|
|
308
|
-
const startSystems = () => {
|
|
309
|
-
for (const context of nexSystemContexts) {
|
|
310
|
-
const system = context.system;
|
|
311
|
-
this.mapAnnotatedSignals(system);
|
|
312
|
-
system.onStart && system.onStart();
|
|
313
|
-
system.onPreFixedUpdate && this.onPreFixedUpdateSet.add(system);
|
|
314
|
-
system.onFixedUpdate && this.onFixedUpdateSet.add(system);
|
|
315
|
-
system.onUpdate && this.onUpdateSet.add(system);
|
|
316
|
-
system.onLateUpdate && this.onLateUpdateSet.add(system);
|
|
317
|
-
system.onPhysicsUpdate && this.onPhysicsUpdateSet.add(system);
|
|
318
|
-
system.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.add(system);
|
|
319
|
-
system.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.add(system);
|
|
320
|
-
system.onLateFixedUpdate && this.onLateFixedUpdateSet.add(system);
|
|
321
|
-
system.onRender && this.onRenderUpdateSet.add(system);
|
|
322
|
-
}
|
|
323
|
-
resolve();
|
|
324
|
-
};
|
|
325
296
|
if (preparePromises.length === 0) {
|
|
326
|
-
startSystems();
|
|
297
|
+
this.startSystems(nextSystemContexts, resolve);
|
|
327
298
|
}
|
|
328
299
|
else {
|
|
329
|
-
Promise.all(preparePromises).then(startSystems);
|
|
300
|
+
Promise.all(preparePromises).then(() => this.startSystems(nextSystemContexts, resolve));
|
|
330
301
|
}
|
|
331
302
|
}
|
|
332
303
|
this.addQueue = [];
|
|
@@ -336,6 +307,39 @@ class GameEngine {
|
|
|
336
307
|
});
|
|
337
308
|
this.onPrepare.dispatch();
|
|
338
309
|
}
|
|
310
|
+
startSystems(contexts, then) {
|
|
311
|
+
for (const context of contexts) {
|
|
312
|
+
const system = context.system;
|
|
313
|
+
this.mapAnnotatedSignals(system);
|
|
314
|
+
system.onStart && system.onStart();
|
|
315
|
+
system.onPreFixedUpdate && this.onPreFixedUpdateSet.add(system);
|
|
316
|
+
system.onFixedUpdate && this.onFixedUpdateSet.add(system);
|
|
317
|
+
system.onUpdate && this.onUpdateSet.add(system);
|
|
318
|
+
system.onLateUpdate && this.onLateUpdateSet.add(system);
|
|
319
|
+
system.onPhysicsUpdate && this.onPhysicsUpdateSet.add(system);
|
|
320
|
+
system.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.add(system);
|
|
321
|
+
system.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.add(system);
|
|
322
|
+
system.onLateFixedUpdate && this.onLateFixedUpdateSet.add(system);
|
|
323
|
+
system.onRender && this.onRenderUpdateSet.add(system);
|
|
324
|
+
}
|
|
325
|
+
then === null || then === void 0 ? void 0 : then();
|
|
326
|
+
}
|
|
327
|
+
;
|
|
328
|
+
disposeContext(context) {
|
|
329
|
+
context.dispose();
|
|
330
|
+
const system = context.system;
|
|
331
|
+
this.unmapAnnotatedSignals(system);
|
|
332
|
+
system.onEnd && system.onEnd();
|
|
333
|
+
system.onPreFixedUpdate && this.onPreFixedUpdateSet.delete(system);
|
|
334
|
+
system.onFixedUpdate && this.onFixedUpdateSet.delete(system);
|
|
335
|
+
system.onUpdate && this.onUpdateSet.delete(system);
|
|
336
|
+
system.onLateUpdate && this.onLateUpdateSet.delete(system);
|
|
337
|
+
system.onPhysicsUpdate && this.onPhysicsUpdateSet.delete(system);
|
|
338
|
+
system.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.delete(system);
|
|
339
|
+
system.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.delete(system);
|
|
340
|
+
system.onLateFixedUpdate && this.onLateFixedUpdateSet.delete(system);
|
|
341
|
+
system.onRender && this.onRenderUpdateSet.delete(system);
|
|
342
|
+
}
|
|
339
343
|
}
|
|
340
344
|
exports.GameEngine = GameEngine;
|
|
341
345
|
//# sourceMappingURL=gameEngine.js.map
|