@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.
Files changed (290) hide show
  1. package/README.md +209 -0
  2. package/dist/actor/Actor.d.ts +39 -0
  3. package/dist/actor/Actor.d.ts.map +1 -0
  4. package/dist/actor/Actor.js +171 -0
  5. package/dist/actor/Actor.js.map +1 -0
  6. package/dist/actor/ActorComponent.d.ts +19 -0
  7. package/dist/actor/ActorComponent.d.ts.map +1 -0
  8. package/dist/actor/ActorComponent.js +30 -0
  9. package/dist/actor/ActorComponent.js.map +1 -0
  10. package/dist/actor/ActorTree.d.ts +31 -0
  11. package/dist/actor/ActorTree.d.ts.map +1 -0
  12. package/dist/actor/ActorTree.js +167 -0
  13. package/dist/actor/ActorTree.js.map +1 -0
  14. package/dist/actor/Signal.d.ts +14 -0
  15. package/dist/actor/Signal.d.ts.map +1 -0
  16. package/dist/actor/Signal.js +38 -0
  17. package/dist/actor/Signal.js.map +1 -0
  18. package/dist/actor/Transform.d.ts +37 -0
  19. package/dist/actor/Transform.d.ts.map +1 -0
  20. package/dist/actor/Transform.js +148 -0
  21. package/dist/actor/Transform.js.map +1 -0
  22. package/dist/actor/index.d.ts +5 -0
  23. package/dist/actor/index.d.ts.map +1 -0
  24. package/dist/actor/index.js +5 -0
  25. package/dist/actor/index.js.map +1 -0
  26. package/dist/adapters/canvas.d.ts +7 -0
  27. package/dist/adapters/canvas.d.ts.map +1 -0
  28. package/dist/adapters/canvas.js +2 -0
  29. package/dist/adapters/canvas.js.map +1 -0
  30. package/dist/adapters/console.d.ts +6 -0
  31. package/dist/adapters/console.d.ts.map +1 -0
  32. package/dist/adapters/console.js +2 -0
  33. package/dist/adapters/console.js.map +1 -0
  34. package/dist/adapters/document.d.ts +14 -0
  35. package/dist/adapters/document.d.ts.map +1 -0
  36. package/dist/adapters/document.js +19 -0
  37. package/dist/adapters/document.js.map +1 -0
  38. package/dist/adapters/eventTarget.d.ts +6 -0
  39. package/dist/adapters/eventTarget.d.ts.map +1 -0
  40. package/dist/adapters/eventTarget.js +2 -0
  41. package/dist/adapters/eventTarget.js.map +1 -0
  42. package/dist/adapters/global.d.ts +8 -0
  43. package/dist/adapters/global.d.ts.map +1 -0
  44. package/dist/adapters/global.js +8 -0
  45. package/dist/adapters/global.js.map +1 -0
  46. package/dist/adapters/index.d.ts +6 -0
  47. package/dist/adapters/index.d.ts.map +1 -0
  48. package/dist/adapters/index.js +6 -0
  49. package/dist/adapters/index.js.map +1 -0
  50. package/dist/adapters/navigator.d.ts +9 -0
  51. package/dist/adapters/navigator.d.ts.map +1 -0
  52. package/dist/adapters/navigator.js +9 -0
  53. package/dist/adapters/navigator.js.map +1 -0
  54. package/dist/adapters/window.d.ts +12 -0
  55. package/dist/adapters/window.d.ts.map +1 -0
  56. package/dist/adapters/window.js +11 -0
  57. package/dist/adapters/window.js.map +1 -0
  58. package/dist/audio/AudioBackground.d.ts +48 -0
  59. package/dist/audio/AudioBackground.d.ts.map +1 -0
  60. package/dist/audio/AudioBackground.js +151 -0
  61. package/dist/audio/AudioBackground.js.map +1 -0
  62. package/dist/audio/AudioLibrary.d.ts +6 -0
  63. package/dist/audio/AudioLibrary.d.ts.map +1 -0
  64. package/dist/audio/AudioLibrary.js +6 -0
  65. package/dist/audio/AudioLibrary.js.map +1 -0
  66. package/dist/audio/AudioManager.d.ts +33 -0
  67. package/dist/audio/AudioManager.d.ts.map +1 -0
  68. package/dist/audio/AudioManager.js +47 -0
  69. package/dist/audio/AudioManager.js.map +1 -0
  70. package/dist/audio/GlobalAudio.d.ts +20 -0
  71. package/dist/audio/GlobalAudio.d.ts.map +1 -0
  72. package/dist/audio/GlobalAudio.js +41 -0
  73. package/dist/audio/GlobalAudio.js.map +1 -0
  74. package/dist/audio/internals/AudioBuffer.d.ts +23 -0
  75. package/dist/audio/internals/AudioBuffer.d.ts.map +1 -0
  76. package/dist/audio/internals/AudioBuffer.js +28 -0
  77. package/dist/audio/internals/AudioBuffer.js.map +1 -0
  78. package/dist/audio/internals/AudioListener.d.ts +5 -0
  79. package/dist/audio/internals/AudioListener.d.ts.map +1 -0
  80. package/dist/audio/internals/AudioListener.js +2 -0
  81. package/dist/audio/internals/AudioListener.js.map +1 -0
  82. package/dist/audio/internals/AudioService.d.ts +19 -0
  83. package/dist/audio/internals/AudioService.d.ts.map +1 -0
  84. package/dist/audio/internals/AudioService.js +36 -0
  85. package/dist/audio/internals/AudioService.js.map +1 -0
  86. package/dist/components/camera/Camera3DControls.d.ts +31 -0
  87. package/dist/components/camera/Camera3DControls.d.ts.map +1 -0
  88. package/dist/components/camera/Camera3DControls.js +79 -0
  89. package/dist/components/camera/Camera3DControls.js.map +1 -0
  90. package/dist/components/index.d.ts +5 -0
  91. package/dist/components/index.d.ts.map +1 -0
  92. package/dist/components/index.js +5 -0
  93. package/dist/components/index.js.map +1 -0
  94. package/dist/components/renderers/index.d.ts +14 -0
  95. package/dist/components/renderers/index.d.ts.map +1 -0
  96. package/dist/components/renderers/index.js +14 -0
  97. package/dist/components/renderers/index.js.map +1 -0
  98. package/dist/components/renderers/model/ModelAnimation.d.ts +21 -0
  99. package/dist/components/renderers/model/ModelAnimation.d.ts.map +1 -0
  100. package/dist/components/renderers/model/ModelAnimation.js +84 -0
  101. package/dist/components/renderers/model/ModelAnimation.js.map +1 -0
  102. package/dist/components/renderers/model/ModelRenderer.d.ts +24 -0
  103. package/dist/components/renderers/model/ModelRenderer.d.ts.map +1 -0
  104. package/dist/components/renderers/model/ModelRenderer.js +49 -0
  105. package/dist/components/renderers/model/ModelRenderer.js.map +1 -0
  106. package/dist/components/renderers/model/loader.d.ts +8 -0
  107. package/dist/components/renderers/model/loader.d.ts.map +1 -0
  108. package/dist/components/renderers/model/loader.js +112 -0
  109. package/dist/components/renderers/model/loader.js.map +1 -0
  110. package/dist/components/renderers/sprite/SpriteAnimation.class.d.ts +33 -0
  111. package/dist/components/renderers/sprite/SpriteAnimation.class.d.ts.map +1 -0
  112. package/dist/components/renderers/sprite/SpriteAnimation.class.js +78 -0
  113. package/dist/components/renderers/sprite/SpriteAnimation.class.js.map +1 -0
  114. package/dist/components/renderers/sprite/SpriteRenderer.class.d.ts +35 -0
  115. package/dist/components/renderers/sprite/SpriteRenderer.class.d.ts.map +1 -0
  116. package/dist/components/renderers/sprite/SpriteRenderer.class.js +76 -0
  117. package/dist/components/renderers/sprite/SpriteRenderer.class.js.map +1 -0
  118. package/dist/components/renderers/text/Text3D.class.d.ts +26 -0
  119. package/dist/components/renderers/text/Text3D.class.d.ts.map +1 -0
  120. package/dist/components/renderers/text/Text3D.class.js +104 -0
  121. package/dist/components/renderers/text/Text3D.class.js.map +1 -0
  122. package/dist/components/renderers/text/TextRenderer.class.d.ts +15 -0
  123. package/dist/components/renderers/text/TextRenderer.class.d.ts.map +1 -0
  124. package/dist/components/renderers/text/TextRenderer.class.js +47 -0
  125. package/dist/components/renderers/text/TextRenderer.class.js.map +1 -0
  126. package/dist/components/renderers/text/loader.d.ts +4 -0
  127. package/dist/components/renderers/text/loader.d.ts.map +1 -0
  128. package/dist/components/renderers/text/loader.js +14 -0
  129. package/dist/components/renderers/text/loader.js.map +1 -0
  130. package/dist/components/renderers/tiled/TileLayer.d.ts +13 -0
  131. package/dist/components/renderers/tiled/TileLayer.d.ts.map +1 -0
  132. package/dist/components/renderers/tiled/TileLayer.js +34 -0
  133. package/dist/components/renderers/tiled/TileLayer.js.map +1 -0
  134. package/dist/components/renderers/tiled/TileMapRenderer.d.ts +15 -0
  135. package/dist/components/renderers/tiled/TileMapRenderer.d.ts.map +1 -0
  136. package/dist/components/renderers/tiled/TileMapRenderer.js +59 -0
  137. package/dist/components/renderers/tiled/TileMapRenderer.js.map +1 -0
  138. package/dist/components/renderers/tiled/TileObject.d.ts +18 -0
  139. package/dist/components/renderers/tiled/TileObject.d.ts.map +1 -0
  140. package/dist/components/renderers/tiled/TileObject.js +59 -0
  141. package/dist/components/renderers/tiled/TileObject.js.map +1 -0
  142. package/dist/components/renderers/tiled/TileSet.d.ts +27 -0
  143. package/dist/components/renderers/tiled/TileSet.d.ts.map +1 -0
  144. package/dist/components/renderers/tiled/TileSet.js +116 -0
  145. package/dist/components/renderers/tiled/TileSet.js.map +1 -0
  146. package/dist/components/renderers/tiled/loader.d.ts +13 -0
  147. package/dist/components/renderers/tiled/loader.d.ts.map +1 -0
  148. package/dist/components/renderers/tiled/loader.js +39 -0
  149. package/dist/components/renderers/tiled/loader.js.map +1 -0
  150. package/dist/components/renderers/tiled/types.d.ts +325 -0
  151. package/dist/components/renderers/tiled/types.d.ts.map +1 -0
  152. package/dist/components/renderers/tiled/types.js +18 -0
  153. package/dist/components/renderers/tiled/types.js.map +1 -0
  154. package/dist/components/script/Behavior.d.ts +16 -0
  155. package/dist/components/script/Behavior.d.ts.map +1 -0
  156. package/dist/components/script/Behavior.js +52 -0
  157. package/dist/components/script/Behavior.js.map +1 -0
  158. package/dist/components/script/BehaviorDecorators.d.ts +29 -0
  159. package/dist/components/script/BehaviorDecorators.d.ts.map +1 -0
  160. package/dist/components/script/BehaviorDecorators.js +47 -0
  161. package/dist/components/script/BehaviorDecorators.js.map +1 -0
  162. package/dist/components/script/BehaviorInitializer.d.ts +15 -0
  163. package/dist/components/script/BehaviorInitializer.d.ts.map +1 -0
  164. package/dist/components/script/BehaviorInitializer.js +103 -0
  165. package/dist/components/script/BehaviorInitializer.js.map +1 -0
  166. package/dist/components/types.d.ts +12 -0
  167. package/dist/components/types.d.ts.map +1 -0
  168. package/dist/components/types.js +3 -0
  169. package/dist/components/types.js.map +1 -0
  170. package/dist/controls/AtomicInput.d.ts +17 -0
  171. package/dist/controls/AtomicInput.d.ts.map +1 -0
  172. package/dist/controls/AtomicInput.js +69 -0
  173. package/dist/controls/AtomicInput.js.map +1 -0
  174. package/dist/controls/CombinedInput.d.ts +54 -0
  175. package/dist/controls/CombinedInput.d.ts.map +1 -0
  176. package/dist/controls/CombinedInput.js +119 -0
  177. package/dist/controls/CombinedInput.js.map +1 -0
  178. package/dist/controls/Input.class.d.ts +93 -0
  179. package/dist/controls/Input.class.d.ts.map +1 -0
  180. package/dist/controls/Input.class.js +334 -0
  181. package/dist/controls/Input.class.js.map +1 -0
  182. package/dist/controls/devices/Gamepad.class.d.ts +98 -0
  183. package/dist/controls/devices/Gamepad.class.d.ts.map +1 -0
  184. package/dist/controls/devices/Gamepad.class.js +275 -0
  185. package/dist/controls/devices/Gamepad.class.js.map +1 -0
  186. package/dist/controls/devices/Mouse.class.d.ts +80 -0
  187. package/dist/controls/devices/Mouse.class.d.ts.map +1 -0
  188. package/dist/controls/devices/Mouse.class.js +260 -0
  189. package/dist/controls/devices/Mouse.class.js.map +1 -0
  190. package/dist/controls/devices/Screen.d.ts +27 -0
  191. package/dist/controls/devices/Screen.d.ts.map +1 -0
  192. package/dist/controls/devices/Screen.js +61 -0
  193. package/dist/controls/devices/Screen.js.map +1 -0
  194. package/dist/controls/devices/Touchpad.class.d.ts +61 -0
  195. package/dist/controls/devices/Touchpad.class.d.ts.map +1 -0
  196. package/dist/controls/devices/Touchpad.class.js +149 -0
  197. package/dist/controls/devices/Touchpad.class.js.map +1 -0
  198. package/dist/controls/devices/index.d.ts +6 -0
  199. package/dist/controls/devices/index.d.ts.map +1 -0
  200. package/dist/controls/devices/index.js +6 -0
  201. package/dist/controls/devices/index.js.map +1 -0
  202. package/dist/controls/devices/keyboard/Keyboard.class.d.ts +37 -0
  203. package/dist/controls/devices/keyboard/Keyboard.class.d.ts.map +1 -0
  204. package/dist/controls/devices/keyboard/Keyboard.class.js +135 -0
  205. package/dist/controls/devices/keyboard/Keyboard.class.js.map +1 -0
  206. package/dist/controls/devices/keyboard/code.d.ts +9 -0
  207. package/dist/controls/devices/keyboard/code.d.ts.map +1 -0
  208. package/dist/controls/devices/keyboard/code.js +13 -0
  209. package/dist/controls/devices/keyboard/code.js.map +1 -0
  210. package/dist/controls/devices/keyboard/transformers/alphabet.d.ts +31 -0
  211. package/dist/controls/devices/keyboard/transformers/alphabet.d.ts.map +1 -0
  212. package/dist/controls/devices/keyboard/transformers/alphabet.js +34 -0
  213. package/dist/controls/devices/keyboard/transformers/alphabet.js.map +1 -0
  214. package/dist/controls/devices/keyboard/transformers/numeric.d.ts +15 -0
  215. package/dist/controls/devices/keyboard/transformers/numeric.d.ts.map +1 -0
  216. package/dist/controls/devices/keyboard/transformers/numeric.js +18 -0
  217. package/dist/controls/devices/keyboard/transformers/numeric.js.map +1 -0
  218. package/dist/controls/types.d.ts +23 -0
  219. package/dist/controls/types.d.ts.map +1 -0
  220. package/dist/controls/types.js +2 -0
  221. package/dist/controls/types.js.map +1 -0
  222. package/dist/index.d.ts +9 -0
  223. package/dist/index.d.ts.map +1 -0
  224. package/dist/index.js +9 -0
  225. package/dist/index.js.map +1 -0
  226. package/dist/systems/FixedTimeStep.d.ts +16 -0
  227. package/dist/systems/FixedTimeStep.d.ts.map +1 -0
  228. package/dist/systems/FixedTimeStep.js +41 -0
  229. package/dist/systems/FixedTimeStep.js.map +1 -0
  230. package/dist/systems/GameInstance.d.ts +30 -0
  231. package/dist/systems/GameInstance.d.ts.map +1 -0
  232. package/dist/systems/GameInstance.js +54 -0
  233. package/dist/systems/GameInstance.js.map +1 -0
  234. package/dist/systems/Scene.d.ts +30 -0
  235. package/dist/systems/Scene.d.ts.map +1 -0
  236. package/dist/systems/Scene.js +91 -0
  237. package/dist/systems/Scene.js.map +1 -0
  238. package/dist/systems/asset/Base.d.ts +18 -0
  239. package/dist/systems/asset/Base.d.ts.map +1 -0
  240. package/dist/systems/asset/Base.js +36 -0
  241. package/dist/systems/asset/Base.js.map +1 -0
  242. package/dist/systems/asset/Manager.d.ts +21 -0
  243. package/dist/systems/asset/Manager.d.ts.map +1 -0
  244. package/dist/systems/asset/Manager.js +68 -0
  245. package/dist/systems/asset/Manager.js.map +1 -0
  246. package/dist/systems/asset/Queue.d.ts +8 -0
  247. package/dist/systems/asset/Queue.d.ts.map +1 -0
  248. package/dist/systems/asset/Queue.js +17 -0
  249. package/dist/systems/asset/Queue.js.map +1 -0
  250. package/dist/systems/asset/Registry.d.ts +17 -0
  251. package/dist/systems/asset/Registry.d.ts.map +1 -0
  252. package/dist/systems/asset/Registry.js +23 -0
  253. package/dist/systems/asset/Registry.js.map +1 -0
  254. package/dist/systems/index.d.ts +9 -0
  255. package/dist/systems/index.d.ts.map +1 -0
  256. package/dist/systems/index.js +8 -0
  257. package/dist/systems/index.js.map +1 -0
  258. package/dist/systems/rendering/GameRenderer.d.ts +18 -0
  259. package/dist/systems/rendering/GameRenderer.d.ts.map +1 -0
  260. package/dist/systems/rendering/GameRenderer.js +3 -0
  261. package/dist/systems/rendering/GameRenderer.js.map +1 -0
  262. package/dist/systems/rendering/RenderStrategy.d.ts +24 -0
  263. package/dist/systems/rendering/RenderStrategy.d.ts.map +1 -0
  264. package/dist/systems/rendering/RenderStrategy.js +38 -0
  265. package/dist/systems/rendering/RenderStrategy.js.map +1 -0
  266. package/dist/systems/rendering/ThreeRenderer.d.ts +48 -0
  267. package/dist/systems/rendering/ThreeRenderer.d.ts.map +1 -0
  268. package/dist/systems/rendering/ThreeRenderer.js +149 -0
  269. package/dist/systems/rendering/ThreeRenderer.js.map +1 -0
  270. package/dist/systems/rendering/index.d.ts +4 -0
  271. package/dist/systems/rendering/index.d.ts.map +1 -0
  272. package/dist/systems/rendering/index.js +3 -0
  273. package/dist/systems/rendering/index.js.map +1 -0
  274. package/dist/utils/createViewHelper.d.ts +5 -0
  275. package/dist/utils/createViewHelper.d.ts.map +1 -0
  276. package/dist/utils/createViewHelper.js +11 -0
  277. package/dist/utils/createViewHelper.js.map +1 -0
  278. package/dist/utils/index.d.ts +4 -0
  279. package/dist/utils/index.d.ts.map +1 -0
  280. package/dist/utils/index.js +4 -0
  281. package/dist/utils/index.js.map +1 -0
  282. package/dist/utils/loadJSON.d.ts +2 -0
  283. package/dist/utils/loadJSON.d.ts.map +1 -0
  284. package/dist/utils/loadJSON.js +15 -0
  285. package/dist/utils/loadJSON.js.map +1 -0
  286. package/dist/utils/path.d.ts +9 -0
  287. package/dist/utils/path.d.ts.map +1 -0
  288. package/dist/utils/path.js +18 -0
  289. package/dist/utils/path.js.map +1 -0
  290. 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":"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"}
@@ -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"}