dacha 0.15.2 → 0.16.0
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/build/contrib/components/animatable/comparator-condition-component-value.d.ts +1 -1
- package/build/contrib/components/animatable/group-state.d.ts +1 -1
- package/build/contrib/components/animatable/index.d.ts +1 -1
- package/build/contrib/components/animatable/one-dimensional-props.d.ts +1 -1
- package/build/contrib/components/animatable/one-dimensional-props.js +1 -3
- package/build/contrib/components/animatable/state.d.ts +1 -1
- package/build/contrib/components/animatable/timeline.d.ts +2 -2
- package/build/contrib/components/animatable/transition.d.ts +1 -1
- package/build/contrib/components/animatable/two-dimensional-props.d.ts +1 -1
- package/build/contrib/components/animatable/two-dimensional-props.js +1 -3
- package/build/contrib/components/animatable/types.d.ts +9 -9
- package/build/contrib/components/bitmap-text/index.d.ts +36 -0
- package/build/contrib/components/bitmap-text/index.js +42 -0
- package/build/contrib/components/index.d.ts +3 -2
- package/build/contrib/components/index.js +3 -1
- package/build/contrib/components/keyboard-control/index.d.ts +6 -8
- package/build/contrib/components/keyboard-control/index.js +8 -2
- package/build/contrib/components/mouse-control/index.d.ts +3 -7
- package/build/contrib/components/mouse-control/index.js +4 -1
- package/build/contrib/components/pixi-view/index.d.ts +20 -0
- package/build/contrib/components/pixi-view/index.js +24 -0
- package/build/contrib/components/shape/index.d.ts +64 -0
- package/build/contrib/components/shape/index.js +60 -0
- package/build/contrib/components/sprite/index.d.ts +17 -6
- package/build/contrib/components/sprite/index.js +10 -4
- package/build/contrib/systems/animator/index.d.ts +1 -1
- package/build/contrib/systems/animator/index.js +9 -9
- package/build/contrib/systems/animator/substate-pickers/index.d.ts +2 -3
- package/build/contrib/systems/animator/substate-pickers/one-dimensional-picker.d.ts +1 -1
- package/build/contrib/systems/animator/substate-pickers/picker.d.ts +1 -1
- package/build/contrib/systems/animator/substate-pickers/two-dimensional-picker.d.ts +1 -1
- package/build/contrib/systems/animator/utils.d.ts +2 -2
- package/build/contrib/systems/animator/utils.js +0 -1
- package/build/contrib/systems/audio-system/index.d.ts +1 -1
- package/build/contrib/systems/audio-system/index.js +20 -18
- package/build/contrib/systems/audio-system/types.d.ts +6 -6
- package/build/contrib/systems/behavior-system/system.d.ts +2 -0
- package/build/contrib/systems/behavior-system/system.js +18 -5
- package/build/contrib/systems/camera-system/system.d.ts +1 -1
- package/build/contrib/systems/camera-system/system.js +16 -10
- package/build/contrib/systems/game-stats-meter/index.d.ts +1 -1
- package/build/contrib/systems/game-stats-meter/index.js +6 -6
- package/build/contrib/systems/index.d.ts +2 -2
- package/build/contrib/systems/index.js +1 -1
- package/build/contrib/systems/keyboard-control-system/index.d.ts +1 -1
- package/build/contrib/systems/keyboard-control-system/index.js +5 -7
- package/build/contrib/systems/keyboard-input-system/input-listener.d.ts +1 -1
- package/build/contrib/systems/mouse-control-system/index.d.ts +1 -1
- package/build/contrib/systems/mouse-control-system/index.js +5 -7
- package/build/contrib/systems/mouse-input-system/subsystems/input-subsystem/mouse-input-listener.d.ts +1 -1
- package/build/contrib/systems/physics-system/subsystems/collision-detection/index.d.ts +1 -1
- package/build/contrib/systems/physics-system/subsystems/collision-detection/index.js +17 -16
- package/build/contrib/systems/physics-system/subsystems/collision-detection/types.d.ts +9 -9
- package/build/contrib/systems/physics-system/subsystems/collision-detection/types.js +3 -0
- package/build/contrib/systems/physics-system/subsystems/constraint-solver/index.d.ts +0 -1
- package/build/contrib/systems/physics-system/subsystems/constraint-solver/index.js +46 -59
- package/build/contrib/systems/physics-system/subsystems/physics/index.d.ts +1 -1
- package/build/contrib/systems/physics-system/subsystems/physics/index.js +10 -14
- package/build/contrib/systems/renderer/builders/bitmap-text-builder/index.d.ts +8 -0
- package/build/contrib/systems/renderer/builders/bitmap-text-builder/index.js +115 -0
- package/build/contrib/systems/renderer/builders/bitmap-text-builder/utils.d.ts +2 -0
- package/build/contrib/systems/renderer/builders/bitmap-text-builder/utils.js +7 -0
- package/build/contrib/systems/renderer/builders/builder.d.ts +7 -0
- package/build/contrib/systems/renderer/builders/index.d.ts +5 -0
- package/build/contrib/systems/renderer/builders/index.js +4 -0
- package/build/contrib/systems/renderer/builders/pixi-view-builder/index.d.ts +8 -0
- package/build/contrib/systems/renderer/builders/pixi-view-builder/index.js +31 -0
- package/build/contrib/systems/renderer/builders/shape-builder/index.d.ts +12 -0
- package/build/contrib/systems/renderer/builders/shape-builder/index.js +128 -0
- package/build/contrib/systems/renderer/builders/shape-builder/utils.d.ts +4 -0
- package/build/contrib/systems/renderer/builders/shape-builder/utils.js +85 -0
- package/build/contrib/systems/renderer/builders/sprite-builder/index.d.ts +19 -0
- package/build/contrib/systems/renderer/builders/sprite-builder/index.js +166 -0
- package/build/contrib/systems/renderer/builders/sprite-builder/utils.d.ts +4 -0
- package/build/contrib/systems/renderer/builders/sprite-builder/utils.js +16 -0
- package/build/contrib/systems/renderer/builders/utils.d.ts +1 -0
- package/build/contrib/systems/renderer/builders/utils.js +4 -0
- package/build/contrib/systems/renderer/consts.d.ts +5 -0
- package/build/contrib/systems/renderer/consts.js +12 -0
- package/build/contrib/systems/renderer/index.d.ts +2 -0
- package/build/contrib/systems/renderer/index.js +2 -0
- package/build/contrib/systems/renderer/renderer.d.ts +31 -0
- package/build/contrib/systems/renderer/renderer.js +249 -0
- package/build/contrib/systems/renderer/service/index.d.ts +20 -0
- package/build/contrib/systems/renderer/service/index.js +70 -0
- package/build/contrib/systems/{sprite-renderer → renderer}/sort/index.d.ts +1 -3
- package/build/contrib/systems/{sprite-renderer → renderer}/sort/index.js +2 -4
- package/build/contrib/systems/renderer/sort/sort-by-layer.d.ts +2 -0
- package/build/contrib/systems/renderer/sort/sort-by-layer.js +13 -0
- package/build/contrib/systems/renderer/sort/sort-by-x-axis.d.ts +2 -0
- package/build/contrib/systems/renderer/sort/sort-by-x-axis.js +9 -0
- package/build/contrib/systems/renderer/sort/sort-by-y-axis.d.ts +2 -0
- package/build/contrib/systems/renderer/sort/sort-by-y-axis.js +9 -0
- package/build/contrib/systems/renderer/sort/types.d.ts +2 -0
- package/build/contrib/systems/{sprite-renderer → renderer}/sort/utils.d.ts +1 -1
- package/build/contrib/systems/renderer/types.d.ts +26 -0
- package/build/contrib/systems/renderer/types.js +1 -0
- package/build/contrib/systems/renderer/utils.d.ts +5 -0
- package/build/contrib/systems/renderer/utils.js +42 -0
- package/build/contrib/types/input-events.d.ts +1 -1
- package/build/contrib/types/view.d.ts +1 -0
- package/build/contrib/types/view.js +1 -0
- package/build/engine/actor/actor-collection.d.ts +4 -1
- package/build/engine/actor/actor-collection.js +4 -1
- package/build/engine/actor/actor-creator.d.ts +3 -3
- package/build/engine/actor/actor-query.d.ts +29 -0
- package/build/engine/actor/actor-query.js +85 -0
- package/build/engine/actor/actor.d.ts +3 -4
- package/build/engine/actor/index.d.ts +2 -0
- package/build/engine/actor/index.js +1 -0
- package/build/engine/component/component.d.ts +2 -2
- package/build/engine/data-lib/cache-store.d.ts +2 -1
- package/build/engine/data-lib/cache-store.js +7 -1
- package/build/engine/engine.d.ts +28 -6
- package/build/engine/engine.js +35 -27
- package/build/engine/entity/entity.d.ts +1 -1
- package/build/engine/event-target/event-target.d.ts +1 -1
- package/build/engine/math-lib/vector/ops.d.ts +4 -4
- package/build/engine/math-lib/vector/ops.js +2 -3
- package/build/engine/resource-loader/loaders/image-loader.d.ts +1 -1
- package/build/engine/resource-loader/loaders/index.d.ts +2 -3
- package/build/engine/resource-loader/loaders/json-loader.d.ts +1 -1
- package/build/engine/resource-loader/loaders/loader.d.ts +1 -1
- package/build/engine/scene/scene-manager.js +7 -1
- package/build/engine/template/template-collection.d.ts +2 -2
- package/build/engine/template/template.d.ts +2 -2
- package/build/index.d.ts +2 -2
- package/build/index.js +1 -1
- package/build/types/global.d.ts +20 -0
- package/package.json +13 -10
- package/build/contrib/components/light/index.d.ts +0 -20
- package/build/contrib/components/light/index.js +0 -18
- package/build/contrib/components/renderable/index.d.ts +0 -44
- package/build/contrib/components/renderable/index.js +0 -65
- package/build/contrib/components/renderable/material.d.ts +0 -16
- package/build/contrib/components/renderable/material.js +0 -8
- package/build/contrib/components/sprite/material.d.ts +0 -16
- package/build/contrib/components/sprite/material.js +0 -8
- package/build/contrib/systems/sprite-renderer/index.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/index.js +0 -2
- package/build/contrib/systems/sprite-renderer/light-subsystem/index.d.ts +0 -13
- package/build/contrib/systems/sprite-renderer/light-subsystem/index.js +0 -62
- package/build/contrib/systems/sprite-renderer/light-subsystem/light-factory.d.ts +0 -4
- package/build/contrib/systems/sprite-renderer/light-subsystem/light-factory.js +0 -27
- package/build/contrib/systems/sprite-renderer/material-factory/index.d.ts +0 -4
- package/build/contrib/systems/sprite-renderer/material-factory/index.js +0 -32
- package/build/contrib/systems/sprite-renderer/renderer.d.ts +0 -36
- package/build/contrib/systems/sprite-renderer/renderer.js +0 -249
- package/build/contrib/systems/sprite-renderer/service/index.d.ts +0 -24
- package/build/contrib/systems/sprite-renderer/service/index.js +0 -52
- package/build/contrib/systems/sprite-renderer/sort/sort-by-fit.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sort/sort-by-fit.js +0 -12
- package/build/contrib/systems/sprite-renderer/sort/sort-by-layer.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sort/sort-by-layer.js +0 -14
- package/build/contrib/systems/sprite-renderer/sort/sort-by-x-axis.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sort/sort-by-x-axis.js +0 -15
- package/build/contrib/systems/sprite-renderer/sort/sort-by-y-axis.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sort/sort-by-y-axis.js +0 -15
- package/build/contrib/systems/sprite-renderer/sort/sort-by-z-axis.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sort/sort-by-z-axis.js +0 -6
- package/build/contrib/systems/sprite-renderer/sort/types.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sprite-cropper.d.ts +0 -8
- package/build/contrib/systems/sprite-renderer/sprite-cropper.js +0 -30
- package/build/contrib/systems/sprite-renderer/types.d.ts +0 -7
- package/build/contrib/systems/sprite-renderer/utils.d.ts +0 -9
- package/build/contrib/systems/sprite-renderer/utils.js +0 -47
- /package/build/contrib/systems/{sprite-renderer/sort/types.js → renderer/builders/builder.js} +0 -0
- /package/build/contrib/systems/{sprite-renderer → renderer/sort}/types.js +0 -0
- /package/build/contrib/systems/{sprite-renderer → renderer}/sort/utils.js +0 -0
|
@@ -4,5 +4,5 @@ import type { OneDimensionalProps } from '../../../components/animatable/one-dim
|
|
|
4
4
|
import type { Picker } from './picker';
|
|
5
5
|
export declare class OneDimensionalPicker implements Picker {
|
|
6
6
|
private getDistance;
|
|
7
|
-
getSubstate(actor: Actor, substates:
|
|
7
|
+
getSubstate(actor: Actor, substates: Substate[], props: OneDimensionalProps): Substate;
|
|
8
8
|
}
|
|
@@ -3,5 +3,5 @@ import type { Substate } from '../../../components/animatable/substate';
|
|
|
3
3
|
import type { OneDimensionalProps } from '../../../components/animatable/one-dimensional-props';
|
|
4
4
|
import type { TwoDimensionalProps } from '../../../components/animatable/two-dimensional-props';
|
|
5
5
|
export interface Picker {
|
|
6
|
-
getSubstate(actor: Actor, substates:
|
|
6
|
+
getSubstate(actor: Actor, substates: Substate[], props: OneDimensionalProps | TwoDimensionalProps): Substate;
|
|
7
7
|
}
|
|
@@ -4,5 +4,5 @@ import type { TwoDimensionalProps } from '../../../components/animatable/two-dim
|
|
|
4
4
|
import { Picker } from './picker';
|
|
5
5
|
export declare class TwoDimensionalPicker implements Picker {
|
|
6
6
|
private getDistance;
|
|
7
|
-
getSubstate(actor: Actor, substates:
|
|
7
|
+
getSubstate(actor: Actor, substates: Substate[], props: TwoDimensionalProps): Substate;
|
|
8
8
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { Actor } from '../../../engine/actor';
|
|
2
|
-
export declare const getValue: (actor: Actor, path:
|
|
3
|
-
export declare const setValue: (actor: Actor, path:
|
|
2
|
+
export declare const getValue: (actor: Actor, path: string[] | string) => unknown;
|
|
3
|
+
export declare const setValue: (actor: Actor, path: string[], value: unknown) => void;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Actor } from '../../../engine/actor';
|
|
2
2
|
const PATH_COMPONENTS = 'components';
|
|
3
3
|
const PATH_CHILDREN = 'children';
|
|
4
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
5
4
|
const _getValue = (actor, path, pathDepth) => {
|
|
6
5
|
let soughtValue = actor;
|
|
7
6
|
for (let i = 0; i < pathDepth && soughtValue !== undefined; i += 1) {
|
|
@@ -8,7 +8,7 @@ export declare class AudioSystem extends WorldSystem {
|
|
|
8
8
|
private audioGroups;
|
|
9
9
|
private audioStore;
|
|
10
10
|
private audioState;
|
|
11
|
-
private
|
|
11
|
+
private actorQuery?;
|
|
12
12
|
constructor(options: WorldSystemOptions);
|
|
13
13
|
onSceneLoad(scene: Scene): Promise<void>;
|
|
14
14
|
onSceneEnter(scene: Scene): void;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { WorldSystem } from '../../../engine/system';
|
|
2
|
-
import { Actor,
|
|
2
|
+
import { Actor, ActorQuery } from '../../../engine/actor';
|
|
3
3
|
import { AddActor, RemoveActor } from '../../../engine/events';
|
|
4
4
|
import { CacheStore } from '../../../engine/data-lib';
|
|
5
5
|
import { AudioSource } from '../../components';
|
|
6
|
-
import { PlayAudio, StopAudio, SetAudioVolume
|
|
6
|
+
import { PlayAudio, StopAudio, SetAudioVolume } from '../../../events';
|
|
7
7
|
import { getAllSources, loadAudio } from './utils';
|
|
8
8
|
const MASTER_GROUP = 'master';
|
|
9
9
|
const VOLUME_TOLERANCE = 0.001;
|
|
@@ -14,7 +14,7 @@ export class AudioSystem extends WorldSystem {
|
|
|
14
14
|
audioGroups;
|
|
15
15
|
audioStore;
|
|
16
16
|
audioState;
|
|
17
|
-
|
|
17
|
+
actorQuery;
|
|
18
18
|
constructor(options) {
|
|
19
19
|
super();
|
|
20
20
|
const { world, globalOptions, templateCollection } = options;
|
|
@@ -42,7 +42,9 @@ export class AudioSystem extends WorldSystem {
|
|
|
42
42
|
this.world.addEventListener(SetAudioVolume, this.handleSetAudioVolume);
|
|
43
43
|
window.addEventListener('click', this.resumeIfSuspended, { once: true });
|
|
44
44
|
window.addEventListener('keydown', this.resumeIfSuspended, { once: true });
|
|
45
|
-
window.addEventListener('touchstart', this.resumeIfSuspended, {
|
|
45
|
+
window.addEventListener('touchstart', this.resumeIfSuspended, {
|
|
46
|
+
once: true,
|
|
47
|
+
});
|
|
46
48
|
}
|
|
47
49
|
async onSceneLoad(scene) {
|
|
48
50
|
const allSources = [
|
|
@@ -61,20 +63,21 @@ export class AudioSystem extends WorldSystem {
|
|
|
61
63
|
allSources.forEach((src) => this.audioStore.retain(src));
|
|
62
64
|
}
|
|
63
65
|
onSceneEnter(scene) {
|
|
64
|
-
this.
|
|
65
|
-
|
|
66
|
+
this.actorQuery = new ActorQuery({
|
|
67
|
+
scene,
|
|
68
|
+
filter: [AudioSource],
|
|
66
69
|
});
|
|
67
|
-
this.
|
|
68
|
-
this.
|
|
69
|
-
this.
|
|
70
|
+
this.actorQuery.getActors().forEach((actor) => this.initAudio(actor));
|
|
71
|
+
this.actorQuery.addEventListener(AddActor, this.handleActorAdd);
|
|
72
|
+
this.actorQuery.addEventListener(RemoveActor, this.handleActorRemove);
|
|
70
73
|
}
|
|
71
74
|
onSceneExit() {
|
|
72
75
|
this.audioState.forEach((audioState) => {
|
|
73
76
|
audioState.sourceNode.stop();
|
|
74
77
|
});
|
|
75
|
-
this.
|
|
76
|
-
this.
|
|
77
|
-
this.
|
|
78
|
+
this.actorQuery?.removeEventListener(AddActor, this.handleActorAdd);
|
|
79
|
+
this.actorQuery?.removeEventListener(RemoveActor, this.handleActorRemove);
|
|
80
|
+
this.actorQuery = undefined;
|
|
78
81
|
}
|
|
79
82
|
onSceneDestroy(scene) {
|
|
80
83
|
const allSources = [
|
|
@@ -143,9 +146,7 @@ export class AudioSystem extends WorldSystem {
|
|
|
143
146
|
};
|
|
144
147
|
resumeIfSuspended = () => {
|
|
145
148
|
if (this.audioContext.state === 'suspended') {
|
|
146
|
-
void this.audioContext
|
|
147
|
-
.resume()
|
|
148
|
-
.catch((err) => {
|
|
149
|
+
void this.audioContext.resume().catch((err) => {
|
|
149
150
|
console.warn('Cannot resume a audio context', err);
|
|
150
151
|
});
|
|
151
152
|
}
|
|
@@ -161,7 +162,7 @@ export class AudioSystem extends WorldSystem {
|
|
|
161
162
|
if (!audioSource) {
|
|
162
163
|
return;
|
|
163
164
|
}
|
|
164
|
-
const { src, group, volume, looped, playing
|
|
165
|
+
const { src, group, volume, looped, playing } = audioSource;
|
|
165
166
|
const audioGroupNode = this.audioGroups[group];
|
|
166
167
|
if (!audioGroupNode || !this.audioStore.has(src)) {
|
|
167
168
|
return;
|
|
@@ -206,12 +207,13 @@ export class AudioSystem extends WorldSystem {
|
|
|
206
207
|
updateAudio(actor) {
|
|
207
208
|
const audioSource = actor.getComponent(AudioSource);
|
|
208
209
|
const audioState = this.audioState.get(actor.id);
|
|
209
|
-
if (Math.abs(audioSource.volume - audioState.properties.volume) >
|
|
210
|
+
if (Math.abs(audioSource.volume - audioState.properties.volume) >
|
|
211
|
+
VOLUME_TOLERANCE) {
|
|
210
212
|
audioState.gainNode.gain.value = audioSource.volume;
|
|
211
213
|
}
|
|
212
214
|
}
|
|
213
215
|
update() {
|
|
214
|
-
this.
|
|
216
|
+
this.actorQuery?.getActors().forEach((actor) => {
|
|
215
217
|
const audioSource = actor.getComponent(AudioSource);
|
|
216
218
|
const audioState = this.audioState.get(actor.id);
|
|
217
219
|
if (audioSource.playing && audioState) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface AudioStateNode {
|
|
2
2
|
sourceNode: AudioBufferSourceNode;
|
|
3
3
|
gainNode: GainNode;
|
|
4
4
|
properties: {
|
|
@@ -6,12 +6,12 @@ export type AudioStateNode = {
|
|
|
6
6
|
group: string;
|
|
7
7
|
endedListener: () => void;
|
|
8
8
|
};
|
|
9
|
-
}
|
|
10
|
-
export
|
|
9
|
+
}
|
|
10
|
+
export interface AudioGroup {
|
|
11
11
|
id: string;
|
|
12
12
|
name: string;
|
|
13
13
|
volume: number;
|
|
14
|
-
}
|
|
15
|
-
export
|
|
14
|
+
}
|
|
15
|
+
export interface AudioGroups {
|
|
16
16
|
groups: AudioGroup[];
|
|
17
|
-
}
|
|
17
|
+
}
|
|
@@ -9,7 +9,9 @@ export declare class BehaviorSystem extends SceneSystem {
|
|
|
9
9
|
private scene;
|
|
10
10
|
private activeBehaviors;
|
|
11
11
|
constructor(options: SceneSystemOptions);
|
|
12
|
+
onSceneEnter(): void;
|
|
12
13
|
onSceneDestroy(): void;
|
|
14
|
+
private handleActorAdd;
|
|
13
15
|
private handleActorRemove;
|
|
14
16
|
private setUpBehavior;
|
|
15
17
|
update(options: UpdateOptions): void;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SceneSystem } from '../../../engine/system';
|
|
2
2
|
import { ActorCollection } from '../../../engine/actor';
|
|
3
3
|
import { Behaviors } from '../../components';
|
|
4
|
-
import { RemoveActor } from '../../../engine/events';
|
|
4
|
+
import { AddActor, RemoveActor } from '../../../engine/events';
|
|
5
5
|
export class BehaviorSystem extends SceneSystem {
|
|
6
6
|
behaviorCollection;
|
|
7
7
|
actorSpawner;
|
|
@@ -28,15 +28,24 @@ export class BehaviorSystem extends SceneSystem {
|
|
|
28
28
|
return acc;
|
|
29
29
|
}, {});
|
|
30
30
|
this.activeBehaviors = {};
|
|
31
|
+
}
|
|
32
|
+
onSceneEnter() {
|
|
33
|
+
this.behaviorCollection.forEach((actor) => this.setUpBehavior(actor));
|
|
34
|
+
this.behaviorCollection.addEventListener(AddActor, this.handleActorAdd);
|
|
31
35
|
this.behaviorCollection.addEventListener(RemoveActor, this.handleActorRemove);
|
|
32
36
|
}
|
|
33
37
|
onSceneDestroy() {
|
|
38
|
+
this.behaviorCollection.removeEventListener(AddActor, this.handleActorAdd);
|
|
34
39
|
this.behaviorCollection.removeEventListener(RemoveActor, this.handleActorRemove);
|
|
35
40
|
this.behaviorCollection.forEach((actor) => {
|
|
36
41
|
this.activeBehaviors[actor.id].forEach((behavior) => behavior.destroy?.());
|
|
37
42
|
delete this.activeBehaviors[actor.id];
|
|
38
43
|
});
|
|
39
44
|
}
|
|
45
|
+
handleActorAdd = (event) => {
|
|
46
|
+
const { actor } = event;
|
|
47
|
+
this.setUpBehavior(actor);
|
|
48
|
+
};
|
|
40
49
|
handleActorRemove = (event) => {
|
|
41
50
|
const { actor } = event;
|
|
42
51
|
this.activeBehaviors[actor.id].forEach((behavior) => behavior.destroy?.());
|
|
@@ -44,7 +53,14 @@ export class BehaviorSystem extends SceneSystem {
|
|
|
44
53
|
};
|
|
45
54
|
setUpBehavior(actor) {
|
|
46
55
|
const { list } = actor.getComponent(Behaviors);
|
|
47
|
-
this.activeBehaviors[actor.id] = list
|
|
56
|
+
this.activeBehaviors[actor.id] = list
|
|
57
|
+
.filter((config) => {
|
|
58
|
+
if (!this.behaviors[config.name]) {
|
|
59
|
+
console.warn(`Behavior not found: ${config.name}`);
|
|
60
|
+
}
|
|
61
|
+
return this.behaviors[config.name];
|
|
62
|
+
})
|
|
63
|
+
.map((config) => {
|
|
48
64
|
const options = {
|
|
49
65
|
...config.options,
|
|
50
66
|
actor,
|
|
@@ -59,9 +75,6 @@ export class BehaviorSystem extends SceneSystem {
|
|
|
59
75
|
}
|
|
60
76
|
update(options) {
|
|
61
77
|
this.behaviorCollection.forEach((actor) => {
|
|
62
|
-
if (!this.activeBehaviors[actor.id]) {
|
|
63
|
-
this.setUpBehavior(actor);
|
|
64
|
-
}
|
|
65
78
|
this.activeBehaviors[actor.id].forEach((behavior) => behavior.update?.(options));
|
|
66
79
|
});
|
|
67
80
|
}
|
|
@@ -2,7 +2,7 @@ import { WorldSystem } from '../../../engine/system';
|
|
|
2
2
|
import type { Scene } from '../../../engine/scene';
|
|
3
3
|
import type { WorldSystemOptions } from '../../../engine/system';
|
|
4
4
|
export declare class CameraSystem extends WorldSystem {
|
|
5
|
-
private
|
|
5
|
+
private actorQuery?;
|
|
6
6
|
private window;
|
|
7
7
|
private cameraService;
|
|
8
8
|
constructor(options: WorldSystemOptions);
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { WorldSystem } from '../../../engine/system';
|
|
2
|
-
import {
|
|
2
|
+
import { ActorQuery } from '../../../engine/actor';
|
|
3
3
|
import { Camera } from '../../components/camera';
|
|
4
4
|
import { getWindowNode } from '../../utils/get-window-node';
|
|
5
5
|
import { CameraService } from './service';
|
|
6
6
|
export class CameraSystem extends WorldSystem {
|
|
7
|
-
|
|
7
|
+
actorQuery;
|
|
8
8
|
window;
|
|
9
9
|
cameraService;
|
|
10
10
|
constructor(options) {
|
|
11
11
|
super();
|
|
12
|
-
const { windowNodeId, world
|
|
12
|
+
const { windowNodeId, world } = options;
|
|
13
13
|
const windowNode = getWindowNode(windowNodeId);
|
|
14
14
|
this.window = windowNode;
|
|
15
15
|
this.cameraService = new CameraService({
|
|
@@ -20,13 +20,14 @@ export class CameraSystem extends WorldSystem {
|
|
|
20
20
|
window.addEventListener('resize', this.handleWindowResize);
|
|
21
21
|
}
|
|
22
22
|
onSceneEnter(scene) {
|
|
23
|
-
this.
|
|
24
|
-
|
|
23
|
+
this.actorQuery = new ActorQuery({
|
|
24
|
+
scene,
|
|
25
|
+
filter: [Camera],
|
|
25
26
|
});
|
|
26
27
|
this.handleWindowResize();
|
|
27
28
|
}
|
|
28
29
|
onSceneExit() {
|
|
29
|
-
this.
|
|
30
|
+
this.actorQuery = undefined;
|
|
30
31
|
}
|
|
31
32
|
onWorldDestroy() {
|
|
32
33
|
window.removeEventListener('resize', this.handleWindowResize);
|
|
@@ -46,17 +47,22 @@ export class CameraSystem extends WorldSystem {
|
|
|
46
47
|
}
|
|
47
48
|
};
|
|
48
49
|
handleCameraUpdate = (actor) => {
|
|
49
|
-
this.
|
|
50
|
+
this.actorQuery?.getActors().forEach((cameraActor) => {
|
|
50
51
|
const camera = cameraActor.getComponent(Camera);
|
|
51
52
|
camera.current = actor.id === cameraActor.id;
|
|
52
53
|
});
|
|
53
54
|
this.handleWindowResize();
|
|
54
55
|
};
|
|
55
56
|
findCurrentCamera = () => {
|
|
56
|
-
|
|
57
|
+
if (!this.actorQuery) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const actor of this.actorQuery.getActors()) {
|
|
57
61
|
const camera = actor.getComponent(Camera);
|
|
58
|
-
|
|
59
|
-
|
|
62
|
+
if (camera.current) {
|
|
63
|
+
return actor;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
60
66
|
};
|
|
61
67
|
}
|
|
62
68
|
CameraSystem.systemName = 'CameraSystem';
|
|
@@ -3,7 +3,7 @@ import type { WorldSystemOptions, UpdateOptions } from '../../../engine/system';
|
|
|
3
3
|
import type { Scene } from '../../../engine/scene';
|
|
4
4
|
export declare class GameStatsMeter extends WorldSystem {
|
|
5
5
|
private world;
|
|
6
|
-
private
|
|
6
|
+
private actorQuery?;
|
|
7
7
|
private frequency;
|
|
8
8
|
private fps;
|
|
9
9
|
private time;
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import { WorldSystem } from '../../../engine/system';
|
|
2
2
|
import { GameStatsUpdate } from '../../events';
|
|
3
|
-
import {
|
|
3
|
+
import { ActorQuery } from '../../../engine/actor';
|
|
4
4
|
const MS_IN_SEC = 1000;
|
|
5
5
|
export class GameStatsMeter extends WorldSystem {
|
|
6
6
|
world;
|
|
7
|
-
|
|
7
|
+
actorQuery;
|
|
8
8
|
frequency;
|
|
9
9
|
fps;
|
|
10
10
|
time;
|
|
11
11
|
constructor(options) {
|
|
12
12
|
super();
|
|
13
|
-
const { world, frequency
|
|
13
|
+
const { world, frequency } = options;
|
|
14
14
|
this.world = world;
|
|
15
15
|
this.frequency = frequency || MS_IN_SEC;
|
|
16
16
|
this.fps = 0;
|
|
17
17
|
this.time = 0;
|
|
18
18
|
}
|
|
19
19
|
onSceneEnter(scene) {
|
|
20
|
-
this.
|
|
20
|
+
this.actorQuery = new ActorQuery({ scene, filter: [] });
|
|
21
21
|
}
|
|
22
22
|
onSceneExit() {
|
|
23
|
-
this.
|
|
23
|
+
this.actorQuery = undefined;
|
|
24
24
|
}
|
|
25
25
|
update(options) {
|
|
26
26
|
const { deltaTime } = options;
|
|
@@ -29,7 +29,7 @@ export class GameStatsMeter extends WorldSystem {
|
|
|
29
29
|
if (this.time >= this.frequency) {
|
|
30
30
|
this.world.dispatchEvent(GameStatsUpdate, {
|
|
31
31
|
fps: (this.fps * MS_IN_SEC) / this.time,
|
|
32
|
-
actorsCount: this.
|
|
32
|
+
actorsCount: this.actorQuery?.getActors().size ?? 0,
|
|
33
33
|
});
|
|
34
34
|
this.fps = 0;
|
|
35
35
|
this.time = 0;
|
|
@@ -8,7 +8,7 @@ export { MouseInputSystem } from './mouse-input-system';
|
|
|
8
8
|
export { PhysicsSystem } from './physics-system';
|
|
9
9
|
export { BehaviorSystem, Behavior } from './behavior-system';
|
|
10
10
|
export type { BehaviorOptions } from './behavior-system';
|
|
11
|
-
export { SpriteRenderer, SpriteRendererService } from './sprite-renderer';
|
|
12
11
|
export { UIBridge } from './ui-bridge';
|
|
13
|
-
export type { UIOptions, UIInitFn, UIDestroyFn, LoadUIFn
|
|
12
|
+
export type { UIOptions, UIInitFn, UIDestroyFn, LoadUIFn } from './ui-bridge';
|
|
14
13
|
export { AudioSystem } from './audio-system';
|
|
14
|
+
export { Renderer, RendererService } from './renderer';
|
|
@@ -7,6 +7,6 @@ export { MouseControlSystem } from './mouse-control-system';
|
|
|
7
7
|
export { MouseInputSystem } from './mouse-input-system';
|
|
8
8
|
export { PhysicsSystem } from './physics-system';
|
|
9
9
|
export { BehaviorSystem, Behavior } from './behavior-system';
|
|
10
|
-
export { SpriteRenderer, SpriteRendererService } from './sprite-renderer';
|
|
11
10
|
export { UIBridge } from './ui-bridge';
|
|
12
11
|
export { AudioSystem } from './audio-system';
|
|
12
|
+
export { Renderer, RendererService } from './renderer';
|
|
@@ -3,7 +3,7 @@ import type { WorldSystemOptions } from '../../../engine/system';
|
|
|
3
3
|
import type { Scene } from '../../../engine/scene';
|
|
4
4
|
export declare class KeyboardControlSystem extends WorldSystem {
|
|
5
5
|
private world;
|
|
6
|
-
private
|
|
6
|
+
private actorQuery?;
|
|
7
7
|
private pressedKeys;
|
|
8
8
|
private events;
|
|
9
9
|
constructor(options: WorldSystemOptions);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { WorldSystem } from '../../../engine/system';
|
|
2
|
-
import {
|
|
2
|
+
import { ActorQuery } from '../../../engine/actor';
|
|
3
3
|
import { KeyboardControl } from '../../components/keyboard-control';
|
|
4
4
|
import { KeyboardInput } from '../../events';
|
|
5
5
|
export class KeyboardControlSystem extends WorldSystem {
|
|
6
6
|
world;
|
|
7
|
-
|
|
7
|
+
actorQuery;
|
|
8
8
|
pressedKeys;
|
|
9
9
|
events;
|
|
10
10
|
constructor(options) {
|
|
@@ -15,12 +15,10 @@ export class KeyboardControlSystem extends WorldSystem {
|
|
|
15
15
|
this.world.addEventListener(KeyboardInput, this.handleKeyboardInput);
|
|
16
16
|
}
|
|
17
17
|
onSceneEnter(scene) {
|
|
18
|
-
this.
|
|
19
|
-
components: [KeyboardControl],
|
|
20
|
-
});
|
|
18
|
+
this.actorQuery = new ActorQuery({ scene, filter: [KeyboardControl] });
|
|
21
19
|
}
|
|
22
20
|
onSceneExit() {
|
|
23
|
-
this.
|
|
21
|
+
this.actorQuery = undefined;
|
|
24
22
|
}
|
|
25
23
|
onWorldDestroy() {
|
|
26
24
|
this.world.removeEventListener(KeyboardInput, this.handleKeyboardInput);
|
|
@@ -42,7 +40,7 @@ export class KeyboardControlSystem extends WorldSystem {
|
|
|
42
40
|
this.pressedKeys.delete(event.key);
|
|
43
41
|
}
|
|
44
42
|
});
|
|
45
|
-
this.
|
|
43
|
+
this.actorQuery?.getActors().forEach((actor) => {
|
|
46
44
|
const control = actor.getComponent(KeyboardControl);
|
|
47
45
|
// Resend control event when key is pressed without actual event if keepEmit is set to true
|
|
48
46
|
this.pressedKeys.forEach((key) => {
|
|
@@ -2,7 +2,7 @@ import { WorldSystem } from '../../../engine/system';
|
|
|
2
2
|
import type { WorldSystemOptions } from '../../../engine/system';
|
|
3
3
|
import type { Scene } from '../../../engine/scene';
|
|
4
4
|
export declare class MouseControlSystem extends WorldSystem {
|
|
5
|
-
private
|
|
5
|
+
private actorQuery?;
|
|
6
6
|
private world;
|
|
7
7
|
constructor(options: WorldSystemOptions);
|
|
8
8
|
onSceneEnter(scene: Scene): void;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { WorldSystem } from '../../../engine/system';
|
|
2
|
-
import {
|
|
2
|
+
import { ActorQuery } from '../../../engine/actor';
|
|
3
3
|
import { MouseControl } from '../../components/mouse-control';
|
|
4
4
|
import { MouseInput } from '../../events';
|
|
5
5
|
export class MouseControlSystem extends WorldSystem {
|
|
6
|
-
|
|
6
|
+
actorQuery;
|
|
7
7
|
world;
|
|
8
8
|
constructor(options) {
|
|
9
9
|
super();
|
|
@@ -11,18 +11,16 @@ export class MouseControlSystem extends WorldSystem {
|
|
|
11
11
|
this.world.addEventListener(MouseInput, this.handleMouseInput);
|
|
12
12
|
}
|
|
13
13
|
onSceneEnter(scene) {
|
|
14
|
-
this.
|
|
15
|
-
components: [MouseControl],
|
|
16
|
-
});
|
|
14
|
+
this.actorQuery = new ActorQuery({ scene, filter: [MouseControl] });
|
|
17
15
|
}
|
|
18
16
|
onSceneExit() {
|
|
19
|
-
this.
|
|
17
|
+
this.actorQuery = undefined;
|
|
20
18
|
}
|
|
21
19
|
onWorldDestroy() {
|
|
22
20
|
this.world.removeEventListener(MouseInput, this.handleMouseInput);
|
|
23
21
|
}
|
|
24
22
|
handleMouseInput = (event) => {
|
|
25
|
-
this.
|
|
23
|
+
this.actorQuery?.getActors().forEach((actor) => {
|
|
26
24
|
const control = actor.getComponent(MouseControl);
|
|
27
25
|
const eventBinding = control.inputEventBindings[event.eventType]?.[event.button];
|
|
28
26
|
if (eventBinding) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Transform, Collider, RigidBody
|
|
1
|
+
import { ActorQuery } from '../../../../../engine/actor';
|
|
2
|
+
import { Transform, Collider, RigidBody } from '../../../../components';
|
|
3
3
|
import { AddActor, RemoveActor } from '../../../../../engine/events';
|
|
4
4
|
import { Collision } from '../../../../events';
|
|
5
5
|
import { insertionSort } from '../../../../../engine/data-lib';
|
|
@@ -9,18 +9,16 @@ import { intersectionCheckers } from './intersection-checkers';
|
|
|
9
9
|
import { DispersionCalculator } from './dispersion-calculator';
|
|
10
10
|
import { checkTransform, checkCollider } from './reorientation-checkers';
|
|
11
11
|
export class CollisionDetectionSubsystem {
|
|
12
|
-
|
|
12
|
+
actorQuery;
|
|
13
13
|
scene;
|
|
14
14
|
axis;
|
|
15
15
|
entriesMap;
|
|
16
16
|
collisionPairs;
|
|
17
17
|
entriesToDelete;
|
|
18
18
|
constructor(options) {
|
|
19
|
-
this.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Transform,
|
|
23
|
-
],
|
|
19
|
+
this.actorQuery = new ActorQuery({
|
|
20
|
+
scene: options.scene,
|
|
21
|
+
filter: [Collider, Transform],
|
|
24
22
|
});
|
|
25
23
|
this.scene = options.scene;
|
|
26
24
|
this.axis = {
|
|
@@ -36,13 +34,15 @@ export class CollisionDetectionSubsystem {
|
|
|
36
34
|
this.entriesMap = new Map();
|
|
37
35
|
this.collisionPairs = [];
|
|
38
36
|
this.entriesToDelete = new Set();
|
|
39
|
-
this.
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
this.actorQuery
|
|
38
|
+
.getActors()
|
|
39
|
+
.forEach((actor) => this.addCollisionEntry(actor));
|
|
40
|
+
this.actorQuery.addEventListener(AddActor, this.handleActorAdd);
|
|
41
|
+
this.actorQuery.addEventListener(RemoveActor, this.handleActorRemove);
|
|
42
42
|
}
|
|
43
43
|
destroy() {
|
|
44
|
-
this.
|
|
45
|
-
this.
|
|
44
|
+
this.actorQuery.removeEventListener(AddActor, this.handleActorAdd);
|
|
45
|
+
this.actorQuery.removeEventListener(RemoveActor, this.handleActorRemove);
|
|
46
46
|
}
|
|
47
47
|
handleActorAdd = (event) => {
|
|
48
48
|
this.addCollisionEntry(event.actor);
|
|
@@ -59,7 +59,8 @@ export class CollisionDetectionSubsystem {
|
|
|
59
59
|
const collider = actor.getComponent(Collider);
|
|
60
60
|
const transformOld = entry.orientationData.transform;
|
|
61
61
|
const colliderOld = entry.orientationData.collider;
|
|
62
|
-
return checkTransform(transform, transformOld) ||
|
|
62
|
+
return (checkTransform(transform, transformOld) ||
|
|
63
|
+
checkCollider(collider, colliderOld));
|
|
63
64
|
}
|
|
64
65
|
getOrientationData(actor) {
|
|
65
66
|
const transform = actor.getComponent(Transform);
|
|
@@ -148,7 +149,7 @@ export class CollisionDetectionSubsystem {
|
|
|
148
149
|
testAABB(entry1, entry2, axis) {
|
|
149
150
|
const aabb1 = entry1.aabb;
|
|
150
151
|
const aabb2 = entry2.aabb;
|
|
151
|
-
return aabb1.max[axis] > aabb2.min[axis] && aabb1.min[axis] < aabb2.max[axis];
|
|
152
|
+
return (aabb1.max[axis] > aabb2.min[axis] && aabb1.min[axis] < aabb2.max[axis]);
|
|
152
153
|
}
|
|
153
154
|
sweepAndPrune() {
|
|
154
155
|
const [mainAxis, secondAxis] = this.getAxes();
|
|
@@ -216,7 +217,7 @@ export class CollisionDetectionSubsystem {
|
|
|
216
217
|
}
|
|
217
218
|
update() {
|
|
218
219
|
this.clearDeletedEntries();
|
|
219
|
-
this.
|
|
220
|
+
this.actorQuery.getActors().forEach((actor) => {
|
|
220
221
|
if (!this.checkOnReorientation(actor)) {
|
|
221
222
|
return;
|
|
222
223
|
}
|
|
@@ -16,15 +16,15 @@ export interface Edge {
|
|
|
16
16
|
export interface EdgeWithNormal extends Edge {
|
|
17
17
|
normal: Vector2;
|
|
18
18
|
}
|
|
19
|
-
export
|
|
19
|
+
export interface BoxGeometry {
|
|
20
20
|
center: Point;
|
|
21
|
-
points:
|
|
22
|
-
edges:
|
|
23
|
-
}
|
|
24
|
-
export
|
|
21
|
+
points: Point[];
|
|
22
|
+
edges: EdgeWithNormal[];
|
|
23
|
+
}
|
|
24
|
+
export interface CircleGeometry {
|
|
25
25
|
center: Point;
|
|
26
26
|
radius: number;
|
|
27
|
-
}
|
|
27
|
+
}
|
|
28
28
|
export type Geometry = BoxGeometry | CircleGeometry;
|
|
29
29
|
export interface OrientationData {
|
|
30
30
|
transform: {
|
|
@@ -55,7 +55,7 @@ export interface SortedItem {
|
|
|
55
55
|
value: number;
|
|
56
56
|
}
|
|
57
57
|
export interface AxisEntry {
|
|
58
|
-
sortedList:
|
|
58
|
+
sortedList: SortedItem[];
|
|
59
59
|
dispersionCalculator: DispersionCalculator;
|
|
60
60
|
}
|
|
61
61
|
export type Axis = 'x' | 'y';
|
|
@@ -64,7 +64,7 @@ export interface Axes {
|
|
|
64
64
|
y: AxisEntry;
|
|
65
65
|
}
|
|
66
66
|
export type CollisionPair = [CollisionEntry, CollisionEntry];
|
|
67
|
-
export
|
|
67
|
+
export interface Intersection {
|
|
68
68
|
mtv1: Vector2;
|
|
69
69
|
mtv2: Vector2;
|
|
70
|
-
}
|
|
70
|
+
}
|