emeraldengine 2.2.0 → 3.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 +2359 -968
- package/dist/types/index.d.ts +72 -32
- package/dist/types/src/Animator.d.ts +50 -0
- package/dist/types/{BitmapText.d.ts → src/BitmapText.d.ts} +19 -21
- package/dist/types/src/Camera.d.ts +122 -0
- package/dist/types/src/CameraController.d.ts +107 -0
- package/dist/types/src/CanvasText.d.ts +91 -0
- package/dist/types/src/CollisionLayers.d.ts +58 -0
- package/dist/types/{Color.d.ts → src/Color.d.ts} +5 -6
- package/dist/types/src/Coroutine.d.ts +111 -0
- package/dist/types/src/DebugOverlay.d.ts +86 -0
- package/dist/types/src/Drawable.d.ts +271 -0
- package/dist/types/src/Easing.d.ts +22 -0
- package/dist/types/src/Emerald.d.ts +420 -0
- package/dist/types/src/EmeraldDB.d.ts +159 -0
- package/dist/types/{FPSCounter.d.ts → src/FPSCounter.d.ts} +1 -3
- package/dist/types/src/GLUtils.d.ts +4 -0
- package/dist/types/{Instance.d.ts → src/Instance.d.ts} +37 -15
- package/dist/types/{InstancedTexture.d.ts → src/InstancedTexture.d.ts} +60 -23
- package/dist/types/src/Interpolator.d.ts +66 -0
- package/dist/types/src/Material.d.ts +87 -0
- package/dist/types/src/MathUtils.d.ts +80 -0
- package/dist/types/src/ParticleEmitter.d.ts +131 -0
- package/dist/types/{Physics.d.ts → src/Physics.d.ts} +88 -20
- package/dist/types/src/Pool.d.ts +53 -0
- package/dist/types/src/PostEffects.d.ts +68 -0
- package/dist/types/src/PostProcessor.d.ts +124 -0
- package/dist/types/src/RenderTarget.d.ts +56 -0
- package/dist/types/src/Scene.d.ts +62 -0
- package/dist/types/src/ScreenEffects.d.ts +111 -0
- package/dist/types/src/Serializer.d.ts +86 -0
- package/dist/types/src/Shaders.d.ts +2 -0
- package/dist/types/{Shapes.d.ts → src/Shapes.d.ts} +4 -6
- package/dist/types/src/SpatialGrid.d.ts +50 -0
- package/dist/types/src/SpriteBatch.d.ts +89 -0
- package/dist/types/src/StateMachine.d.ts +59 -0
- package/dist/types/src/Storage.d.ts +89 -0
- package/dist/types/{Texture.d.ts → src/Texture.d.ts} +3 -4
- package/dist/types/src/TextureAtlas.d.ts +55 -0
- package/dist/types/src/Tilemap.d.ts +91 -0
- package/dist/types/src/Time.d.ts +53 -0
- package/dist/types/src/Timer.d.ts +54 -0
- package/dist/types/src/Transform.d.ts +94 -0
- package/dist/types/src/Tween.d.ts +81 -0
- package/dist/types/src/UI.d.ts +121 -0
- package/dist/types/src/components/Behaviour.d.ts +71 -0
- package/dist/types/{components → src/components}/BoxCollider.d.ts +14 -14
- package/dist/types/src/components/BoxColliderDebug.d.ts +15 -0
- package/dist/types/{components → src/components}/CircleCollider.d.ts +14 -12
- package/dist/types/src/components/CircleColliderDebug.d.ts +15 -0
- package/dist/types/src/components/Collider.d.ts +96 -0
- package/dist/types/src/components/GameObject.d.ts +135 -0
- package/dist/types/src/components/RigidBody.d.ts +183 -0
- package/dist/types/src/importers/Aseprite.d.ts +79 -0
- package/dist/types/src/importers/TiledMap.d.ts +62 -0
- package/dist/types/{lights → src/lights}/DirectionalLight.d.ts +7 -9
- package/dist/types/{lights → src/lights}/PointLight.d.ts +6 -9
- package/dist/types/src/managers/AssetManager.d.ts +116 -0
- package/dist/types/src/managers/AudioManager.d.ts +259 -0
- package/dist/types/{managers → src/managers}/CameraManager.d.ts +8 -8
- package/dist/types/{managers → src/managers}/EventManager.d.ts +46 -32
- package/dist/types/src/managers/GLManager.d.ts +84 -0
- package/dist/types/src/managers/GLState.d.ts +37 -0
- package/dist/types/src/managers/IDManager.d.ts +31 -0
- package/dist/types/src/managers/InputManager.d.ts +290 -0
- package/dist/types/src/managers/NetworkManager.d.ts +93 -0
- package/dist/types/src/managers/RenderStats.d.ts +34 -0
- package/dist/types/src/managers/SceneManager.d.ts +44 -0
- package/dist/types/src/managers/ShaderManager.d.ts +55 -0
- package/dist/types/src/managers/TextureManager.d.ts +102 -0
- package/dist/types/src/particlesystem/Particle.d.ts +64 -0
- package/dist/types/{particlesystem → src/particlesystem}/ParticleSettings.d.ts +32 -24
- package/dist/types/{particlesystem → src/particlesystem}/Particles.d.ts +20 -12
- package/index.js +72 -0
- package/package.json +74 -60
- package/src/Animator.js +95 -0
- package/src/BitmapText.js +6 -5
- package/src/Camera.js +183 -0
- package/src/CameraController.js +192 -0
- package/src/CanvasText.js +281 -0
- package/src/CollisionLayers.js +86 -0
- package/src/Color.js +18 -18
- package/src/Coroutine.js +259 -0
- package/src/DebugOverlay.js +246 -0
- package/src/Drawable.js +842 -555
- package/src/Easing.js +57 -0
- package/src/Emerald.js +1150 -459
- package/src/EmeraldDB.js +328 -0
- package/src/FPSCounter.js +43 -43
- package/src/GLUtils.js +60 -67
- package/src/Instance.js +41 -5
- package/src/InstancedTexture.js +251 -118
- package/src/Interpolator.js +124 -0
- package/src/Material.js +202 -0
- package/src/MathUtils.js +133 -0
- package/src/ParticleEmitter.js +284 -0
- package/src/Physics.js +186 -5
- package/src/Pool.js +85 -0
- package/src/PostEffects.js +296 -0
- package/src/PostProcessor.js +304 -0
- package/src/RenderTarget.js +134 -0
- package/src/Scene.js +115 -83
- package/src/ScreenEffects.js +266 -0
- package/src/Serializer.js +131 -0
- package/src/Shaders.js +150 -165
- package/src/Shapes.js +118 -129
- package/src/SpatialGrid.js +111 -0
- package/src/SpriteBatch.js +299 -0
- package/src/StateMachine.js +82 -0
- package/src/Storage.js +175 -47
- package/src/Texture.js +58 -67
- package/src/TextureAtlas.js +96 -0
- package/src/Tilemap.js +274 -0
- package/src/Time.js +51 -6
- package/src/Timer.js +99 -0
- package/src/Transform.js +100 -7
- package/src/Tween.js +160 -0
- package/src/UI.js +394 -0
- package/src/components/Behaviour.js +90 -0
- package/src/components/BoxCollider.js +22 -3
- package/src/components/CircleCollider.js +19 -3
- package/src/components/CircleColliderDebug.js +24 -24
- package/src/components/Collider.js +140 -34
- package/src/components/GameObject.js +130 -21
- package/src/components/RigidBody.js +123 -2
- package/src/importers/Aseprite.js +142 -0
- package/src/importers/TiledMap.js +158 -0
- package/src/lights/DirectionalLight.js +6 -15
- package/src/lights/PointLight.js +4 -4
- package/src/managers/AssetManager.js +239 -0
- package/src/managers/AudioManager.js +565 -146
- package/src/managers/EventManager.js +488 -477
- package/src/managers/GLManager.js +57 -0
- package/src/managers/GLState.js +70 -0
- package/src/managers/IDManager.js +24 -2
- package/src/managers/InputManager.js +779 -0
- package/src/managers/NetworkManager.js +178 -0
- package/src/managers/RenderStats.js +34 -0
- package/src/managers/SceneManager.js +30 -0
- package/src/managers/ShaderManager.js +0 -2
- package/src/managers/TextureManager.js +218 -0
- package/src/particlesystem/Particle.js +82 -7
- package/src/particlesystem/ParticleSettings.js +21 -3
- package/src/particlesystem/Particles.js +80 -31
- package/dist/types/Drawable.d.ts +0 -157
- package/dist/types/Emerald.d.ts +0 -73
- package/dist/types/GLUtils.d.ts +0 -6
- package/dist/types/Scene.d.ts +0 -39
- package/dist/types/Shaders.d.ts +0 -4
- package/dist/types/Storage.d.ts +0 -46
- package/dist/types/Time.d.ts +0 -22
- package/dist/types/Transform.d.ts +0 -41
- package/dist/types/components/BoxColliderDebug.d.ts +0 -19
- package/dist/types/components/CircleColliderDebug.d.ts +0 -19
- package/dist/types/components/Collider.d.ts +0 -53
- package/dist/types/components/GameObject.d.ts +0 -72
- package/dist/types/components/RigidBody.d.ts +0 -104
- package/dist/types/managers/AudioManager.d.ts +0 -60
- package/dist/types/managers/GLManager.d.ts +0 -47
- package/dist/types/managers/IDManager.d.ts +0 -21
- package/dist/types/managers/SceneManager.d.ts +0 -22
- package/dist/types/particlesystem/Particle.d.ts +0 -42
|
@@ -1,477 +1,488 @@
|
|
|
1
|
-
import Scene from "../Scene.js";
|
|
2
|
-
import InstancedTexture from "../InstancedTexture.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @class EventManager
|
|
6
|
-
* @description Manages the events for the game
|
|
7
|
-
* @param {HTMLCanvasElement} canvas - The canvas element
|
|
8
|
-
* @param {Scene} scene - The scene
|
|
9
|
-
* @param {Camera} camera - The camera
|
|
10
|
-
*/
|
|
11
|
-
class EventManager {
|
|
12
|
-
constructor(canvas, scene, camera) {
|
|
13
|
-
this.scene = scene;
|
|
14
|
-
this.camera = camera;
|
|
15
|
-
this.canvas = canvas;
|
|
16
|
-
this.keyDownListeners = new Map();
|
|
17
|
-
this.keyUpListeners = new Map();
|
|
18
|
-
this.clickListeners = new Map();
|
|
19
|
-
this.hoverListeners = new Map();
|
|
20
|
-
this.lastHoveredObject = null;
|
|
21
|
-
this.lastHoveredInstance = null;
|
|
22
|
-
this.pressedKeys = new Map();
|
|
23
|
-
this.mousePosition = { x: 0, y: 0 };
|
|
24
|
-
this.boundHandleMouseMove = this.handleMouseMove.bind(this);
|
|
25
|
-
this.boundHandleKeyDown = this.handleKeyDown.bind(this);
|
|
26
|
-
this.boundHandleKeyUp = this.handleKeyUp.bind(this);
|
|
27
|
-
this.boundHandleClick = this.handleClick.bind(this);
|
|
28
|
-
|
|
29
|
-
this.boundHandleMouseDown = this.handleMouseDown.bind(this);
|
|
30
|
-
this.boundHandleMouseUp = this.handleMouseUp.bind(this);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
this.
|
|
34
|
-
this.
|
|
35
|
-
this.
|
|
36
|
-
this.
|
|
37
|
-
this.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
window.addEventListener("
|
|
42
|
-
window.addEventListener("
|
|
43
|
-
window.addEventListener("
|
|
44
|
-
window.addEventListener("
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
* @
|
|
50
|
-
* @
|
|
51
|
-
* @param {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
* @
|
|
68
|
-
* @
|
|
69
|
-
* @param {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
.
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
* @
|
|
86
|
-
* @
|
|
87
|
-
* @param {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
* @
|
|
100
|
-
* @
|
|
101
|
-
* @param {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
* @
|
|
114
|
-
* @
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
* @
|
|
132
|
-
* @
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
* @
|
|
150
|
-
* @
|
|
151
|
-
* @
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
* @
|
|
162
|
-
* @
|
|
163
|
-
* @param {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
* @
|
|
175
|
-
*
|
|
176
|
-
* @param {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const
|
|
188
|
-
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
this.
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
* @
|
|
272
|
-
* @
|
|
273
|
-
* @param {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
* @
|
|
285
|
-
* @
|
|
286
|
-
* @param {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
* @
|
|
302
|
-
* @
|
|
303
|
-
* @param {
|
|
304
|
-
*/
|
|
305
|
-
|
|
306
|
-
if (
|
|
307
|
-
this.
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
if (
|
|
408
|
-
const
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
* @
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
1
|
+
import Scene from "../Scene.js";
|
|
2
|
+
import InstancedTexture from "../InstancedTexture.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @class EventManager
|
|
6
|
+
* @description Manages the events for the game
|
|
7
|
+
* @param {HTMLCanvasElement} canvas - The canvas element
|
|
8
|
+
* @param {Scene} scene - The scene
|
|
9
|
+
* @param {Camera} camera - The camera
|
|
10
|
+
*/
|
|
11
|
+
class EventManager {
|
|
12
|
+
constructor(canvas, scene, camera) {
|
|
13
|
+
this.scene = scene;
|
|
14
|
+
this.camera = camera;
|
|
15
|
+
this.canvas = canvas;
|
|
16
|
+
this.keyDownListeners = new Map();
|
|
17
|
+
this.keyUpListeners = new Map();
|
|
18
|
+
this.clickListeners = new Map();
|
|
19
|
+
this.hoverListeners = new Map();
|
|
20
|
+
this.lastHoveredObject = null;
|
|
21
|
+
this.lastHoveredInstance = null;
|
|
22
|
+
this.pressedKeys = new Map();
|
|
23
|
+
this.mousePosition = { x: 0, y: 0 };
|
|
24
|
+
this.boundHandleMouseMove = this.handleMouseMove.bind(this);
|
|
25
|
+
this.boundHandleKeyDown = this.handleKeyDown.bind(this);
|
|
26
|
+
this.boundHandleKeyUp = this.handleKeyUp.bind(this);
|
|
27
|
+
this.boundHandleClick = this.handleClick.bind(this);
|
|
28
|
+
|
|
29
|
+
this.boundHandleMouseDown = this.handleMouseDown.bind(this);
|
|
30
|
+
this.boundHandleMouseUp = this.handleMouseUp.bind(this);
|
|
31
|
+
|
|
32
|
+
this.isDragging = false;
|
|
33
|
+
this.dragStartX = 0;
|
|
34
|
+
this.dragStartY = 0;
|
|
35
|
+
this.initialCameraX = this.camera.transform.position.x;
|
|
36
|
+
this.initialCameraY = this.camera.transform.position.y;
|
|
37
|
+
this.cameraWasMoved = false;
|
|
38
|
+
|
|
39
|
+
this.canvas.addEventListener("click", this.boundHandleClick);
|
|
40
|
+
this.canvas.addEventListener("mousedown", this.boundHandleMouseDown);
|
|
41
|
+
window.addEventListener("mousemove", this.boundHandleMouseMove);
|
|
42
|
+
window.addEventListener("mouseup", this.boundHandleMouseUp);
|
|
43
|
+
window.addEventListener("keydown", this.boundHandleKeyDown);
|
|
44
|
+
window.addEventListener("keyup", this.boundHandleKeyUp);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @method addKeyDown
|
|
49
|
+
* @description Adds a key down event listener
|
|
50
|
+
* @param {string} key - The key to listen for
|
|
51
|
+
* @param {function} func - The function to call when the key is pressed
|
|
52
|
+
*/
|
|
53
|
+
addKeyDown(key, func) {
|
|
54
|
+
if (!this.keyDownListeners.has(key.length <= 1 ? key.toLowerCase() : key)) {
|
|
55
|
+
this.keyDownListeners.set(
|
|
56
|
+
key.length <= 1 ? key.toLowerCase() : key,
|
|
57
|
+
new Set()
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
this.keyDownListeners
|
|
61
|
+
.get(key.length <= 1 ? key.toLowerCase() : key)
|
|
62
|
+
.add(func);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @method addKeyUp
|
|
67
|
+
* @description Adds a key up event listener
|
|
68
|
+
* @param {string} key - The key to listen for
|
|
69
|
+
* @param {function} func - The function to call when the key is released
|
|
70
|
+
*/
|
|
71
|
+
addKeyUp(key, func) {
|
|
72
|
+
if (!this.keyUpListeners.has(key.length <= 1 ? key.toLowerCase() : key)) {
|
|
73
|
+
this.keyUpListeners.set(
|
|
74
|
+
key.length <= 1 ? key.toLowerCase() : key,
|
|
75
|
+
new Set()
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
this.keyUpListeners
|
|
79
|
+
.get(key.length <= 1 ? key.toLowerCase() : key)
|
|
80
|
+
.add(func);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @method removeKeyDown
|
|
85
|
+
* @description Removes a key down event listener
|
|
86
|
+
* @param {string} key - The key to remove the listener for
|
|
87
|
+
* @param {function} func - The function to remove
|
|
88
|
+
*/
|
|
89
|
+
removeKeyDown(key, func) {
|
|
90
|
+
if (this.keyDownListeners.has(key.length <= 1 ? key.toLowerCase() : key)) {
|
|
91
|
+
this.keyDownListeners
|
|
92
|
+
.get(key.length <= 1 ? key.toLowerCase() : key)
|
|
93
|
+
.delete(func);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @method removeKeyUp
|
|
99
|
+
* @description Removes a key up event listener
|
|
100
|
+
* @param {string} key - The key to remove the listener for
|
|
101
|
+
* @param {function} func - The function to remove
|
|
102
|
+
*/
|
|
103
|
+
removeKeyUp(key, func) {
|
|
104
|
+
if (this.keyUpListeners.has(key.length <= 1 ? key.toLowerCase() : key)) {
|
|
105
|
+
this.keyUpListeners
|
|
106
|
+
.get(key.length <= 1 ? key.toLowerCase() : key)
|
|
107
|
+
.delete(func);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @method handleKeyDown
|
|
113
|
+
* @description Handles a key down event
|
|
114
|
+
* @param {KeyboardEvent} event - The keyboard event
|
|
115
|
+
*/
|
|
116
|
+
handleKeyDown(event) {
|
|
117
|
+
this.pressedKeys.set(
|
|
118
|
+
event.key.length <= 1 ? event.key.toLowerCase() : event.key,
|
|
119
|
+
true
|
|
120
|
+
);
|
|
121
|
+
const listeners = this.keyDownListeners.get(
|
|
122
|
+
event.key.length <= 1 ? event.key.toLowerCase() : event.key
|
|
123
|
+
);
|
|
124
|
+
if (listeners) {
|
|
125
|
+
listeners.forEach((func) => func(event));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* @method handleKeyUp
|
|
131
|
+
* @description Handles a key up event
|
|
132
|
+
* @param {KeyboardEvent} event - The keyboard event
|
|
133
|
+
*/
|
|
134
|
+
handleKeyUp(event) {
|
|
135
|
+
this.pressedKeys.set(
|
|
136
|
+
event.key.length <= 1 ? event.key.toLowerCase() : event.key,
|
|
137
|
+
false
|
|
138
|
+
);
|
|
139
|
+
const listeners = this.keyUpListeners.get(
|
|
140
|
+
event.key.length <= 1 ? event.key.toLowerCase() : event.key
|
|
141
|
+
);
|
|
142
|
+
if (listeners) {
|
|
143
|
+
listeners.forEach((func) => func(event));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @method isKeyPressed
|
|
149
|
+
* @description Checks if a key is pressed
|
|
150
|
+
* @param {string} key - The key to check
|
|
151
|
+
* @returns {boolean} - True if the key is pressed
|
|
152
|
+
*/
|
|
153
|
+
isKeyPressed(key) {
|
|
154
|
+
return (
|
|
155
|
+
this.pressedKeys.get(key.length <= 1 ? key.toLowerCase() : key) || false
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @method addClickEvent
|
|
161
|
+
* @description Adds a click event listener
|
|
162
|
+
* @param {GameObject} object - The object to listen for
|
|
163
|
+
* @param {function} func - The function to call when the object is clicked
|
|
164
|
+
*/
|
|
165
|
+
addClickEvent(object, func) {
|
|
166
|
+
if (!this.clickListeners.has(object.id)) {
|
|
167
|
+
this.clickListeners.set(object.id, new Set());
|
|
168
|
+
}
|
|
169
|
+
this.clickListeners.get(object.id).add(func);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* @method screenToWorld
|
|
174
|
+
* @description Converts screen (client) coordinates to world coordinates,
|
|
175
|
+
* accounting for camera position, zoom, and CSS/backing pixel ratio.
|
|
176
|
+
* @param {number} clientX - The clientX of the pointer
|
|
177
|
+
* @param {number} clientY - The clientY of the pointer
|
|
178
|
+
* @returns {{x: number, y: number}} - The world-space coordinates
|
|
179
|
+
*/
|
|
180
|
+
screenToWorld(clientX, clientY) {
|
|
181
|
+
const rect = this.canvas.getBoundingClientRect();
|
|
182
|
+
const scale = this.camera.transform.scale;
|
|
183
|
+
const zoom = scale && scale.x ? scale.x : 1;
|
|
184
|
+
|
|
185
|
+
const vp = this.camera.viewport || { x: 0, y: 0, width: 1, height: 1 };
|
|
186
|
+
const vpLeft = rect.left + vp.x * rect.width;
|
|
187
|
+
const vpTop = rect.top + (1 - vp.y - vp.height) * rect.height;
|
|
188
|
+
const centerX = vpLeft + (vp.width * rect.width) / 2;
|
|
189
|
+
const centerY = vpTop + (vp.height * rect.height) / 2;
|
|
190
|
+
|
|
191
|
+
const cx = clientX - centerX;
|
|
192
|
+
const cy = clientY - centerY;
|
|
193
|
+
return {
|
|
194
|
+
x: cx / zoom - this.camera.transform.position.x,
|
|
195
|
+
y: -cy / zoom - this.camera.transform.position.y,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* @method getTopObjectAt
|
|
201
|
+
* @description Returns the topmost active object under a world-space point
|
|
202
|
+
* along with the instance hit (if the object is an InstancedTexture). Topmost
|
|
203
|
+
* means highest z, with later scene order breaking ties — matching draw order.
|
|
204
|
+
* @param {number} worldX - The world-space x coordinate
|
|
205
|
+
* @param {number} worldY - The world-space y coordinate
|
|
206
|
+
* @returns {{object: GameObject, instance: Instance|null}|null}
|
|
207
|
+
*/
|
|
208
|
+
getTopObjectAt(worldX, worldY) {
|
|
209
|
+
const objects = this.scene.objects;
|
|
210
|
+
let best = null;
|
|
211
|
+
let bestInstance = null;
|
|
212
|
+
let bestZ = -Infinity;
|
|
213
|
+
let bestIndex = -1;
|
|
214
|
+
|
|
215
|
+
for (let i = 0; i < objects.length; i++) {
|
|
216
|
+
const obj = objects[i];
|
|
217
|
+
if (!obj.isActive) continue;
|
|
218
|
+
|
|
219
|
+
let instanceHit = null;
|
|
220
|
+
if (obj.getComponent) {
|
|
221
|
+
const instancedTexture = obj.getComponent(InstancedTexture);
|
|
222
|
+
if (instancedTexture) {
|
|
223
|
+
instanceHit = instancedTexture.getInstanceAtPoint(worldX, worldY);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (!instanceHit && !this.isPointInObject(worldX, worldY, obj)) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const z = obj.transform.position.z;
|
|
232
|
+
if (z > bestZ || (z === bestZ && i > bestIndex)) {
|
|
233
|
+
best = obj;
|
|
234
|
+
bestInstance = instanceHit;
|
|
235
|
+
bestZ = z;
|
|
236
|
+
bestIndex = i;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return best ? { object: best, instance: bestInstance } : null;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* @method handleClick
|
|
245
|
+
* @description Handles a click event
|
|
246
|
+
* @param {MouseEvent} event - The mouse event
|
|
247
|
+
*/
|
|
248
|
+
handleClick(event) {
|
|
249
|
+
const { x: worldX, y: worldY } = this.screenToWorld(
|
|
250
|
+
event.clientX,
|
|
251
|
+
event.clientY
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
const hit = this.getTopObjectAt(worldX, worldY);
|
|
255
|
+
if (!hit) return;
|
|
256
|
+
|
|
257
|
+
if (hit.instance) {
|
|
258
|
+
hit.object
|
|
259
|
+
.getComponent(InstancedTexture)
|
|
260
|
+
.handleInstanceClick(event, worldX, worldY);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const listeners = this.clickListeners.get(hit.object.id);
|
|
265
|
+
if (listeners) {
|
|
266
|
+
listeners.forEach((func) => func(event, hit.object));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* @method removeClickEvent
|
|
272
|
+
* @description Removes a click event listener
|
|
273
|
+
* @param {GameObject} object - The object to remove the listener for
|
|
274
|
+
* @param {function} func - The function to remove
|
|
275
|
+
*/
|
|
276
|
+
removeClickEvent(object, func) {
|
|
277
|
+
if (this.clickListeners.has(object.id)) {
|
|
278
|
+
this.clickListeners.get(object.id).delete(func);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* @method isPointInObject
|
|
284
|
+
* @description Checks if a point is in an object
|
|
285
|
+
* @param {number} x - The x coordinate of the point
|
|
286
|
+
* @param {number} y - The y coordinate of the point
|
|
287
|
+
* @param {GameObject} object - The object to check
|
|
288
|
+
* @returns {boolean} - True if the point is in the object
|
|
289
|
+
*/
|
|
290
|
+
isPointInObject(x, y, object) {
|
|
291
|
+
const left = object.transform.position.x - object.transform.scale.x;
|
|
292
|
+
const right = object.transform.position.x + object.transform.scale.x;
|
|
293
|
+
const top = object.transform.position.y + object.transform.scale.y;
|
|
294
|
+
const bottom = object.transform.position.y - object.transform.scale.y;
|
|
295
|
+
return x >= left && x <= right && y >= bottom && y <= top;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* @method addHoverEvent
|
|
300
|
+
* @description Adds a hover event listener
|
|
301
|
+
* @param {GameObject} object - The object to listen for
|
|
302
|
+
* @param {function} enterFunc - The function to call when the object is hovered
|
|
303
|
+
* @param {function} leaveFunc - The function to call when the object is no longer hovered
|
|
304
|
+
*/
|
|
305
|
+
addHoverEvent(object, enterFunc, leaveFunc) {
|
|
306
|
+
if (!this.hoverListeners.has(object.id)) {
|
|
307
|
+
this.hoverListeners.set(object.id, {
|
|
308
|
+
enter: new Set(),
|
|
309
|
+
leave: new Set(),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
this.hoverListeners.get(object.id).enter.add(enterFunc);
|
|
313
|
+
this.hoverListeners.get(object.id).leave.add(leaveFunc);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* @method removeHoverEvent
|
|
318
|
+
* @description Removes a hover event listener
|
|
319
|
+
* @param {GameObject} object - The object to remove the listener for
|
|
320
|
+
* @param {function} enterFunc - The function to remove
|
|
321
|
+
* @param {function} leaveFunc - The function to remove
|
|
322
|
+
*/
|
|
323
|
+
removeHoverEvent(object, enterFunc, leaveFunc) {
|
|
324
|
+
if (this.hoverListeners.has(object.id)) {
|
|
325
|
+
const listeners = this.hoverListeners.get(object.id);
|
|
326
|
+
listeners.enter.delete(enterFunc);
|
|
327
|
+
listeners.leave.delete(leaveFunc);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* @method handleMouseDown
|
|
333
|
+
* @description Handles a mouse down event
|
|
334
|
+
* @param {MouseEvent} event - The mouse event
|
|
335
|
+
*/
|
|
336
|
+
handleMouseDown(event) {
|
|
337
|
+
if (event.button === 1) {
|
|
338
|
+
event.preventDefault();
|
|
339
|
+
this.isDragging = true;
|
|
340
|
+
this.dragStartX = event.clientX;
|
|
341
|
+
this.dragStartY = event.clientY;
|
|
342
|
+
this.initialCameraX = this.camera.transform.position.x;
|
|
343
|
+
this.initialCameraY = this.camera.transform.position.y;
|
|
344
|
+
this.canvas.style.cursor = "grabbing";
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* @method handleMouseUp
|
|
350
|
+
* @description Handles a mouse up event
|
|
351
|
+
* @param {MouseEvent} event - The mouse event
|
|
352
|
+
*/
|
|
353
|
+
handleMouseUp(event) {
|
|
354
|
+
if (event.button === 1 && this.isDragging) {
|
|
355
|
+
this.isDragging = false;
|
|
356
|
+
this.canvas.style.cursor = "default";
|
|
357
|
+
this.cameraWasMoved = true;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* @method handleMouseMove
|
|
363
|
+
* @description Handles a mouse move event
|
|
364
|
+
* @param {MouseEvent} event - The mouse event
|
|
365
|
+
*/
|
|
366
|
+
handleMouseMove(event) {
|
|
367
|
+
const { x: worldX, y: worldY } = this.screenToWorld(
|
|
368
|
+
event.clientX,
|
|
369
|
+
event.clientY
|
|
370
|
+
);
|
|
371
|
+
this.mousePosition.x = worldX;
|
|
372
|
+
this.mousePosition.y = worldY;
|
|
373
|
+
|
|
374
|
+
const hit = this.getTopObjectAt(worldX, worldY);
|
|
375
|
+
const hoveredObject = hit ? hit.object : null;
|
|
376
|
+
const hoveredInstance = hit ? hit.instance : null;
|
|
377
|
+
|
|
378
|
+
if (hoveredInstance !== this.lastHoveredInstance) {
|
|
379
|
+
if (this.lastHoveredInstance) {
|
|
380
|
+
const parent = this.lastHoveredInstance.parent;
|
|
381
|
+
if (parent && parent instanceof InstancedTexture) {
|
|
382
|
+
parent.handleInstanceHover(
|
|
383
|
+
event,
|
|
384
|
+
worldX,
|
|
385
|
+
worldY,
|
|
386
|
+
this.lastHoveredInstance
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
if (hoveredInstance) {
|
|
392
|
+
const parent = hoveredInstance.parent;
|
|
393
|
+
if (parent && parent instanceof InstancedTexture) {
|
|
394
|
+
parent.handleInstanceHover(
|
|
395
|
+
event,
|
|
396
|
+
worldX,
|
|
397
|
+
worldY,
|
|
398
|
+
this.lastHoveredInstance
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
this.lastHoveredInstance = hoveredInstance;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
if (hoveredObject !== this.lastHoveredObject) {
|
|
407
|
+
if (this.lastHoveredObject && this.lastHoveredObject.isActive) {
|
|
408
|
+
const leaveListeners = this.hoverListeners.get(
|
|
409
|
+
this.lastHoveredObject.id
|
|
410
|
+
);
|
|
411
|
+
if (leaveListeners) {
|
|
412
|
+
leaveListeners.leave.forEach((func) =>
|
|
413
|
+
func(event, this.lastHoveredObject)
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
if (hoveredObject && hoveredObject.isActive && !hoveredInstance) {
|
|
419
|
+
const enterListeners = this.hoverListeners.get(hoveredObject.id);
|
|
420
|
+
if (enterListeners) {
|
|
421
|
+
enterListeners.enter.forEach((func) => func(event, hoveredObject));
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
this.lastHoveredObject = hoveredObject;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* @method getMousePosition
|
|
431
|
+
* @description Returns the mouse position
|
|
432
|
+
* @returns {Object} - The mouse position
|
|
433
|
+
*/
|
|
434
|
+
getMousePosition() {
|
|
435
|
+
return this.mousePosition;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* @method wasCameraMoved
|
|
440
|
+
* @description Checks if the camera was moved
|
|
441
|
+
* @returns {boolean} - True if the camera was moved
|
|
442
|
+
*/
|
|
443
|
+
wasCameraMoved() {
|
|
444
|
+
return this.cameraWasMoved;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* @method resetCameraMoved
|
|
449
|
+
* @description Resets the camera moved flag
|
|
450
|
+
*/
|
|
451
|
+
resetCameraMoved() {
|
|
452
|
+
this.cameraWasMoved = false;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* @method changeScene
|
|
457
|
+
* @description Changes the scene
|
|
458
|
+
* @param {Scene} scene - The scene to change to
|
|
459
|
+
*/
|
|
460
|
+
changeScene(scene) {
|
|
461
|
+
if (scene instanceof Scene) {
|
|
462
|
+
this.scene = scene;
|
|
463
|
+
} else {
|
|
464
|
+
console.error(
|
|
465
|
+
"[EventManager] > Specified argument is not an instance of Scene class"
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* @method clean
|
|
472
|
+
* @description Cleans up the event manager
|
|
473
|
+
*/
|
|
474
|
+
clean() {
|
|
475
|
+
this.canvas.removeEventListener("click", this.boundHandleClick);
|
|
476
|
+
this.canvas.removeEventListener("mousedown", this.boundHandleMouseDown);
|
|
477
|
+
window.removeEventListener("mousemove", this.boundHandleMouseMove);
|
|
478
|
+
window.removeEventListener("mouseup", this.boundHandleMouseUp);
|
|
479
|
+
window.removeEventListener("keydown", this.boundHandleKeyDown);
|
|
480
|
+
window.removeEventListener("keyup", this.boundHandleKeyUp);
|
|
481
|
+
this.pressedKeys.clear();
|
|
482
|
+
this.keyDownListeners.clear();
|
|
483
|
+
this.lastHoveredObject = null;
|
|
484
|
+
this.lastHoveredInstance = null;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
export default EventManager;
|