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.
Files changed (169) hide show
  1. package/build/contrib/components/animatable/comparator-condition-component-value.d.ts +1 -1
  2. package/build/contrib/components/animatable/group-state.d.ts +1 -1
  3. package/build/contrib/components/animatable/index.d.ts +1 -1
  4. package/build/contrib/components/animatable/one-dimensional-props.d.ts +1 -1
  5. package/build/contrib/components/animatable/one-dimensional-props.js +1 -3
  6. package/build/contrib/components/animatable/state.d.ts +1 -1
  7. package/build/contrib/components/animatable/timeline.d.ts +2 -2
  8. package/build/contrib/components/animatable/transition.d.ts +1 -1
  9. package/build/contrib/components/animatable/two-dimensional-props.d.ts +1 -1
  10. package/build/contrib/components/animatable/two-dimensional-props.js +1 -3
  11. package/build/contrib/components/animatable/types.d.ts +9 -9
  12. package/build/contrib/components/bitmap-text/index.d.ts +36 -0
  13. package/build/contrib/components/bitmap-text/index.js +42 -0
  14. package/build/contrib/components/index.d.ts +3 -2
  15. package/build/contrib/components/index.js +3 -1
  16. package/build/contrib/components/keyboard-control/index.d.ts +6 -8
  17. package/build/contrib/components/keyboard-control/index.js +8 -2
  18. package/build/contrib/components/mouse-control/index.d.ts +3 -7
  19. package/build/contrib/components/mouse-control/index.js +4 -1
  20. package/build/contrib/components/pixi-view/index.d.ts +20 -0
  21. package/build/contrib/components/pixi-view/index.js +24 -0
  22. package/build/contrib/components/shape/index.d.ts +64 -0
  23. package/build/contrib/components/shape/index.js +60 -0
  24. package/build/contrib/components/sprite/index.d.ts +17 -6
  25. package/build/contrib/components/sprite/index.js +10 -4
  26. package/build/contrib/systems/animator/index.d.ts +1 -1
  27. package/build/contrib/systems/animator/index.js +9 -9
  28. package/build/contrib/systems/animator/substate-pickers/index.d.ts +2 -3
  29. package/build/contrib/systems/animator/substate-pickers/one-dimensional-picker.d.ts +1 -1
  30. package/build/contrib/systems/animator/substate-pickers/picker.d.ts +1 -1
  31. package/build/contrib/systems/animator/substate-pickers/two-dimensional-picker.d.ts +1 -1
  32. package/build/contrib/systems/animator/utils.d.ts +2 -2
  33. package/build/contrib/systems/animator/utils.js +0 -1
  34. package/build/contrib/systems/audio-system/index.d.ts +1 -1
  35. package/build/contrib/systems/audio-system/index.js +20 -18
  36. package/build/contrib/systems/audio-system/types.d.ts +6 -6
  37. package/build/contrib/systems/behavior-system/system.d.ts +2 -0
  38. package/build/contrib/systems/behavior-system/system.js +18 -5
  39. package/build/contrib/systems/camera-system/system.d.ts +1 -1
  40. package/build/contrib/systems/camera-system/system.js +16 -10
  41. package/build/contrib/systems/game-stats-meter/index.d.ts +1 -1
  42. package/build/contrib/systems/game-stats-meter/index.js +6 -6
  43. package/build/contrib/systems/index.d.ts +2 -2
  44. package/build/contrib/systems/index.js +1 -1
  45. package/build/contrib/systems/keyboard-control-system/index.d.ts +1 -1
  46. package/build/contrib/systems/keyboard-control-system/index.js +5 -7
  47. package/build/contrib/systems/keyboard-input-system/input-listener.d.ts +1 -1
  48. package/build/contrib/systems/mouse-control-system/index.d.ts +1 -1
  49. package/build/contrib/systems/mouse-control-system/index.js +5 -7
  50. package/build/contrib/systems/mouse-input-system/subsystems/input-subsystem/mouse-input-listener.d.ts +1 -1
  51. package/build/contrib/systems/physics-system/subsystems/collision-detection/index.d.ts +1 -1
  52. package/build/contrib/systems/physics-system/subsystems/collision-detection/index.js +17 -16
  53. package/build/contrib/systems/physics-system/subsystems/collision-detection/types.d.ts +9 -9
  54. package/build/contrib/systems/physics-system/subsystems/collision-detection/types.js +3 -0
  55. package/build/contrib/systems/physics-system/subsystems/constraint-solver/index.d.ts +0 -1
  56. package/build/contrib/systems/physics-system/subsystems/constraint-solver/index.js +46 -59
  57. package/build/contrib/systems/physics-system/subsystems/physics/index.d.ts +1 -1
  58. package/build/contrib/systems/physics-system/subsystems/physics/index.js +10 -14
  59. package/build/contrib/systems/renderer/builders/bitmap-text-builder/index.d.ts +8 -0
  60. package/build/contrib/systems/renderer/builders/bitmap-text-builder/index.js +115 -0
  61. package/build/contrib/systems/renderer/builders/bitmap-text-builder/utils.d.ts +2 -0
  62. package/build/contrib/systems/renderer/builders/bitmap-text-builder/utils.js +7 -0
  63. package/build/contrib/systems/renderer/builders/builder.d.ts +7 -0
  64. package/build/contrib/systems/renderer/builders/index.d.ts +5 -0
  65. package/build/contrib/systems/renderer/builders/index.js +4 -0
  66. package/build/contrib/systems/renderer/builders/pixi-view-builder/index.d.ts +8 -0
  67. package/build/contrib/systems/renderer/builders/pixi-view-builder/index.js +31 -0
  68. package/build/contrib/systems/renderer/builders/shape-builder/index.d.ts +12 -0
  69. package/build/contrib/systems/renderer/builders/shape-builder/index.js +128 -0
  70. package/build/contrib/systems/renderer/builders/shape-builder/utils.d.ts +4 -0
  71. package/build/contrib/systems/renderer/builders/shape-builder/utils.js +85 -0
  72. package/build/contrib/systems/renderer/builders/sprite-builder/index.d.ts +19 -0
  73. package/build/contrib/systems/renderer/builders/sprite-builder/index.js +166 -0
  74. package/build/contrib/systems/renderer/builders/sprite-builder/utils.d.ts +4 -0
  75. package/build/contrib/systems/renderer/builders/sprite-builder/utils.js +16 -0
  76. package/build/contrib/systems/renderer/builders/utils.d.ts +1 -0
  77. package/build/contrib/systems/renderer/builders/utils.js +4 -0
  78. package/build/contrib/systems/renderer/consts.d.ts +5 -0
  79. package/build/contrib/systems/renderer/consts.js +12 -0
  80. package/build/contrib/systems/renderer/index.d.ts +2 -0
  81. package/build/contrib/systems/renderer/index.js +2 -0
  82. package/build/contrib/systems/renderer/renderer.d.ts +31 -0
  83. package/build/contrib/systems/renderer/renderer.js +249 -0
  84. package/build/contrib/systems/renderer/service/index.d.ts +20 -0
  85. package/build/contrib/systems/renderer/service/index.js +70 -0
  86. package/build/contrib/systems/{sprite-renderer → renderer}/sort/index.d.ts +1 -3
  87. package/build/contrib/systems/{sprite-renderer → renderer}/sort/index.js +2 -4
  88. package/build/contrib/systems/renderer/sort/sort-by-layer.d.ts +2 -0
  89. package/build/contrib/systems/renderer/sort/sort-by-layer.js +13 -0
  90. package/build/contrib/systems/renderer/sort/sort-by-x-axis.d.ts +2 -0
  91. package/build/contrib/systems/renderer/sort/sort-by-x-axis.js +9 -0
  92. package/build/contrib/systems/renderer/sort/sort-by-y-axis.d.ts +2 -0
  93. package/build/contrib/systems/renderer/sort/sort-by-y-axis.js +9 -0
  94. package/build/contrib/systems/renderer/sort/types.d.ts +2 -0
  95. package/build/contrib/systems/{sprite-renderer → renderer}/sort/utils.d.ts +1 -1
  96. package/build/contrib/systems/renderer/types.d.ts +26 -0
  97. package/build/contrib/systems/renderer/types.js +1 -0
  98. package/build/contrib/systems/renderer/utils.d.ts +5 -0
  99. package/build/contrib/systems/renderer/utils.js +42 -0
  100. package/build/contrib/types/input-events.d.ts +1 -1
  101. package/build/contrib/types/view.d.ts +1 -0
  102. package/build/contrib/types/view.js +1 -0
  103. package/build/engine/actor/actor-collection.d.ts +4 -1
  104. package/build/engine/actor/actor-collection.js +4 -1
  105. package/build/engine/actor/actor-creator.d.ts +3 -3
  106. package/build/engine/actor/actor-query.d.ts +29 -0
  107. package/build/engine/actor/actor-query.js +85 -0
  108. package/build/engine/actor/actor.d.ts +3 -4
  109. package/build/engine/actor/index.d.ts +2 -0
  110. package/build/engine/actor/index.js +1 -0
  111. package/build/engine/component/component.d.ts +2 -2
  112. package/build/engine/data-lib/cache-store.d.ts +2 -1
  113. package/build/engine/data-lib/cache-store.js +7 -1
  114. package/build/engine/engine.d.ts +28 -6
  115. package/build/engine/engine.js +35 -27
  116. package/build/engine/entity/entity.d.ts +1 -1
  117. package/build/engine/event-target/event-target.d.ts +1 -1
  118. package/build/engine/math-lib/vector/ops.d.ts +4 -4
  119. package/build/engine/math-lib/vector/ops.js +2 -3
  120. package/build/engine/resource-loader/loaders/image-loader.d.ts +1 -1
  121. package/build/engine/resource-loader/loaders/index.d.ts +2 -3
  122. package/build/engine/resource-loader/loaders/json-loader.d.ts +1 -1
  123. package/build/engine/resource-loader/loaders/loader.d.ts +1 -1
  124. package/build/engine/scene/scene-manager.js +7 -1
  125. package/build/engine/template/template-collection.d.ts +2 -2
  126. package/build/engine/template/template.d.ts +2 -2
  127. package/build/index.d.ts +2 -2
  128. package/build/index.js +1 -1
  129. package/build/types/global.d.ts +20 -0
  130. package/package.json +13 -10
  131. package/build/contrib/components/light/index.d.ts +0 -20
  132. package/build/contrib/components/light/index.js +0 -18
  133. package/build/contrib/components/renderable/index.d.ts +0 -44
  134. package/build/contrib/components/renderable/index.js +0 -65
  135. package/build/contrib/components/renderable/material.d.ts +0 -16
  136. package/build/contrib/components/renderable/material.js +0 -8
  137. package/build/contrib/components/sprite/material.d.ts +0 -16
  138. package/build/contrib/components/sprite/material.js +0 -8
  139. package/build/contrib/systems/sprite-renderer/index.d.ts +0 -2
  140. package/build/contrib/systems/sprite-renderer/index.js +0 -2
  141. package/build/contrib/systems/sprite-renderer/light-subsystem/index.d.ts +0 -13
  142. package/build/contrib/systems/sprite-renderer/light-subsystem/index.js +0 -62
  143. package/build/contrib/systems/sprite-renderer/light-subsystem/light-factory.d.ts +0 -4
  144. package/build/contrib/systems/sprite-renderer/light-subsystem/light-factory.js +0 -27
  145. package/build/contrib/systems/sprite-renderer/material-factory/index.d.ts +0 -4
  146. package/build/contrib/systems/sprite-renderer/material-factory/index.js +0 -32
  147. package/build/contrib/systems/sprite-renderer/renderer.d.ts +0 -36
  148. package/build/contrib/systems/sprite-renderer/renderer.js +0 -249
  149. package/build/contrib/systems/sprite-renderer/service/index.d.ts +0 -24
  150. package/build/contrib/systems/sprite-renderer/service/index.js +0 -52
  151. package/build/contrib/systems/sprite-renderer/sort/sort-by-fit.d.ts +0 -2
  152. package/build/contrib/systems/sprite-renderer/sort/sort-by-fit.js +0 -12
  153. package/build/contrib/systems/sprite-renderer/sort/sort-by-layer.d.ts +0 -2
  154. package/build/contrib/systems/sprite-renderer/sort/sort-by-layer.js +0 -14
  155. package/build/contrib/systems/sprite-renderer/sort/sort-by-x-axis.d.ts +0 -2
  156. package/build/contrib/systems/sprite-renderer/sort/sort-by-x-axis.js +0 -15
  157. package/build/contrib/systems/sprite-renderer/sort/sort-by-y-axis.d.ts +0 -2
  158. package/build/contrib/systems/sprite-renderer/sort/sort-by-y-axis.js +0 -15
  159. package/build/contrib/systems/sprite-renderer/sort/sort-by-z-axis.d.ts +0 -2
  160. package/build/contrib/systems/sprite-renderer/sort/sort-by-z-axis.js +0 -6
  161. package/build/contrib/systems/sprite-renderer/sort/types.d.ts +0 -2
  162. package/build/contrib/systems/sprite-renderer/sprite-cropper.d.ts +0 -8
  163. package/build/contrib/systems/sprite-renderer/sprite-cropper.js +0 -30
  164. package/build/contrib/systems/sprite-renderer/types.d.ts +0 -7
  165. package/build/contrib/systems/sprite-renderer/utils.d.ts +0 -9
  166. package/build/contrib/systems/sprite-renderer/utils.js +0 -47
  167. /package/build/contrib/systems/{sprite-renderer/sort/types.js → renderer/builders/builder.js} +0 -0
  168. /package/build/contrib/systems/{sprite-renderer → renderer/sort}/types.js +0 -0
  169. /package/build/contrib/systems/{sprite-renderer → renderer}/sort/utils.js +0 -0
@@ -1,4 +1,3 @@
1
+ import type { Constructor } from '../../../../types/utils';
1
2
  import type { Picker } from './picker';
2
- export declare const substatePickers: Record<string, {
3
- new (): Picker;
4
- }>;
3
+ export declare const substatePickers: Record<string, Constructor<Picker>>;
@@ -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: Array<Substate>, props: OneDimensionalProps): Substate;
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: Array<Substate>, props: OneDimensionalProps | TwoDimensionalProps): Substate;
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: Array<Substate>, props: TwoDimensionalProps): Substate;
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: Array<string> | string) => unknown;
3
- export declare const setValue: (actor: Actor, path: Array<string>, value: unknown) => void;
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 actorCollection?;
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, ActorCollection } from '../../../engine/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, } from '../../../events';
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
- actorCollection;
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, { once: true });
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.actorCollection = new ActorCollection(scene, {
65
- components: [AudioSource],
66
+ this.actorQuery = new ActorQuery({
67
+ scene,
68
+ filter: [AudioSource],
66
69
  });
67
- this.actorCollection.forEach((actor) => this.initAudio(actor));
68
- this.actorCollection.addEventListener(AddActor, this.handleActorAdd);
69
- this.actorCollection.addEventListener(RemoveActor, this.handleActorRemove);
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.actorCollection?.removeEventListener(AddActor, this.handleActorAdd);
76
- this.actorCollection?.removeEventListener(RemoveActor, this.handleActorRemove);
77
- this.actorCollection = undefined;
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, } = audioSource;
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) > VOLUME_TOLERANCE) {
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.actorCollection?.forEach((actor) => {
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 type AudioStateNode = {
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 type AudioGroup = {
9
+ }
10
+ export interface AudioGroup {
11
11
  id: string;
12
12
  name: string;
13
13
  volume: number;
14
- };
15
- export type AudioGroups = {
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.map((config) => {
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 actorCollection?;
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 { ActorCollection } from '../../../engine/actor';
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
- actorCollection;
7
+ actorQuery;
8
8
  window;
9
9
  cameraService;
10
10
  constructor(options) {
11
11
  super();
12
- const { windowNodeId, world, } = options;
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.actorCollection = new ActorCollection(scene, {
24
- components: [Camera],
23
+ this.actorQuery = new ActorQuery({
24
+ scene,
25
+ filter: [Camera],
25
26
  });
26
27
  this.handleWindowResize();
27
28
  }
28
29
  onSceneExit() {
29
- this.actorCollection = undefined;
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.actorCollection?.forEach((cameraActor) => {
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
- return this.actorCollection?.find((actor) => {
57
+ if (!this.actorQuery) {
58
+ return;
59
+ }
60
+ for (const actor of this.actorQuery.getActors()) {
57
61
  const camera = actor.getComponent(Camera);
58
- return camera.current;
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 actorCollection?;
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 { ActorCollection } from '../../../engine/actor';
3
+ import { ActorQuery } from '../../../engine/actor';
4
4
  const MS_IN_SEC = 1000;
5
5
  export class GameStatsMeter extends WorldSystem {
6
6
  world;
7
- actorCollection;
7
+ actorQuery;
8
8
  frequency;
9
9
  fps;
10
10
  time;
11
11
  constructor(options) {
12
12
  super();
13
- const { world, frequency, } = options;
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.actorCollection = new ActorCollection(scene);
20
+ this.actorQuery = new ActorQuery({ scene, filter: [] });
21
21
  }
22
22
  onSceneExit() {
23
- this.actorCollection = undefined;
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.actorCollection?.size ?? 0,
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, } from './ui-bridge';
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 actorCollection?;
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 { ActorCollection } from '../../../engine/actor';
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
- actorCollection;
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.actorCollection = new ActorCollection(scene, {
19
- components: [KeyboardControl],
20
- });
18
+ this.actorQuery = new ActorQuery({ scene, filter: [KeyboardControl] });
21
19
  }
22
20
  onSceneExit() {
23
- this.actorCollection = undefined;
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.actorCollection?.forEach((actor) => {
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) => {
@@ -7,6 +7,6 @@ export declare class InputListener {
7
7
  handleKeyUp: (event: Event) => void;
8
8
  startListen(): void;
9
9
  stopListen(): void;
10
- getEvents(): Array<CustomKeyboardEvent>;
10
+ getEvents(): CustomKeyboardEvent[];
11
11
  clear(): void;
12
12
  }
@@ -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 actorCollection?;
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 { ActorCollection } from '../../../engine/actor';
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
- actorCollection;
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.actorCollection = new ActorCollection(scene, {
15
- components: [MouseControl],
16
- });
14
+ this.actorQuery = new ActorQuery({ scene, filter: [MouseControl] });
17
15
  }
18
16
  onSceneExit() {
19
- this.actorCollection = undefined;
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.actorCollection?.forEach((actor) => {
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) {
@@ -6,6 +6,6 @@ export declare class MouseInputListener {
6
6
  handleMouseEvent: (event: Event) => void;
7
7
  startListen(): void;
8
8
  stopListen(): void;
9
- getFiredEvents(): Array<CustomMouseEvent>;
9
+ getFiredEvents(): CustomMouseEvent[];
10
10
  clearFiredEvents(): void;
11
11
  }
@@ -1,6 +1,6 @@
1
1
  import type { SceneSystemOptions } from '../../../../../engine/system';
2
2
  export declare class CollisionDetectionSubsystem {
3
- private actorCollection;
3
+ private actorQuery;
4
4
  private scene;
5
5
  private axis;
6
6
  private entriesMap;
@@ -1,5 +1,5 @@
1
- import { ActorCollection } from '../../../../../engine/actor';
2
- import { Transform, Collider, RigidBody, } from '../../../../components';
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
- actorCollection;
12
+ actorQuery;
13
13
  scene;
14
14
  axis;
15
15
  entriesMap;
16
16
  collisionPairs;
17
17
  entriesToDelete;
18
18
  constructor(options) {
19
- this.actorCollection = new ActorCollection(options.scene, {
20
- components: [
21
- Collider,
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.actorCollection.forEach((actor) => this.addCollisionEntry(actor));
40
- this.actorCollection.addEventListener(AddActor, this.handleActorAdd);
41
- this.actorCollection.addEventListener(RemoveActor, this.handleActorRemove);
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.actorCollection.removeEventListener(AddActor, this.handleActorAdd);
45
- this.actorCollection.removeEventListener(RemoveActor, this.handleActorRemove);
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) || checkCollider(collider, colliderOld);
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.actorCollection.forEach((actor) => {
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 type BoxGeometry = {
19
+ export interface BoxGeometry {
20
20
  center: Point;
21
- points: Array<Point>;
22
- edges: Array<EdgeWithNormal>;
23
- };
24
- export type CircleGeometry = {
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: Array<SortedItem>;
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 type Intersection = {
67
+ export interface Intersection {
68
68
  mtv1: Vector2;
69
69
  mtv2: Vector2;
70
- };
70
+ }
@@ -1,6 +1,5 @@
1
1
  import type { SceneSystemOptions } from '../../../../../engine/system';
2
2
  export declare class ConstraintSolver {
3
- private actorCollection;
4
3
  private scene;
5
4
  private processedPairs;
6
5
  private mtvMap;