@jolly-pixel/engine 1.0.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/README.md +209 -0
- package/dist/actor/Actor.d.ts +39 -0
- package/dist/actor/Actor.d.ts.map +1 -0
- package/dist/actor/Actor.js +171 -0
- package/dist/actor/Actor.js.map +1 -0
- package/dist/actor/ActorComponent.d.ts +19 -0
- package/dist/actor/ActorComponent.d.ts.map +1 -0
- package/dist/actor/ActorComponent.js +30 -0
- package/dist/actor/ActorComponent.js.map +1 -0
- package/dist/actor/ActorTree.d.ts +31 -0
- package/dist/actor/ActorTree.d.ts.map +1 -0
- package/dist/actor/ActorTree.js +167 -0
- package/dist/actor/ActorTree.js.map +1 -0
- package/dist/actor/Signal.d.ts +14 -0
- package/dist/actor/Signal.d.ts.map +1 -0
- package/dist/actor/Signal.js +38 -0
- package/dist/actor/Signal.js.map +1 -0
- package/dist/actor/Transform.d.ts +37 -0
- package/dist/actor/Transform.d.ts.map +1 -0
- package/dist/actor/Transform.js +148 -0
- package/dist/actor/Transform.js.map +1 -0
- package/dist/actor/index.d.ts +5 -0
- package/dist/actor/index.d.ts.map +1 -0
- package/dist/actor/index.js +5 -0
- package/dist/actor/index.js.map +1 -0
- package/dist/adapters/canvas.d.ts +7 -0
- package/dist/adapters/canvas.d.ts.map +1 -0
- package/dist/adapters/canvas.js +2 -0
- package/dist/adapters/canvas.js.map +1 -0
- package/dist/adapters/console.d.ts +6 -0
- package/dist/adapters/console.d.ts.map +1 -0
- package/dist/adapters/console.js +2 -0
- package/dist/adapters/console.js.map +1 -0
- package/dist/adapters/document.d.ts +14 -0
- package/dist/adapters/document.d.ts.map +1 -0
- package/dist/adapters/document.js +19 -0
- package/dist/adapters/document.js.map +1 -0
- package/dist/adapters/eventTarget.d.ts +6 -0
- package/dist/adapters/eventTarget.d.ts.map +1 -0
- package/dist/adapters/eventTarget.js +2 -0
- package/dist/adapters/eventTarget.js.map +1 -0
- package/dist/adapters/global.d.ts +8 -0
- package/dist/adapters/global.d.ts.map +1 -0
- package/dist/adapters/global.js +8 -0
- package/dist/adapters/global.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/navigator.d.ts +9 -0
- package/dist/adapters/navigator.d.ts.map +1 -0
- package/dist/adapters/navigator.js +9 -0
- package/dist/adapters/navigator.js.map +1 -0
- package/dist/adapters/window.d.ts +12 -0
- package/dist/adapters/window.d.ts.map +1 -0
- package/dist/adapters/window.js +11 -0
- package/dist/adapters/window.js.map +1 -0
- package/dist/audio/AudioBackground.d.ts +48 -0
- package/dist/audio/AudioBackground.d.ts.map +1 -0
- package/dist/audio/AudioBackground.js +151 -0
- package/dist/audio/AudioBackground.js.map +1 -0
- package/dist/audio/AudioLibrary.d.ts +6 -0
- package/dist/audio/AudioLibrary.d.ts.map +1 -0
- package/dist/audio/AudioLibrary.js +6 -0
- package/dist/audio/AudioLibrary.js.map +1 -0
- package/dist/audio/AudioManager.d.ts +33 -0
- package/dist/audio/AudioManager.d.ts.map +1 -0
- package/dist/audio/AudioManager.js +47 -0
- package/dist/audio/AudioManager.js.map +1 -0
- package/dist/audio/GlobalAudio.d.ts +20 -0
- package/dist/audio/GlobalAudio.d.ts.map +1 -0
- package/dist/audio/GlobalAudio.js +41 -0
- package/dist/audio/GlobalAudio.js.map +1 -0
- package/dist/audio/internals/AudioBuffer.d.ts +23 -0
- package/dist/audio/internals/AudioBuffer.d.ts.map +1 -0
- package/dist/audio/internals/AudioBuffer.js +28 -0
- package/dist/audio/internals/AudioBuffer.js.map +1 -0
- package/dist/audio/internals/AudioListener.d.ts +5 -0
- package/dist/audio/internals/AudioListener.d.ts.map +1 -0
- package/dist/audio/internals/AudioListener.js +2 -0
- package/dist/audio/internals/AudioListener.js.map +1 -0
- package/dist/audio/internals/AudioService.d.ts +19 -0
- package/dist/audio/internals/AudioService.d.ts.map +1 -0
- package/dist/audio/internals/AudioService.js +36 -0
- package/dist/audio/internals/AudioService.js.map +1 -0
- package/dist/components/camera/Camera3DControls.d.ts +31 -0
- package/dist/components/camera/Camera3DControls.d.ts.map +1 -0
- package/dist/components/camera/Camera3DControls.js +79 -0
- package/dist/components/camera/Camera3DControls.js.map +1 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +5 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/renderers/index.d.ts +14 -0
- package/dist/components/renderers/index.d.ts.map +1 -0
- package/dist/components/renderers/index.js +14 -0
- package/dist/components/renderers/index.js.map +1 -0
- package/dist/components/renderers/model/ModelAnimation.d.ts +21 -0
- package/dist/components/renderers/model/ModelAnimation.d.ts.map +1 -0
- package/dist/components/renderers/model/ModelAnimation.js +84 -0
- package/dist/components/renderers/model/ModelAnimation.js.map +1 -0
- package/dist/components/renderers/model/ModelRenderer.d.ts +24 -0
- package/dist/components/renderers/model/ModelRenderer.d.ts.map +1 -0
- package/dist/components/renderers/model/ModelRenderer.js +49 -0
- package/dist/components/renderers/model/ModelRenderer.js.map +1 -0
- package/dist/components/renderers/model/loader.d.ts +8 -0
- package/dist/components/renderers/model/loader.d.ts.map +1 -0
- package/dist/components/renderers/model/loader.js +112 -0
- package/dist/components/renderers/model/loader.js.map +1 -0
- package/dist/components/renderers/sprite/SpriteAnimation.class.d.ts +33 -0
- package/dist/components/renderers/sprite/SpriteAnimation.class.d.ts.map +1 -0
- package/dist/components/renderers/sprite/SpriteAnimation.class.js +78 -0
- package/dist/components/renderers/sprite/SpriteAnimation.class.js.map +1 -0
- package/dist/components/renderers/sprite/SpriteRenderer.class.d.ts +35 -0
- package/dist/components/renderers/sprite/SpriteRenderer.class.d.ts.map +1 -0
- package/dist/components/renderers/sprite/SpriteRenderer.class.js +76 -0
- package/dist/components/renderers/sprite/SpriteRenderer.class.js.map +1 -0
- package/dist/components/renderers/text/Text3D.class.d.ts +26 -0
- package/dist/components/renderers/text/Text3D.class.d.ts.map +1 -0
- package/dist/components/renderers/text/Text3D.class.js +104 -0
- package/dist/components/renderers/text/Text3D.class.js.map +1 -0
- package/dist/components/renderers/text/TextRenderer.class.d.ts +15 -0
- package/dist/components/renderers/text/TextRenderer.class.d.ts.map +1 -0
- package/dist/components/renderers/text/TextRenderer.class.js +47 -0
- package/dist/components/renderers/text/TextRenderer.class.js.map +1 -0
- package/dist/components/renderers/text/loader.d.ts +4 -0
- package/dist/components/renderers/text/loader.d.ts.map +1 -0
- package/dist/components/renderers/text/loader.js +14 -0
- package/dist/components/renderers/text/loader.js.map +1 -0
- package/dist/components/renderers/tiled/TileLayer.d.ts +13 -0
- package/dist/components/renderers/tiled/TileLayer.d.ts.map +1 -0
- package/dist/components/renderers/tiled/TileLayer.js +34 -0
- package/dist/components/renderers/tiled/TileLayer.js.map +1 -0
- package/dist/components/renderers/tiled/TileMapRenderer.d.ts +15 -0
- package/dist/components/renderers/tiled/TileMapRenderer.d.ts.map +1 -0
- package/dist/components/renderers/tiled/TileMapRenderer.js +59 -0
- package/dist/components/renderers/tiled/TileMapRenderer.js.map +1 -0
- package/dist/components/renderers/tiled/TileObject.d.ts +18 -0
- package/dist/components/renderers/tiled/TileObject.d.ts.map +1 -0
- package/dist/components/renderers/tiled/TileObject.js +59 -0
- package/dist/components/renderers/tiled/TileObject.js.map +1 -0
- package/dist/components/renderers/tiled/TileSet.d.ts +27 -0
- package/dist/components/renderers/tiled/TileSet.d.ts.map +1 -0
- package/dist/components/renderers/tiled/TileSet.js +116 -0
- package/dist/components/renderers/tiled/TileSet.js.map +1 -0
- package/dist/components/renderers/tiled/loader.d.ts +13 -0
- package/dist/components/renderers/tiled/loader.d.ts.map +1 -0
- package/dist/components/renderers/tiled/loader.js +39 -0
- package/dist/components/renderers/tiled/loader.js.map +1 -0
- package/dist/components/renderers/tiled/types.d.ts +325 -0
- package/dist/components/renderers/tiled/types.d.ts.map +1 -0
- package/dist/components/renderers/tiled/types.js +18 -0
- package/dist/components/renderers/tiled/types.js.map +1 -0
- package/dist/components/script/Behavior.d.ts +16 -0
- package/dist/components/script/Behavior.d.ts.map +1 -0
- package/dist/components/script/Behavior.js +52 -0
- package/dist/components/script/Behavior.js.map +1 -0
- package/dist/components/script/BehaviorDecorators.d.ts +29 -0
- package/dist/components/script/BehaviorDecorators.d.ts.map +1 -0
- package/dist/components/script/BehaviorDecorators.js +47 -0
- package/dist/components/script/BehaviorDecorators.js.map +1 -0
- package/dist/components/script/BehaviorInitializer.d.ts +15 -0
- package/dist/components/script/BehaviorInitializer.d.ts.map +1 -0
- package/dist/components/script/BehaviorInitializer.js +103 -0
- package/dist/components/script/BehaviorInitializer.js.map +1 -0
- package/dist/components/types.d.ts +12 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/components/types.js +3 -0
- package/dist/components/types.js.map +1 -0
- package/dist/controls/AtomicInput.d.ts +17 -0
- package/dist/controls/AtomicInput.d.ts.map +1 -0
- package/dist/controls/AtomicInput.js +69 -0
- package/dist/controls/AtomicInput.js.map +1 -0
- package/dist/controls/CombinedInput.d.ts +54 -0
- package/dist/controls/CombinedInput.d.ts.map +1 -0
- package/dist/controls/CombinedInput.js +119 -0
- package/dist/controls/CombinedInput.js.map +1 -0
- package/dist/controls/Input.class.d.ts +93 -0
- package/dist/controls/Input.class.d.ts.map +1 -0
- package/dist/controls/Input.class.js +334 -0
- package/dist/controls/Input.class.js.map +1 -0
- package/dist/controls/devices/Gamepad.class.d.ts +98 -0
- package/dist/controls/devices/Gamepad.class.d.ts.map +1 -0
- package/dist/controls/devices/Gamepad.class.js +275 -0
- package/dist/controls/devices/Gamepad.class.js.map +1 -0
- package/dist/controls/devices/Mouse.class.d.ts +80 -0
- package/dist/controls/devices/Mouse.class.d.ts.map +1 -0
- package/dist/controls/devices/Mouse.class.js +260 -0
- package/dist/controls/devices/Mouse.class.js.map +1 -0
- package/dist/controls/devices/Screen.d.ts +27 -0
- package/dist/controls/devices/Screen.d.ts.map +1 -0
- package/dist/controls/devices/Screen.js +61 -0
- package/dist/controls/devices/Screen.js.map +1 -0
- package/dist/controls/devices/Touchpad.class.d.ts +61 -0
- package/dist/controls/devices/Touchpad.class.d.ts.map +1 -0
- package/dist/controls/devices/Touchpad.class.js +149 -0
- package/dist/controls/devices/Touchpad.class.js.map +1 -0
- package/dist/controls/devices/index.d.ts +6 -0
- package/dist/controls/devices/index.d.ts.map +1 -0
- package/dist/controls/devices/index.js +6 -0
- package/dist/controls/devices/index.js.map +1 -0
- package/dist/controls/devices/keyboard/Keyboard.class.d.ts +37 -0
- package/dist/controls/devices/keyboard/Keyboard.class.d.ts.map +1 -0
- package/dist/controls/devices/keyboard/Keyboard.class.js +135 -0
- package/dist/controls/devices/keyboard/Keyboard.class.js.map +1 -0
- package/dist/controls/devices/keyboard/code.d.ts +9 -0
- package/dist/controls/devices/keyboard/code.d.ts.map +1 -0
- package/dist/controls/devices/keyboard/code.js +13 -0
- package/dist/controls/devices/keyboard/code.js.map +1 -0
- package/dist/controls/devices/keyboard/transformers/alphabet.d.ts +31 -0
- package/dist/controls/devices/keyboard/transformers/alphabet.d.ts.map +1 -0
- package/dist/controls/devices/keyboard/transformers/alphabet.js +34 -0
- package/dist/controls/devices/keyboard/transformers/alphabet.js.map +1 -0
- package/dist/controls/devices/keyboard/transformers/numeric.d.ts +15 -0
- package/dist/controls/devices/keyboard/transformers/numeric.d.ts.map +1 -0
- package/dist/controls/devices/keyboard/transformers/numeric.js +18 -0
- package/dist/controls/devices/keyboard/transformers/numeric.js.map +1 -0
- package/dist/controls/types.d.ts +23 -0
- package/dist/controls/types.d.ts.map +1 -0
- package/dist/controls/types.js +2 -0
- package/dist/controls/types.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/systems/FixedTimeStep.d.ts +16 -0
- package/dist/systems/FixedTimeStep.d.ts.map +1 -0
- package/dist/systems/FixedTimeStep.js +41 -0
- package/dist/systems/FixedTimeStep.js.map +1 -0
- package/dist/systems/GameInstance.d.ts +30 -0
- package/dist/systems/GameInstance.d.ts.map +1 -0
- package/dist/systems/GameInstance.js +54 -0
- package/dist/systems/GameInstance.js.map +1 -0
- package/dist/systems/Scene.d.ts +30 -0
- package/dist/systems/Scene.d.ts.map +1 -0
- package/dist/systems/Scene.js +91 -0
- package/dist/systems/Scene.js.map +1 -0
- package/dist/systems/asset/Base.d.ts +18 -0
- package/dist/systems/asset/Base.d.ts.map +1 -0
- package/dist/systems/asset/Base.js +36 -0
- package/dist/systems/asset/Base.js.map +1 -0
- package/dist/systems/asset/Manager.d.ts +21 -0
- package/dist/systems/asset/Manager.d.ts.map +1 -0
- package/dist/systems/asset/Manager.js +68 -0
- package/dist/systems/asset/Manager.js.map +1 -0
- package/dist/systems/asset/Queue.d.ts +8 -0
- package/dist/systems/asset/Queue.d.ts.map +1 -0
- package/dist/systems/asset/Queue.js +17 -0
- package/dist/systems/asset/Queue.js.map +1 -0
- package/dist/systems/asset/Registry.d.ts +17 -0
- package/dist/systems/asset/Registry.d.ts.map +1 -0
- package/dist/systems/asset/Registry.js +23 -0
- package/dist/systems/asset/Registry.js.map +1 -0
- package/dist/systems/index.d.ts +9 -0
- package/dist/systems/index.d.ts.map +1 -0
- package/dist/systems/index.js +8 -0
- package/dist/systems/index.js.map +1 -0
- package/dist/systems/rendering/GameRenderer.d.ts +18 -0
- package/dist/systems/rendering/GameRenderer.d.ts.map +1 -0
- package/dist/systems/rendering/GameRenderer.js +3 -0
- package/dist/systems/rendering/GameRenderer.js.map +1 -0
- package/dist/systems/rendering/RenderStrategy.d.ts +24 -0
- package/dist/systems/rendering/RenderStrategy.d.ts.map +1 -0
- package/dist/systems/rendering/RenderStrategy.js +38 -0
- package/dist/systems/rendering/RenderStrategy.js.map +1 -0
- package/dist/systems/rendering/ThreeRenderer.d.ts +48 -0
- package/dist/systems/rendering/ThreeRenderer.d.ts.map +1 -0
- package/dist/systems/rendering/ThreeRenderer.js +149 -0
- package/dist/systems/rendering/ThreeRenderer.js.map +1 -0
- package/dist/systems/rendering/index.d.ts +4 -0
- package/dist/systems/rendering/index.d.ts.map +1 -0
- package/dist/systems/rendering/index.js +3 -0
- package/dist/systems/rendering/index.js.map +1 -0
- package/dist/utils/createViewHelper.d.ts +5 -0
- package/dist/utils/createViewHelper.d.ts.map +1 -0
- package/dist/utils/createViewHelper.js +11 -0
- package/dist/utils/createViewHelper.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/loadJSON.d.ts +2 -0
- package/dist/utils/loadJSON.d.ts.map +1 -0
- package/dist/utils/loadJSON.js +15 -0
- package/dist/utils/loadJSON.js.map +1 -0
- package/dist/utils/path.d.ts +9 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +18 -0
- package/dist/utils/path.js.map +1 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
<p align="center"><h1 align="center">
|
|
2
|
+
engine
|
|
3
|
+
</h1>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
JollyPixel Three.js engine
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
## 📌 About
|
|
10
|
+
|
|
11
|
+
Minimal and opinionated [ECS](https://en.wikipedia.org/wiki/Entity_component_system) built on top of Three.js.
|
|
12
|
+
|
|
13
|
+
> [!NOTE]
|
|
14
|
+
> JollyPixel is heavily inspired by [Superpowers](https://github.com/superpowers) for the naming (such as Actor instead of Entity).
|
|
15
|
+
|
|
16
|
+
## 💡 Features
|
|
17
|
+
|
|
18
|
+
- Actor/Component architecture with scene tree
|
|
19
|
+
- Godot-like [Signals](https://docs.godotengine.org/en/stable/getting_started/step_by_step/signals.html) for Actors and Components
|
|
20
|
+
- Behavior scripts
|
|
21
|
+
- Input controls (mouse, keyboard, gamepads, touchpad)
|
|
22
|
+
- Built-in renderers (3D models, 3D text, sprites, …)
|
|
23
|
+
- Asset management
|
|
24
|
+
- Audio (background music, sound library, spatial audio)
|
|
25
|
+
|
|
26
|
+
## 💃 Getting Started
|
|
27
|
+
|
|
28
|
+
This package is available in the Node Package Repository and can be easily installed with [npm](https://docs.npmjs.com/getting-started/what-is-npm) or [yarn](https://yarnpkg.com).
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
$ npm i @jolly-pixel/engine
|
|
32
|
+
# or
|
|
33
|
+
$ yarn add @jolly-pixel/engine
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 📚 API
|
|
37
|
+
|
|
38
|
+
### ⚙️ Systems
|
|
39
|
+
|
|
40
|
+
Systems are responsible for driving the game loop, orchestrating rendering, and managing shared
|
|
41
|
+
resources such as assets. They operate on actors and their components
|
|
42
|
+
each frame.
|
|
43
|
+
|
|
44
|
+
- [GameInstance](./docs/systems/game-instance.md) — top-level orchestrator that ties the renderer, scene,
|
|
45
|
+
input, and audio into a unified game loop.
|
|
46
|
+
- [GameRenderer](./docs/systems/game-renderer.md) — abstracts the Three.js render pipeline and supports
|
|
47
|
+
direct and post-processing render strategies.
|
|
48
|
+
- [Scene](./docs/systems/scene.md) — the ECS world manager that owns the actor tree and drives
|
|
49
|
+
per-frame lifecycle (awake → start → update → destroy).
|
|
50
|
+
- [Asset](./docs/asset.md) — lazy-loading asset pipeline with a
|
|
51
|
+
registry of loaders, a queue, and a cache.
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { Systems, Actor } from "@jolly-pixel/engine";
|
|
55
|
+
|
|
56
|
+
const scene = new Systems.SceneEngine();
|
|
57
|
+
const renderer = new Systems.ThreeRenderer(canvas, {
|
|
58
|
+
scene,
|
|
59
|
+
renderMode: "direct"
|
|
60
|
+
});
|
|
61
|
+
const game = new Systems.GameInstance(renderer, {
|
|
62
|
+
enableOnExit: true,
|
|
63
|
+
scene
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
game.connect();
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
> [!TIP]
|
|
70
|
+
> [@jolly-pixel/runtime](../runtime/README.md) manage most of that for you
|
|
71
|
+
|
|
72
|
+
### 🎭 Actor
|
|
73
|
+
|
|
74
|
+
An Actor is a named node in the scene tree that holds a Transform, a list of Components, and a
|
|
75
|
+
dictionary of Behaviors. The engine uses the name *Actor* (inspired by
|
|
76
|
+
[Superpowers](https://github.com/superpowers)) instead of the
|
|
77
|
+
traditional *Entity* term.
|
|
78
|
+
|
|
79
|
+
- [ActorTree](./docs/actor/actor-tree.md) — tree structure that
|
|
80
|
+
manages parent-child actor relationships and provides pattern-based
|
|
81
|
+
lookups.
|
|
82
|
+
- [Actor](./docs/actor/actor.md) — the entity itself, holding its
|
|
83
|
+
transform, components, and behaviors.
|
|
84
|
+
- [Transform](./docs/actor/actor-transform.md) — built-in component
|
|
85
|
+
wrapping a Three.js Object3D and exposing a complete local/global
|
|
86
|
+
transform API (position, orientation, scale, movement).
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
const player = new Actor(gameInstance, { name: "player" });
|
|
90
|
+
player.transform.setLocalPosition(0, 1, 0);
|
|
91
|
+
|
|
92
|
+
const child = new Actor(gameInstance, {
|
|
93
|
+
name: "weapon",
|
|
94
|
+
parent: player
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 🧩 Components
|
|
99
|
+
|
|
100
|
+
Components are pure data and logic units attached to an Actor. They come in three flavours:
|
|
101
|
+
|
|
102
|
+
- [ActorComponent](./docs/actor/actor-component.md) — the base class all components extend (behaviors and renderers are ActorComponent).
|
|
103
|
+
- [Renderers](./docs/components/renderers.md) — visual components (sprites, models, text, tiled maps) that know how to draw themselves.
|
|
104
|
+
- [Camera Controls](./docs/components/camera-3d-controls.md)
|
|
105
|
+
- [Behavior](./docs/components/behavior.md) — script components with a property system and decorator-driven initialization.
|
|
106
|
+
- [Signals](./docs/components/signal.md) — lightweight pub/sub event emitter for actor-level communication (Godot-inspired signals).
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
import {
|
|
110
|
+
Behavior, ModelRenderer, Input,
|
|
111
|
+
Signal, SceneProperty, type SignalEvent
|
|
112
|
+
} from "@jolly-pixel/engine";
|
|
113
|
+
|
|
114
|
+
class PlayerBehavior extends Behavior {
|
|
115
|
+
@Signal()
|
|
116
|
+
onHit: SignalEvent;
|
|
117
|
+
|
|
118
|
+
@SceneProperty({ type: "number" })
|
|
119
|
+
speed = 0.05;
|
|
120
|
+
|
|
121
|
+
@Input.listen("keyboard.down")
|
|
122
|
+
onKeyDown() {
|
|
123
|
+
console.log("key pressed");
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
update() {
|
|
127
|
+
if (this.actor.gameInstance.input.isKeyDown("ArrowUp")) {
|
|
128
|
+
this.actor.transform.moveForward(this.speed);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
new Actor(gameInstance, { name: "player" })
|
|
134
|
+
.registerComponent(ModelRenderer, { path: "models/Player.glb" })
|
|
135
|
+
.registerComponent(PlayerBehavior);
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 🎮 Device Controls
|
|
139
|
+
|
|
140
|
+
Aggregates all physical devices (mouse, keyboard, gamepads, touchpad, screen) behind a unified
|
|
141
|
+
query API so that behaviors can react to player actions without
|
|
142
|
+
coupling to a specific device.
|
|
143
|
+
|
|
144
|
+
- [Input](./docs/controls/input.md) — central input manager
|
|
145
|
+
- [Mouse](./docs/controls/mouse.md)
|
|
146
|
+
- [Keyboard](./docs/controls/keyboard.md)
|
|
147
|
+
- [Gamepad](./docs/controls/gamepad.md)
|
|
148
|
+
- [Touchpad](./docs/controls/touchpad.md)
|
|
149
|
+
- [Screen](./docs/controls/screen.md)
|
|
150
|
+
- [CombinedInput](./docs/controls/combinedinput.md) — composable input conditions (AND, OR, NOT, sequence)
|
|
151
|
+
for complex key bindings.
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
import { InputCombination } from "@jolly-pixel/engine";
|
|
155
|
+
|
|
156
|
+
const { input } = gameInstance;
|
|
157
|
+
|
|
158
|
+
if (input.isKeyDown("Space")) {
|
|
159
|
+
console.log("jump!");
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const dashCombo = InputCombination.all(
|
|
163
|
+
InputCombination.key("ShiftLeft"),
|
|
164
|
+
InputCombination.key("ArrowRight")
|
|
165
|
+
);
|
|
166
|
+
if (dashCombo.evaluate(input)) {
|
|
167
|
+
console.log("dash!");
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 🔊 Audio
|
|
172
|
+
|
|
173
|
+
Manages sound playback across the engine. It provides a global volume controller, a factory for creating audio sources, and a playlist-based background music manager.
|
|
174
|
+
|
|
175
|
+
- [Audio](./docs/audio/audio.md) — global audio controller owning the
|
|
176
|
+
AudioContext and master volume.
|
|
177
|
+
- [AudioBackground](./docs/audio/audio-background.md) —
|
|
178
|
+
playlist-based background music with sequential track playback,
|
|
179
|
+
pause/resume/stop, and playlist chaining.
|
|
180
|
+
|
|
181
|
+
```ts
|
|
182
|
+
import { GlobalAudioManager, AudioBackground } from "@jolly-pixel/engine";
|
|
183
|
+
|
|
184
|
+
const audioManager = GlobalAudioManager.fromGameInstance(gameInstance);
|
|
185
|
+
const bg = new AudioBackground({
|
|
186
|
+
audioManager,
|
|
187
|
+
autoPlay: true,
|
|
188
|
+
playlists: [{
|
|
189
|
+
name: "main",
|
|
190
|
+
onEnd: "loop",
|
|
191
|
+
tracks: [
|
|
192
|
+
{ name: "theme", path: "audio/theme.mp3" }
|
|
193
|
+
]
|
|
194
|
+
}]
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
gameInstance.audio.observe(bg);
|
|
198
|
+
gameInstance.audio.volume = 0.5;
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 🔨 Internals
|
|
202
|
+
|
|
203
|
+
- [Adapters](./docs/internals/adapters.md)
|
|
204
|
+
- [Audio](./docs/internals/audio.md)
|
|
205
|
+
- [FixedTimeStep](./docs/internals/fixed-time-step.md)
|
|
206
|
+
|
|
207
|
+
## License
|
|
208
|
+
|
|
209
|
+
MIT
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
import { type GameInstance } from "../systems/GameInstance.ts";
|
|
3
|
+
import { ActorTree } from "./ActorTree.ts";
|
|
4
|
+
import { Transform } from "./Transform.ts";
|
|
5
|
+
import type { Behavior } from "../components/script/Behavior.ts";
|
|
6
|
+
import type { Component } from "../components/types.ts";
|
|
7
|
+
type ComponentConstructor = new (actor: Actor, ...args: any[]) => Component;
|
|
8
|
+
type RequiresOptions<T extends ComponentConstructor> = T extends new (actor: Actor, options: infer O, ...args: any[]) => any ? undefined extends O ? false : true : false;
|
|
9
|
+
export interface ActorOptions {
|
|
10
|
+
name: string;
|
|
11
|
+
parent?: Actor | null;
|
|
12
|
+
visible?: boolean;
|
|
13
|
+
layer?: number | number[];
|
|
14
|
+
}
|
|
15
|
+
export declare class Actor extends ActorTree {
|
|
16
|
+
gameInstance: GameInstance;
|
|
17
|
+
name: string;
|
|
18
|
+
awoken: boolean;
|
|
19
|
+
parent: Actor | null;
|
|
20
|
+
components: Component[];
|
|
21
|
+
behaviors: Record<string, Behavior<any>[]>;
|
|
22
|
+
transform: Transform;
|
|
23
|
+
pendingForDestruction: boolean;
|
|
24
|
+
threeObject: THREE.Group<THREE.Object3DEventMap>;
|
|
25
|
+
constructor(gameInstance: GameInstance, options: ActorOptions);
|
|
26
|
+
registerComponent<T extends ComponentConstructor>(componentClass: T, ...args: RequiresOptions<T> extends true ? [options: ConstructorParameters<T>[1], callback?: (component: InstanceType<T>) => void] : [options?: ConstructorParameters<T>[1], callback?: (component: InstanceType<T>) => void]): this;
|
|
27
|
+
registerComponentAndGet<T extends ComponentConstructor>(componentClass: T, ...args: RequiresOptions<T> extends true ? [options: ConstructorParameters<T>[1]] : [options?: ConstructorParameters<T>[1]]): InstanceType<T>;
|
|
28
|
+
awake(): void;
|
|
29
|
+
update(deltaTime: number): void;
|
|
30
|
+
isDestroyed(): boolean;
|
|
31
|
+
destroy(): void;
|
|
32
|
+
markDestructionPending(): void;
|
|
33
|
+
addBehavior<T extends new (...args: any) => Behavior>(behaviorClass: T, properties?: ConstructorParameters<T>[0]): Behavior<Record<string, import("../components/script/Behavior.ts").BehaviorPropertiesValue>>;
|
|
34
|
+
getBehavior<T extends new (...args: any) => any>(behaviorClass: T): InstanceType<T> | null;
|
|
35
|
+
getBehaviors<T extends new (...args: any) => any>(behaviorClass: T): IterableIterator<InstanceType<T>>;
|
|
36
|
+
setParent(newParent: Actor, keepLocal?: boolean): void;
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=Actor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Actor.d.ts","sourceRoot":"","sources":["../../src/actor/Actor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// Import Third-party Dependencies
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
// Import Internal Dependencies
|
|
4
|
+
import {} from "../systems/GameInstance.js";
|
|
5
|
+
import { ActorTree } from "./ActorTree.js";
|
|
6
|
+
import { Transform } from "./Transform.js";
|
|
7
|
+
export class Actor extends ActorTree {
|
|
8
|
+
gameInstance;
|
|
9
|
+
name;
|
|
10
|
+
awoken = false;
|
|
11
|
+
parent = null;
|
|
12
|
+
components = [];
|
|
13
|
+
behaviors = {};
|
|
14
|
+
transform;
|
|
15
|
+
pendingForDestruction = false;
|
|
16
|
+
threeObject = new THREE.Group();
|
|
17
|
+
constructor(gameInstance, options) {
|
|
18
|
+
super();
|
|
19
|
+
const { name, parent = null, visible = true, layer } = options;
|
|
20
|
+
if (parent !== null && parent.pendingForDestruction) {
|
|
21
|
+
throw new Error("Cannot add actor to a parent that is pending for destruction.");
|
|
22
|
+
}
|
|
23
|
+
this.gameInstance = gameInstance;
|
|
24
|
+
this.name = name;
|
|
25
|
+
this.parent = parent;
|
|
26
|
+
this.threeObject.visible = visible;
|
|
27
|
+
this.threeObject.name = this.name;
|
|
28
|
+
this.threeObject.userData.isActor = true;
|
|
29
|
+
if (layer) {
|
|
30
|
+
const layers = Array.isArray(layer) ? layer : [layer];
|
|
31
|
+
for (const layer of layers) {
|
|
32
|
+
this.threeObject.layers.enable(layer);
|
|
33
|
+
this.gameInstance.scene.getSource().layers.enable(layer);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
this.transform = new Transform(this.threeObject);
|
|
37
|
+
if (parent) {
|
|
38
|
+
parent.add(this);
|
|
39
|
+
parent.threeObject.add(this.threeObject);
|
|
40
|
+
this.threeObject.updateMatrixWorld(false);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.gameInstance.scene.tree.add(this);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
registerComponent(componentClass, ...args) {
|
|
47
|
+
const [options, callback] = args;
|
|
48
|
+
const component = new componentClass(this, options);
|
|
49
|
+
if (this.components.indexOf(component) === -1) {
|
|
50
|
+
this.components.push(component);
|
|
51
|
+
}
|
|
52
|
+
const index = this.gameInstance.scene.componentsToBeStarted.indexOf(component);
|
|
53
|
+
if (index === -1) {
|
|
54
|
+
this.gameInstance.scene.componentsToBeStarted.push(component);
|
|
55
|
+
}
|
|
56
|
+
callback?.(component);
|
|
57
|
+
if (this.awoken) {
|
|
58
|
+
component.awake?.();
|
|
59
|
+
}
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
registerComponentAndGet(componentClass, ...args) {
|
|
63
|
+
const [options] = args;
|
|
64
|
+
const component = new componentClass(this, options);
|
|
65
|
+
if (this.components.indexOf(component) === -1) {
|
|
66
|
+
this.components.push(component);
|
|
67
|
+
}
|
|
68
|
+
const index = this.gameInstance.scene.componentsToBeStarted.indexOf(component);
|
|
69
|
+
if (index === -1) {
|
|
70
|
+
this.gameInstance.scene.componentsToBeStarted.push(component);
|
|
71
|
+
}
|
|
72
|
+
if (this.awoken) {
|
|
73
|
+
component.awake?.();
|
|
74
|
+
}
|
|
75
|
+
return component;
|
|
76
|
+
}
|
|
77
|
+
awake() {
|
|
78
|
+
this.components.forEach((component) => component.awake?.());
|
|
79
|
+
}
|
|
80
|
+
update(deltaTime) {
|
|
81
|
+
if (!this.pendingForDestruction) {
|
|
82
|
+
this.components.forEach((component) => component.update?.(deltaTime));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
isDestroyed() {
|
|
86
|
+
return this.pendingForDestruction;
|
|
87
|
+
}
|
|
88
|
+
destroy() {
|
|
89
|
+
this.components.forEach((component) => component.destroy?.());
|
|
90
|
+
if (this.parent === null) {
|
|
91
|
+
this.gameInstance.scene.tree.remove(this);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
this.parent.threeObject.remove(this.threeObject);
|
|
95
|
+
this.parent.remove(this);
|
|
96
|
+
}
|
|
97
|
+
this.threeObject.clear();
|
|
98
|
+
}
|
|
99
|
+
markDestructionPending() {
|
|
100
|
+
this.pendingForDestruction = true;
|
|
101
|
+
this.destroyAllActors();
|
|
102
|
+
}
|
|
103
|
+
addBehavior(behaviorClass, properties = Object.create(null)) {
|
|
104
|
+
const behavior = new behaviorClass(this);
|
|
105
|
+
for (const [propertyName, value] of Object.entries(properties)) {
|
|
106
|
+
behavior.setProperty(propertyName, value);
|
|
107
|
+
}
|
|
108
|
+
if (this.awoken) {
|
|
109
|
+
// @ts-ignore
|
|
110
|
+
behavior.awake?.();
|
|
111
|
+
}
|
|
112
|
+
return behavior;
|
|
113
|
+
}
|
|
114
|
+
getBehavior(behaviorClass) {
|
|
115
|
+
for (const behaviorName in this.behaviors) {
|
|
116
|
+
if (!Object.hasOwn(this.behaviors, behaviorName)) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
for (const behavior of this.behaviors[behaviorName]) {
|
|
120
|
+
if (behavior instanceof behaviorClass &&
|
|
121
|
+
!behavior.isDestroyed()) {
|
|
122
|
+
return behavior;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
*getBehaviors(behaviorClass) {
|
|
129
|
+
for (const behaviorName in this.behaviors) {
|
|
130
|
+
if (!Object.hasOwn(this.behaviors, behaviorName)) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
for (const behavior of this.behaviors[behaviorName]) {
|
|
134
|
+
if (behavior instanceof behaviorClass &&
|
|
135
|
+
!behavior.isDestroyed()) {
|
|
136
|
+
yield behavior;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
setParent(newParent, keepLocal = false) {
|
|
142
|
+
if (this.pendingForDestruction) {
|
|
143
|
+
throw new Error("Cannot set parent of destroyed actor");
|
|
144
|
+
}
|
|
145
|
+
if (newParent !== null && newParent.pendingForDestruction) {
|
|
146
|
+
throw new Error("Cannot reparent actor to destroyed actor");
|
|
147
|
+
}
|
|
148
|
+
if (!keepLocal) {
|
|
149
|
+
this.transform.getGlobalMatrix(Transform.Matrix);
|
|
150
|
+
}
|
|
151
|
+
const oldSiblings = (this.parent === null) ? this.gameInstance.scene.tree : this.parent;
|
|
152
|
+
oldSiblings.remove(this);
|
|
153
|
+
this.threeObject.parent?.remove(this.threeObject);
|
|
154
|
+
this.parent = newParent;
|
|
155
|
+
const siblings = (newParent === null) ?
|
|
156
|
+
this.gameInstance.scene.tree :
|
|
157
|
+
newParent;
|
|
158
|
+
siblings.add(this);
|
|
159
|
+
const threeParent = (newParent === null) ?
|
|
160
|
+
this.gameInstance.scene.getSource() :
|
|
161
|
+
newParent.threeObject;
|
|
162
|
+
threeParent.add(this.threeObject);
|
|
163
|
+
if (keepLocal) {
|
|
164
|
+
this.threeObject.updateMatrixWorld(false);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this.transform.setGlobalMatrix(Transform.Matrix);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=Actor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Actor.js","sourceRoot":"","sources":["../../src/actor/Actor.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,+BAA+B;AAC/B,OAAO,EAAqB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAoB3C,MAAM,OAAO,KAAM,SAAQ,SAAS;IAClC,YAAY,CAAe;IAE3B,IAAI,CAAS;IACb,MAAM,GAAG,KAAK,CAAC;IACf,MAAM,GAAiB,IAAI,CAAC;IAC5B,UAAU,GAAgB,EAAE,CAAC;IAC7B,SAAS,GAAoC,EAAE,CAAC;IAChD,SAAS,CAAY;IACrB,qBAAqB,GAAG,KAAK,CAAC;IAE9B,WAAW,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;IAEhC,YACE,YAA0B,EAC1B,OAAqB;QAErB,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAE/D,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAEzC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEjD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;aACI,CAAC;YACJ,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,iBAAiB,CACf,cAAiB,EACjB,GAAG,IAEyF;QAE5F,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/E,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChE,CAAC;QAED,QAAQ,EAAE,CAAC,SAA4B,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACtB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB,CACrB,cAAiB,EACjB,GAAG,IAEwC;QAE3C,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/E,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACtB,CAAC;QAED,OAAO,SAA4B,CAAC;IACtC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,CACJ,SAAiB;QAEjB,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE9D,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;aACI,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED,WAAW,CACT,aAAgB,EAChB,aAA0C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QAE7D,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QAEzC,KAAK,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/D,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,KAAY,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,aAAa;YACb,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;QACrB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,WAAW,CACT,aAAgB;QAEhB,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;gBACpD,IACE,QAAQ,YAAY,aAAa;oBACjC,CAAC,QAAQ,CAAC,WAAW,EAAE,EACvB,CAAC;oBACD,OAAO,QAA2B,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,CAAE,YAAY,CACZ,aAAgB;QAEhB,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;gBACpD,IACE,QAAQ,YAAY,aAAa;oBACjC,CAAC,QAAQ,CAAC,WAAW,EAAE,EACvB,CAAC;oBACD,MAAM,QAA2B,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CACP,SAAgB,EAChB,SAAS,GAAG,KAAK;QAEjB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,qBAAqB,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACxF,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAExB,MAAM,QAAQ,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,SAAS,CAAC;QACZ,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,WAAW,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YACrC,SAAS,CAAC,WAAW,CAAC;QACxB,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAElC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;aACI,CAAC;YACJ,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { EventEmitter } from "@posva/event-emitter";
|
|
2
|
+
import { Actor } from "./Actor.ts";
|
|
3
|
+
import type { Component, FreeComponentEnum } from "../components/types.ts";
|
|
4
|
+
export interface ActorComponentOptions {
|
|
5
|
+
actor: Actor;
|
|
6
|
+
typeName: FreeComponentEnum;
|
|
7
|
+
}
|
|
8
|
+
export type ActorComponentEvents = {
|
|
9
|
+
metadataInitialized: [];
|
|
10
|
+
};
|
|
11
|
+
export declare class ActorComponent extends EventEmitter<ActorComponentEvents> implements Component {
|
|
12
|
+
actor: Actor;
|
|
13
|
+
typeName: FreeComponentEnum;
|
|
14
|
+
pendingForDestruction: boolean;
|
|
15
|
+
constructor(options: ActorComponentOptions);
|
|
16
|
+
isDestroyed(): boolean;
|
|
17
|
+
destroy(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=ActorComponent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActorComponent.d.ts","sourceRoot":"","sources":["../../src/actor/ActorComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,mBAAmB,EAAE,EAAE,CAAC;CACzB,CAAC;AAEF,qBAAa,cAAe,SAAQ,YAAY,CAAC,oBAAoB,CAAE,YAAW,SAAS;IACzF,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAE5B,qBAAqB,UAAS;gBAG5B,OAAO,EAAE,qBAAqB;IAUhC,WAAW;IAIX,OAAO;CAWR"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Import Third-party Dependencies
|
|
2
|
+
import { EventEmitter } from "@posva/event-emitter";
|
|
3
|
+
// Import Internal Dependencies
|
|
4
|
+
import { Actor } from "./Actor.js";
|
|
5
|
+
export class ActorComponent extends EventEmitter {
|
|
6
|
+
actor;
|
|
7
|
+
typeName;
|
|
8
|
+
pendingForDestruction = false;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
super();
|
|
11
|
+
this.actor = options.actor;
|
|
12
|
+
this.typeName = options.typeName;
|
|
13
|
+
this.actor.components.push(this);
|
|
14
|
+
this.actor.gameInstance.scene.componentsToBeStarted.push(this);
|
|
15
|
+
}
|
|
16
|
+
isDestroyed() {
|
|
17
|
+
return this.pendingForDestruction;
|
|
18
|
+
}
|
|
19
|
+
destroy() {
|
|
20
|
+
const startIndex = this.actor.gameInstance.scene.componentsToBeStarted.indexOf(this);
|
|
21
|
+
if (startIndex !== -1) {
|
|
22
|
+
this.actor.gameInstance.scene.componentsToBeStarted.splice(startIndex, 1);
|
|
23
|
+
}
|
|
24
|
+
const index = this.actor.components.indexOf(this);
|
|
25
|
+
if (index !== -1) {
|
|
26
|
+
this.actor.components.splice(index, 1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ActorComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActorComponent.js","sourceRoot":"","sources":["../../src/actor/ActorComponent.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,+BAA+B;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAenC,MAAM,OAAO,cAAe,SAAQ,YAAkC;IACpE,KAAK,CAAQ;IACb,QAAQ,CAAoB;IAE5B,qBAAqB,GAAG,KAAK,CAAC;IAE9B,YACE,OAA8B;QAE9B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAEjC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAED,OAAO;QACL,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrF,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Actor } from "./Actor.ts";
|
|
2
|
+
export type ActorTreeNode = {
|
|
3
|
+
actor: Actor;
|
|
4
|
+
parent?: Actor;
|
|
5
|
+
};
|
|
6
|
+
export interface ActorTreeOptions {
|
|
7
|
+
addCallback?: (actor: Actor) => void;
|
|
8
|
+
removeCallback?: (actor: Actor) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare class ActorTree {
|
|
11
|
+
#private;
|
|
12
|
+
children: Actor[];
|
|
13
|
+
constructor(options?: ActorTreeOptions);
|
|
14
|
+
add(actor: Actor): void;
|
|
15
|
+
remove(actor: Actor): void;
|
|
16
|
+
getActors(pattern: string): IterableIterator<Actor>;
|
|
17
|
+
/**
|
|
18
|
+
* @example
|
|
19
|
+
* const player = actor.children.getActor("player");
|
|
20
|
+
* const playerPhysicsBox = actor.children.getActor("player/physics_box");
|
|
21
|
+
*/
|
|
22
|
+
getActor(name: string): Actor | null;
|
|
23
|
+
getRootActors(): IterableIterator<Actor>;
|
|
24
|
+
getAllActors(): IterableIterator<Actor>;
|
|
25
|
+
destroyActor(actor: Actor): void;
|
|
26
|
+
destroyAllActors(): void;
|
|
27
|
+
walk(): IterableIterator<ActorTreeNode>;
|
|
28
|
+
walkFromNode(rootNode: Actor): IterableIterator<ActorTreeNode>;
|
|
29
|
+
[Symbol.iterator](): IterableIterator<Actor>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=ActorTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActorTree.d.ts","sourceRoot":"","sources":["../../src/actor/ActorTree.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAED,qBAAa,SAAS;;IAIpB,QAAQ,EAAE,KAAK,EAAE,CAAM;gBAGrB,OAAO,GAAE,gBAAqB;IAMhC,GAAG,CACD,KAAK,EAAE,KAAK,GACX,IAAI;IAKP,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAQxB,SAAS,CACT,OAAO,EAAE,MAAM,GACd,gBAAgB,CAAC,KAAK,CAAC;IAuF1B;;;;OAIG;IACH,QAAQ,CACN,IAAI,EAAE,MAAM,GACX,KAAK,GAAG,IAAI;IAqCb,aAAa,IAAI,gBAAgB,CAAC,KAAK,CAAC;IAQxC,YAAY,IAAI,gBAAgB,CAAC,KAAK,CAAC;IAMzC,YAAY,CACV,KAAK,EAAE,KAAK;IAOd,gBAAgB;IAiBd,IAAI,IAAI,gBAAgB,CAAC,aAAa,CAAC;IAMvC,YAAY,CACZ,QAAQ,EAAE,KAAK,GACd,gBAAgB,CAAC,aAAa,CAAC;IAMhC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC;CAO/C"}
|