melonjs 14.0.2 → 14.1.1

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 (219) hide show
  1. package/README.md +2 -0
  2. package/dist/melonjs.mjs/_virtual/_commonjsHelpers.js +10 -0
  3. package/dist/melonjs.mjs/_virtual/arraymultimap.js +10 -0
  4. package/dist/melonjs.mjs/_virtual/earcut.js +10 -0
  5. package/dist/melonjs.mjs/_virtual/howler.js +10 -0
  6. package/dist/melonjs.mjs/_virtual/index.js +10 -0
  7. package/dist/melonjs.mjs/_virtual/index2.js +10 -0
  8. package/dist/melonjs.mjs/_virtual/multimap.js +10 -0
  9. package/dist/melonjs.mjs/_virtual/setmultimap.js +10 -0
  10. package/dist/melonjs.mjs/application/application.js +238 -0
  11. package/dist/melonjs.mjs/audio/audio.js +536 -0
  12. package/dist/melonjs.mjs/camera/camera2d.js +731 -0
  13. package/dist/melonjs.mjs/entity/entity.js +247 -0
  14. package/dist/melonjs.mjs/game.js +29 -0
  15. package/dist/melonjs.mjs/geometries/ellipse.js +274 -0
  16. package/dist/melonjs.mjs/geometries/line.js +115 -0
  17. package/dist/melonjs.mjs/geometries/path2d.js +318 -0
  18. package/dist/melonjs.mjs/geometries/point.js +88 -0
  19. package/dist/melonjs.mjs/geometries/poly.js +498 -0
  20. package/dist/melonjs.mjs/geometries/rectangle.js +374 -0
  21. package/dist/melonjs.mjs/geometries/roundrect.js +167 -0
  22. package/dist/melonjs.mjs/index.js +248 -0
  23. package/dist/melonjs.mjs/input/gamepad.js +501 -0
  24. package/dist/melonjs.mjs/input/input.js +26 -0
  25. package/dist/melonjs.mjs/input/keyboard.js +470 -0
  26. package/dist/melonjs.mjs/input/pointer.js +393 -0
  27. package/dist/melonjs.mjs/input/pointerevent.js +818 -0
  28. package/dist/melonjs.mjs/lang/deprecated.js +157 -0
  29. package/dist/melonjs.mjs/level/level.js +297 -0
  30. package/dist/melonjs.mjs/level/tiled/TMXGroup.js +141 -0
  31. package/dist/melonjs.mjs/level/tiled/TMXLayer.js +446 -0
  32. package/dist/melonjs.mjs/level/tiled/TMXObject.js +355 -0
  33. package/dist/melonjs.mjs/level/tiled/TMXTile.js +193 -0
  34. package/dist/melonjs.mjs/level/tiled/TMXTileMap.js +636 -0
  35. package/dist/melonjs.mjs/level/tiled/TMXTileset.js +309 -0
  36. package/dist/melonjs.mjs/level/tiled/TMXTilesetGroup.js +81 -0
  37. package/dist/melonjs.mjs/level/tiled/TMXUtils.js +367 -0
  38. package/dist/melonjs.mjs/level/tiled/renderer/TMXHexagonalRenderer.js +504 -0
  39. package/dist/melonjs.mjs/level/tiled/renderer/TMXIsometricRenderer.js +218 -0
  40. package/dist/melonjs.mjs/level/tiled/renderer/TMXOrthogonalRenderer.js +155 -0
  41. package/dist/melonjs.mjs/level/tiled/renderer/TMXRenderer.js +124 -0
  42. package/dist/melonjs.mjs/level/tiled/renderer/TMXStaggeredRenderer.js +107 -0
  43. package/dist/melonjs.mjs/loader/loader.js +801 -0
  44. package/dist/melonjs.mjs/loader/loadingscreen.js +120 -0
  45. package/dist/melonjs.mjs/loader/melonjs_logo.png.js +11 -0
  46. package/dist/melonjs.mjs/math/color.js +616 -0
  47. package/dist/melonjs.mjs/math/math.js +218 -0
  48. package/dist/melonjs.mjs/math/matrix2.js +501 -0
  49. package/dist/melonjs.mjs/math/matrix3.js +679 -0
  50. package/dist/melonjs.mjs/math/observable_vector2.js +469 -0
  51. package/dist/melonjs.mjs/math/observable_vector3.js +559 -0
  52. package/dist/melonjs.mjs/math/vector2.js +526 -0
  53. package/dist/melonjs.mjs/math/vector3.js +567 -0
  54. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/arraymultimap.js +73 -0
  55. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/index.js +21 -0
  56. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/multimap.js +324 -0
  57. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/setmultimap.js +69 -0
  58. package/dist/melonjs.mjs/node_modules/earcut/src/earcut.js +691 -0
  59. package/dist/melonjs.mjs/node_modules/eventemitter3/index.js +350 -0
  60. package/dist/melonjs.mjs/node_modules/howler/dist/howler.js +3241 -0
  61. package/dist/melonjs.mjs/particles/emitter.js +265 -0
  62. package/dist/melonjs.mjs/particles/particle.js +186 -0
  63. package/dist/melonjs.mjs/particles/settings.js +319 -0
  64. package/dist/melonjs.mjs/physics/body.js +702 -0
  65. package/dist/melonjs.mjs/physics/bounds.js +459 -0
  66. package/dist/melonjs.mjs/physics/collision.js +132 -0
  67. package/dist/melonjs.mjs/physics/detector.js +194 -0
  68. package/dist/melonjs.mjs/physics/quadtree.js +394 -0
  69. package/dist/melonjs.mjs/physics/response.js +57 -0
  70. package/dist/melonjs.mjs/physics/sat.js +483 -0
  71. package/dist/melonjs.mjs/physics/world.js +219 -0
  72. package/dist/melonjs.mjs/plugin/plugin.js +141 -0
  73. package/dist/melonjs.mjs/renderable/collectable.js +60 -0
  74. package/dist/melonjs.mjs/renderable/colorlayer.js +78 -0
  75. package/dist/melonjs.mjs/renderable/container.js +1016 -0
  76. package/dist/melonjs.mjs/renderable/dragndrop.js +224 -0
  77. package/dist/melonjs.mjs/renderable/imagelayer.js +305 -0
  78. package/dist/melonjs.mjs/renderable/light2d.js +155 -0
  79. package/dist/melonjs.mjs/renderable/nineslicesprite.js +246 -0
  80. package/dist/melonjs.mjs/renderable/renderable.js +781 -0
  81. package/dist/melonjs.mjs/renderable/sprite.js +653 -0
  82. package/dist/melonjs.mjs/renderable/trigger.js +156 -0
  83. package/dist/melonjs.mjs/renderable/ui/uibaseelement.js +212 -0
  84. package/dist/melonjs.mjs/renderable/ui/uispriteelement.js +225 -0
  85. package/dist/melonjs.mjs/renderable/ui/uitextbutton.js +127 -0
  86. package/dist/melonjs.mjs/state/stage.js +236 -0
  87. package/dist/melonjs.mjs/state/state.js +596 -0
  88. package/dist/melonjs.mjs/system/device.js +909 -0
  89. package/dist/melonjs.mjs/system/dom.js +78 -0
  90. package/dist/melonjs.mjs/system/event.js +537 -0
  91. package/dist/melonjs.mjs/system/platform.js +41 -0
  92. package/dist/melonjs.mjs/system/pooling.js +209 -0
  93. package/dist/melonjs.mjs/system/save.js +157 -0
  94. package/dist/melonjs.mjs/system/timer.js +286 -0
  95. package/dist/melonjs.mjs/text/bitmaptext.js +363 -0
  96. package/dist/melonjs.mjs/text/bitmaptextdata.js +198 -0
  97. package/dist/melonjs.mjs/text/glyph.js +65 -0
  98. package/dist/melonjs.mjs/text/text.js +452 -0
  99. package/dist/melonjs.mjs/text/textmetrics.js +175 -0
  100. package/dist/melonjs.mjs/text/textstyle.js +23 -0
  101. package/dist/melonjs.mjs/tweens/easing.js +336 -0
  102. package/dist/melonjs.mjs/tweens/interpolation.js +112 -0
  103. package/dist/melonjs.mjs/tweens/tween.js +479 -0
  104. package/dist/melonjs.mjs/utils/agent.js +76 -0
  105. package/dist/melonjs.mjs/utils/array.js +63 -0
  106. package/dist/melonjs.mjs/utils/file.js +42 -0
  107. package/dist/melonjs.mjs/utils/function.js +70 -0
  108. package/dist/melonjs.mjs/utils/string.js +82 -0
  109. package/dist/melonjs.mjs/utils/utils.js +173 -0
  110. package/dist/melonjs.mjs/video/canvas/canvas_renderer.js +806 -0
  111. package/dist/melonjs.mjs/video/renderer.js +410 -0
  112. package/dist/melonjs.mjs/video/texture/atlas.js +519 -0
  113. package/dist/melonjs.mjs/video/texture/cache.js +143 -0
  114. package/dist/melonjs.mjs/video/texture/canvas_texture.js +144 -0
  115. package/dist/melonjs.mjs/video/video.js +462 -0
  116. package/dist/melonjs.mjs/video/webgl/buffer/vertex.js +142 -0
  117. package/dist/melonjs.mjs/video/webgl/glshader.js +167 -0
  118. package/dist/melonjs.mjs/video/webgl/shaders/primitive.frag.js +10 -0
  119. package/dist/melonjs.mjs/video/webgl/shaders/primitive.vert.js +10 -0
  120. package/dist/melonjs.mjs/video/webgl/shaders/quad.frag.js +10 -0
  121. package/dist/melonjs.mjs/video/webgl/shaders/quad.vert.js +10 -0
  122. package/dist/melonjs.mjs/video/webgl/utils/attributes.js +25 -0
  123. package/dist/melonjs.mjs/video/webgl/utils/precision.js +20 -0
  124. package/dist/melonjs.mjs/video/webgl/utils/program.js +67 -0
  125. package/dist/melonjs.mjs/video/webgl/utils/string.js +25 -0
  126. package/dist/melonjs.mjs/video/webgl/utils/uniforms.js +92 -0
  127. package/dist/melonjs.mjs/video/webgl/webgl_compositor.js +494 -0
  128. package/dist/melonjs.mjs/video/webgl/webgl_renderer.js +1035 -0
  129. package/dist/melonjs.module.d.ts +1298 -1359
  130. package/dist/melonjs.module.js +2072 -3520
  131. package/package.json +21 -16
  132. package/src/application/application.js +4 -5
  133. package/src/audio/audio.js +32 -32
  134. package/src/camera/camera2d.js +32 -33
  135. package/src/entity/entity.js +18 -19
  136. package/src/geometries/ellipse.js +17 -18
  137. package/src/geometries/line.js +6 -7
  138. package/src/geometries/path2d.js +33 -34
  139. package/src/geometries/point.js +1 -2
  140. package/src/geometries/poly.js +16 -18
  141. package/src/geometries/rectangle.js +19 -20
  142. package/src/geometries/roundrect.js +9 -10
  143. package/src/input/gamepad.js +15 -15
  144. package/src/input/keyboard.js +12 -12
  145. package/src/input/pointer.js +6 -6
  146. package/src/input/pointerevent.js +12 -12
  147. package/src/lang/deprecated.js +12 -12
  148. package/src/level/level.js +25 -25
  149. package/src/level/tiled/TMXLayer.js +23 -24
  150. package/src/level/tiled/TMXTile.js +6 -7
  151. package/src/level/tiled/TMXTileMap.js +8 -10
  152. package/src/level/tiled/TMXTileset.js +3 -4
  153. package/src/level/tiled/TMXTilesetGroup.js +1 -2
  154. package/src/level/tiled/TMXUtils.js +5 -5
  155. package/src/level/tiled/renderer/TMXHexagonalRenderer.js +3 -4
  156. package/src/level/tiled/renderer/TMXIsometricRenderer.js +3 -4
  157. package/src/level/tiled/renderer/TMXOrthogonalRenderer.js +2 -3
  158. package/src/level/tiled/renderer/TMXRenderer.js +20 -21
  159. package/src/level/tiled/renderer/TMXStaggeredRenderer.js +1 -2
  160. package/src/loader/loader.js +20 -20
  161. package/src/math/color.js +21 -22
  162. package/src/math/math.js +16 -16
  163. package/src/math/matrix2.js +17 -18
  164. package/src/math/matrix3.js +26 -27
  165. package/src/math/observable_vector2.js +15 -16
  166. package/src/math/observable_vector3.js +17 -18
  167. package/src/math/vector2.js +10 -11
  168. package/src/math/vector3.js +11 -12
  169. package/src/particles/emitter.js +7 -8
  170. package/src/particles/particle.js +3 -4
  171. package/src/physics/body.js +29 -30
  172. package/src/physics/bounds.js +10 -10
  173. package/src/physics/collision.js +2 -2
  174. package/src/physics/detector.js +6 -6
  175. package/src/physics/quadtree.js +18 -23
  176. package/src/physics/sat.js +31 -31
  177. package/src/physics/world.js +6 -7
  178. package/src/plugin/plugin.js +5 -5
  179. package/src/renderable/collectable.js +4 -6
  180. package/src/renderable/colorlayer.js +6 -8
  181. package/src/renderable/container.js +25 -27
  182. package/src/renderable/dragndrop.js +14 -14
  183. package/src/renderable/imagelayer.js +14 -15
  184. package/src/renderable/light2d.js +4 -5
  185. package/src/renderable/nineslicesprite.js +17 -18
  186. package/src/renderable/renderable.js +26 -28
  187. package/src/renderable/sprite.js +29 -30
  188. package/src/renderable/trigger.js +16 -17
  189. package/src/renderable/ui/uibaseelement.js +8 -9
  190. package/src/renderable/ui/uispriteelement.js +8 -8
  191. package/src/renderable/ui/uitextbutton.js +15 -15
  192. package/src/state/stage.js +8 -9
  193. package/src/state/state.js +17 -17
  194. package/src/system/device.js +11 -11
  195. package/src/system/event.js +10 -10
  196. package/src/system/pooling.js +9 -9
  197. package/src/system/save.js +2 -2
  198. package/src/system/timer.js +10 -10
  199. package/src/text/bitmaptext.js +19 -20
  200. package/src/text/bitmaptextdata.js +3 -4
  201. package/src/text/glyph.js +1 -2
  202. package/src/text/text.js +24 -25
  203. package/src/text/textmetrics.js +9 -10
  204. package/src/tweens/tween.js +20 -21
  205. package/src/utils/agent.js +5 -5
  206. package/src/utils/array.js +4 -4
  207. package/src/utils/file.js +2 -2
  208. package/src/utils/function.js +6 -6
  209. package/src/utils/string.js +5 -5
  210. package/src/utils/utils.js +4 -4
  211. package/src/video/canvas/canvas_renderer.js +72 -73
  212. package/src/video/renderer.js +27 -28
  213. package/src/video/texture/atlas.js +22 -22
  214. package/src/video/texture/canvas_texture.js +9 -9
  215. package/src/video/video.js +17 -17
  216. package/src/video/webgl/buffer/vertex.js +1 -2
  217. package/src/video/webgl/glshader.js +12 -12
  218. package/src/video/webgl/webgl_compositor.js +42 -43
  219. package/src/video/webgl/webgl_renderer.js +76 -77
@@ -0,0 +1,818 @@
1
+ /*!
2
+ * melonJS Game Engine - v14.1.1
3
+ * http://www.melonjs.org
4
+ * melonjs is licensed under the MIT License.
5
+ * http://www.opensource.org/licenses/mit-license
6
+ * @copyright (C) 2011 - 2022 Olivier Biot (AltByte Pte Ltd)
7
+ */
8
+ import { preventDefault } from './input.js';
9
+ import { getBindingKey, triggerKeyEvent } from './keyboard.js';
10
+ import { renderer, scaleRatio, getParent } from '../video/video.js';
11
+ import { throttle } from '../utils/function.js';
12
+ import { remove } from '../utils/array.js';
13
+ import { emit, POINTERLOCKCHANGE, POINTERMOVE } from '../system/event.js';
14
+ import timer from '../system/timer.js';
15
+ import pool from '../system/pooling.js';
16
+ import { getElementBounds, hasPointerLockSupport, maxTouchPoints, pointerEvent, touch, focus, touchEvent } from '../system/device.js';
17
+ import Pointer from './pointer.js';
18
+ import Rect from '../geometries/rectangle.js';
19
+ import Container from '../renderable/container.js';
20
+ import game from '../game.js';
21
+
22
+ /**
23
+ * A pool of `Pointer` objects to cache pointer/touch event coordinates.
24
+ * @type {Array.<Vector2d>}
25
+ * @ignore
26
+ */
27
+ var T_POINTERS = [];
28
+
29
+ // list of registered Event handlers
30
+ var eventHandlers = new Map();
31
+
32
+ // a cache rect represeting the current pointer area
33
+ var currentPointer;
34
+
35
+ // some useful flags
36
+ var pointerInitialized = false;
37
+
38
+ // Track last event timestamp to prevent firing events out of order
39
+ var lastTimeStamp = 0;
40
+
41
+ // "active" list of supported events
42
+ var activeEventList = [];
43
+
44
+ // internal constants
45
+ const WHEEL = ["wheel"];
46
+ const POINTER_MOVE = ["pointermove", "mousemove", "touchmove"];
47
+ const POINTER_DOWN = ["pointerdown", "mousedown", "touchstart"];
48
+ const POINTER_UP = ["pointerup", "mouseup", "touchend"];
49
+ const POINTER_CANCEL = ["pointercancel", "mousecancel", "touchcancel"];
50
+ const POINTER_ENTER = ["pointerenter", "mouseenter", "touchenter"];
51
+ const POINTER_OVER = ["pointerover", "mouseover", "touchover"];
52
+ const POINTER_LEAVE = ["pointerleave", "mouseleave", "touchleave"];
53
+
54
+ // list of standard pointer event type
55
+ const pointerEventList = [
56
+ WHEEL[0],
57
+ POINTER_MOVE[0],
58
+ POINTER_DOWN[0],
59
+ POINTER_UP[0],
60
+ POINTER_CANCEL[0],
61
+ POINTER_ENTER[0],
62
+ POINTER_OVER[0],
63
+ POINTER_LEAVE[0]
64
+ ];
65
+
66
+ // legacy mouse event type
67
+ const mouseEventList = [
68
+ WHEEL[0],
69
+ POINTER_MOVE[1],
70
+ POINTER_DOWN[1],
71
+ POINTER_UP[1],
72
+ POINTER_CANCEL[1],
73
+ POINTER_ENTER[1],
74
+ POINTER_OVER[1],
75
+ POINTER_LEAVE[1]
76
+ ];
77
+
78
+ // iOS style touch event type
79
+ const touchEventList = [
80
+ POINTER_MOVE[2],
81
+ POINTER_DOWN[2],
82
+ POINTER_UP[2],
83
+ POINTER_CANCEL[2],
84
+ POINTER_ENTER[2],
85
+ POINTER_OVER[2],
86
+ POINTER_LEAVE[2]
87
+ ];
88
+
89
+ const pointerEventMap = {
90
+ wheel : WHEEL,
91
+ pointermove: POINTER_MOVE,
92
+ pointerdown: POINTER_DOWN,
93
+ pointerup: POINTER_UP,
94
+ pointercancel: POINTER_CANCEL,
95
+ pointerenter: POINTER_ENTER,
96
+ pointerover: POINTER_OVER,
97
+ pointerleave: POINTER_LEAVE
98
+ };
99
+
100
+ /**
101
+ * Array of normalized events (mouse, touch, pointer)
102
+ * @ignore
103
+ */
104
+ var normalizedEvents = [];
105
+
106
+ /**
107
+ * addEventListerner for the specified event list and callback
108
+ * @ignore
109
+ */
110
+ function registerEventListener(eventList, callback) {
111
+ for (var x = 0; x < eventList.length; x++) {
112
+ if (POINTER_MOVE.indexOf(eventList[x]) === -1) {
113
+ pointerEventTarget.addEventListener(eventList[x], callback, { passive: (preventDefault === false) });
114
+ }
115
+ }
116
+ }
117
+
118
+ /**
119
+ * enable pointer event (Pointer/Mouse/Touch)
120
+ * @ignore
121
+ */
122
+ function enablePointerEvent() {
123
+ if (!pointerInitialized) {
124
+
125
+ // the current pointer area
126
+ currentPointer = new Rect(0, 0, 1, 1);
127
+
128
+ // instantiate a pool of pointer catched
129
+ for (var v = 0; v < maxTouchPoints; v++) {
130
+ T_POINTERS.push(new Pointer());
131
+ }
132
+
133
+ if (pointerEventTarget === null) {
134
+ // default pointer event target
135
+ pointerEventTarget = renderer.getCanvas();
136
+ }
137
+
138
+ if (pointerEvent) {
139
+ // standard Pointer Events
140
+ activeEventList = pointerEventList;
141
+ } else {
142
+ // Regular Mouse events
143
+ activeEventList = mouseEventList;
144
+ }
145
+ if (touch && !pointerEvent) {
146
+ // touch event on mobile devices
147
+ activeEventList = activeEventList.concat(touchEventList);
148
+ }
149
+ registerEventListener(activeEventList, onPointerEvent);
150
+
151
+ // set the PointerMove/touchMove/MouseMove event
152
+ if (typeof(throttlingInterval) === "undefined") {
153
+ // set the default value
154
+ throttlingInterval = ~~(1000 / timer.maxfps);
155
+ }
156
+
157
+ {
158
+ focus();
159
+ pointerEventTarget.addEventListener(
160
+ activeEventList[2], // MOUSE/POINTER DOWN
161
+ () => {
162
+ focus();
163
+ },
164
+ { passive: (preventDefault === false) }
165
+ );
166
+ }
167
+
168
+ // if time interval <= 16, disable the feature
169
+ var i;
170
+ var events = findAllActiveEvents(activeEventList, POINTER_MOVE);
171
+ if (throttlingInterval < 17) {
172
+ for (i = 0; i < events.length; i++) {
173
+ if (activeEventList.indexOf(events[i]) !== -1) {
174
+ pointerEventTarget.addEventListener(
175
+ events[i],
176
+ onMoveEvent,
177
+ { passive: true } // do not preventDefault on Move events
178
+ );
179
+ }
180
+
181
+ }
182
+ }
183
+ else {
184
+ for (i = 0; i < events.length; i++) {
185
+ if (activeEventList.indexOf(events[i]) !== -1) {
186
+ pointerEventTarget.addEventListener(
187
+ events[i],
188
+ throttle(
189
+ onMoveEvent,
190
+ throttlingInterval,
191
+ false
192
+ ),
193
+ { passive: true } // do not preventDefault on Move events
194
+ );
195
+ }
196
+ }
197
+ }
198
+ // disable all gesture by default
199
+ setTouchAction(pointerEventTarget);
200
+
201
+ // set a on change listener on pointerlock if supported
202
+ if (hasPointerLockSupport) {
203
+ document.addEventListener("pointerlockchange", () => {
204
+ // change the locked status accordingly
205
+ locked = document.pointerLockElement === getParent();
206
+ // emit the corresponding internal event
207
+ emit(POINTERLOCKCHANGE, locked);
208
+ }, true);
209
+ }
210
+
211
+ // all done !
212
+ pointerInitialized = true;
213
+ }
214
+ }
215
+
216
+ /**
217
+ * @ignore
218
+ */
219
+ function findActiveEvent(activeEventList, eventTypes) {
220
+ for (var i = 0; i < eventTypes.length; i++) {
221
+ var event = activeEventList.indexOf(eventTypes[i]);
222
+ if (event !== -1) {
223
+ return eventTypes[i];
224
+ }
225
+ }
226
+ }
227
+
228
+ /**
229
+ * @ignore
230
+ */
231
+ function findAllActiveEvents(activeEventList, eventTypes) {
232
+ var events = [];
233
+ for (var i = 0; i < eventTypes.length; i++) {
234
+ var event = activeEventList.indexOf(eventTypes[i]);
235
+ if (event !== -1) {
236
+ events.push(eventTypes[i]);
237
+ }
238
+ }
239
+
240
+ return events;
241
+ }
242
+
243
+ /**
244
+ * @ignore
245
+ */
246
+ function triggerEvent(handlers, type, pointer, pointerId) {
247
+ var callback;
248
+ if (handlers.callbacks[type]) {
249
+ handlers.pointerId = pointerId;
250
+ for (var i = handlers.callbacks[type].length - 1; (i >= 0) && (callback = handlers.callbacks[type][i]); i--) {
251
+ if (callback(pointer) === false) {
252
+ // stop propagating the event if return false
253
+ return true;
254
+ }
255
+ }
256
+ }
257
+ return false;
258
+ }
259
+
260
+ /**
261
+ * propagate events to registered objects
262
+ * @ignore
263
+ */
264
+ function dispatchEvent(normalizedEvents) {
265
+ var handled = false;
266
+
267
+ while (normalizedEvents.length > 0) {
268
+
269
+ // keep a reference to the last item
270
+ var pointer = normalizedEvents.pop();
271
+ // and put it back into our cache
272
+ T_POINTERS.push(pointer);
273
+
274
+ // Do not fire older touch events (not required for PointerEvent type)
275
+ if (pointer.isNormalized === true && typeof(pointer.event.timeStamp) !== "undefined") {
276
+ if (pointer.event.timeStamp < lastTimeStamp) {
277
+ continue;
278
+ }
279
+ lastTimeStamp = pointer.event.timeStamp;
280
+ }
281
+
282
+ currentPointer.setShape(
283
+ pointer.gameWorldX,
284
+ pointer.gameWorldY,
285
+ pointer.width,
286
+ pointer.height
287
+ );
288
+
289
+ // trigger a global event for pointer move
290
+ if (POINTER_MOVE.includes(pointer.type)) {
291
+ pointer.gameX = pointer.gameLocalX = pointer.gameScreenX;
292
+ pointer.gameY = pointer.gameLocalY = pointer.gameScreenY;
293
+ emit(POINTERMOVE, pointer);
294
+ }
295
+
296
+ // fetch valid candiates from the game world container
297
+ var candidates = game.world.broadphase.retrieve(currentPointer, Container.prototype._sortReverseZ);
298
+
299
+ // add the main game viewport to the list of candidates
300
+ candidates = candidates.concat([ game.viewport ]);
301
+
302
+ for (var c = candidates.length, candidate; c--, (candidate = candidates[c]);) {
303
+ if (eventHandlers.has(candidate) && (candidate.isKinematic !== true)) {
304
+ var handlers = eventHandlers.get(candidate);
305
+ var region = handlers.region;
306
+ var ancestor = region.ancestor;
307
+ var bounds = region.getBounds();
308
+ var eventInBounds = false;
309
+
310
+ if (region.isFloating === true) {
311
+ pointer.gameX = pointer.gameLocalX = pointer.gameScreenX;
312
+ pointer.gameY = pointer.gameLocalY = pointer.gameScreenY;
313
+ } else {
314
+ pointer.gameX = pointer.gameLocalX = pointer.gameWorldX;
315
+ pointer.gameY = pointer.gameLocalY = pointer.gameWorldY;
316
+ }
317
+
318
+ // adjust gameLocalX to specify coordinates
319
+ // within the region ancestor container
320
+ if (typeof ancestor !== "undefined") {
321
+ var parentBounds = ancestor.getBounds();
322
+ pointer.gameLocalX = pointer.gameX - parentBounds.x;
323
+ pointer.gameLocalY = pointer.gameY - parentBounds.y;
324
+ }
325
+
326
+ var gameX = pointer.gameX;
327
+ var gameY = pointer.gameY;
328
+
329
+ // apply inverse transformation for renderable
330
+ if (typeof region.currentTransform !== "undefined") {
331
+ if (!region.currentTransform.isIdentity()) {
332
+ var invV = region.currentTransform.applyInverse(
333
+ pool.pull("Vector2d", gameX, gameY)
334
+ );
335
+ gameX = invV.x;
336
+ gameY = invV.y;
337
+ pool.push(invV);
338
+ }
339
+ }
340
+ eventInBounds = bounds.contains(gameX, gameY);
341
+
342
+ switch (pointer.type) {
343
+ case POINTER_MOVE[0]:
344
+ case POINTER_MOVE[1]:
345
+ case POINTER_MOVE[2]:
346
+ case POINTER_MOVE[3]:
347
+ // moved out of bounds: trigger the POINTER_LEAVE callbacks
348
+ if (handlers.pointerId === pointer.pointerId && !eventInBounds) {
349
+ if (triggerEvent(handlers, findActiveEvent(activeEventList, POINTER_LEAVE), pointer, null)) {
350
+ handled = true;
351
+ break;
352
+ }
353
+ }
354
+ // no pointer & moved inside of bounds: trigger the POINTER_ENTER callbacks
355
+ else if (handlers.pointerId === null && eventInBounds) {
356
+ if (triggerEvent(handlers, findActiveEvent(activeEventList, POINTER_ENTER), pointer, pointer.pointerId)) {
357
+ handled = true;
358
+ break;
359
+ }
360
+ }
361
+
362
+ // trigger the POINTER_MOVE callbacks
363
+ if (eventInBounds && triggerEvent(handlers, pointer.type, pointer, pointer.pointerId)) {
364
+ handled = true;
365
+ break;
366
+ }
367
+ break;
368
+
369
+ case POINTER_UP[0]:
370
+ case POINTER_UP[1]:
371
+ case POINTER_UP[2]:
372
+ case POINTER_UP[3]:
373
+ // pointer defined & inside of bounds: trigger the POINTER_UP callback
374
+ if (handlers.pointerId === pointer.pointerId && eventInBounds) {
375
+ // trigger the corresponding callback
376
+ if (triggerEvent(handlers, pointer.type, pointer, null)) {
377
+ handled = true;
378
+ break;
379
+ }
380
+ }
381
+ break;
382
+
383
+ case POINTER_CANCEL[0]:
384
+ case POINTER_CANCEL[1]:
385
+ case POINTER_CANCEL[2]:
386
+ case POINTER_CANCEL[3]:
387
+ // pointer defined: trigger the POINTER_CANCEL callback
388
+ if (handlers.pointerId === pointer.pointerId) {
389
+ // trigger the corresponding callback
390
+ if (triggerEvent(handlers, pointer.type, pointer, null)) {
391
+ handled = true;
392
+ break;
393
+ }
394
+ }
395
+ break;
396
+
397
+ default:
398
+ // event inside of bounds: trigger the POINTER_DOWN or WHEEL callback
399
+ if (eventInBounds) {
400
+ // trigger the corresponding callback
401
+ if (triggerEvent(handlers, pointer.type, pointer, pointer.pointerId)) {
402
+ handled = true;
403
+ break;
404
+ }
405
+ }
406
+ break;
407
+ }
408
+ }
409
+ if (handled === true) {
410
+ // stop iterating through this list of candidates
411
+ break;
412
+ }
413
+ }
414
+ }
415
+ return handled;
416
+ }
417
+
418
+ /**
419
+ * translate event coordinates
420
+ * @ignore
421
+ */
422
+ function normalizeEvent(originalEvent) {
423
+ var _pointer;
424
+
425
+ // PointerEvent or standard Mouse event
426
+ if (touchEvent && originalEvent.changedTouches) {
427
+ // iOS/Android Touch event
428
+ for (var i = 0, l = originalEvent.changedTouches.length; i < l; i++) {
429
+ var touchEvent$1 = originalEvent.changedTouches[i];
430
+ _pointer = T_POINTERS.pop();
431
+ _pointer.setEvent(
432
+ originalEvent,
433
+ touchEvent$1.pageX,
434
+ touchEvent$1.pageY,
435
+ touchEvent$1.clientX,
436
+ touchEvent$1.clientY,
437
+ touchEvent$1.identifier
438
+ );
439
+ normalizedEvents.push(_pointer);
440
+ }
441
+ } else {
442
+ // Mouse or PointerEvent
443
+ _pointer = T_POINTERS.pop();
444
+ _pointer.setEvent(
445
+ originalEvent,
446
+ originalEvent.pageX,
447
+ originalEvent.pageY,
448
+ originalEvent.clientX,
449
+ originalEvent.clientY,
450
+ originalEvent.pointerId
451
+ );
452
+ normalizedEvents.push(_pointer);
453
+ }
454
+
455
+ // if event.isPrimary is defined and false, return
456
+ if (originalEvent.isPrimary === false) {
457
+ return normalizedEvents;
458
+ }
459
+
460
+ // else use the first entry to simulate mouse event
461
+ normalizedEvents[0].isPrimary = true;
462
+ Object.assign(pointer, normalizedEvents[0]);
463
+
464
+ return normalizedEvents;
465
+ }
466
+
467
+ /**
468
+ * mouse/touch/pointer event management (move)
469
+ * @ignore
470
+ */
471
+ function onMoveEvent(e) {
472
+ // dispatch mouse event to registered object
473
+ dispatchEvent(normalizeEvent(e));
474
+ // do not prevent default on moveEvent :
475
+ }
476
+
477
+ /**
478
+ * mouse/touch/pointer event management (start/down, end/up)
479
+ * @ignore
480
+ */
481
+ function onPointerEvent(e) {
482
+ // normalize eventTypes
483
+ normalizeEvent(e);
484
+
485
+ // remember/use the first "primary" normalized event for pointer.bind
486
+ var button = normalizedEvents[0].button;
487
+
488
+ // dispatch event to registered objects
489
+ if (dispatchEvent(normalizedEvents) || e.type === "wheel") {
490
+ // always preventDefault for wheel event (?legacy code/behavior?)
491
+ {
492
+ e.preventDefault();
493
+ }
494
+ }
495
+
496
+ var keycode = pointer.bind[button];
497
+
498
+ // check if mapped to a key
499
+ if (keycode) {
500
+ triggerKeyEvent(keycode, POINTER_DOWN.includes(e.type), button + 1);
501
+ }
502
+ }
503
+
504
+ /*
505
+ * PUBLIC STUFF
506
+ */
507
+
508
+ /**
509
+ * the default target element for pointer events (usually the canvas element in which the game is rendered)
510
+ * @public
511
+ * @type {EventTarget}
512
+ * @name pointerEventTarget
513
+ * @memberof input
514
+ */
515
+ var pointerEventTarget = null;
516
+
517
+ /**
518
+ * Pointer information (current position and size)
519
+ * @public
520
+ * @type {Rect}
521
+ * @name pointer
522
+ * @memberof input
523
+ */
524
+ var pointer = new Pointer(0, 0, 1, 1);
525
+
526
+
527
+ /**
528
+ * indicates if the pointer is currently locked
529
+ * @public
530
+ * @type {boolean}
531
+ * @name locked
532
+ * @memberof input
533
+ */
534
+ var locked = false;
535
+
536
+ /**
537
+ * time interval for event throttling in milliseconds<br>
538
+ * default value : "1000/me.timer.maxfps" ms<br>
539
+ * set to 0 ms to disable the feature
540
+ * @public
541
+ * @type {number}
542
+ * @name throttlingInterval
543
+ * @memberof input
544
+ */
545
+ var throttlingInterval;
546
+
547
+ /**
548
+ * Translate the specified x and y values from the global (absolute)
549
+ * coordinate to local (viewport) relative coordinate.
550
+ * @name globalToLocal
551
+ * @memberof input
552
+ * @public
553
+ * @param {number} x - the global x coordinate to be translated.
554
+ * @param {number} y - the global y coordinate to be translated.
555
+ * @param {Vector2d} [v] - an optional vector object where to set the translated coordinates
556
+ * @returns {Vector2d} A vector object with the corresponding translated coordinates
557
+ * @example
558
+ * onMouseEvent : function (pointer) {
559
+ * // convert the given into local (viewport) relative coordinates
560
+ * var pos = me.input.globalToLocal(pointer.clientX, pointer.clientY);
561
+ * // do something with pos !
562
+ * };
563
+ */
564
+ function globalToLocal(x, y, v) {
565
+ v = v || pool.pull("Vector2d");
566
+ var rect = getElementBounds(renderer.getCanvas());
567
+ var pixelRatio = globalThis.devicePixelRatio || 1;
568
+ x -= rect.left + (globalThis.pageXOffset || 0);
569
+ y -= rect.top + (globalThis.pageYOffset || 0);
570
+ var scale = scaleRatio;
571
+ if (scale.x !== 1.0 || scale.y !== 1.0) {
572
+ x /= scale.x;
573
+ y /= scale.y;
574
+ }
575
+ return v.set(x * pixelRatio, y * pixelRatio);
576
+ }
577
+
578
+ /**
579
+ * enable/disable all gestures on the given element.<br>
580
+ * by default melonJS will disable browser handling of all panning and zooming gestures.
581
+ * @name setTouchAction
582
+ * @memberof input
583
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action
584
+ * @public
585
+ * @param {HTMLCanvasElement} element
586
+ * @param {string} [value="none"]
587
+ */
588
+ function setTouchAction(element, value) {
589
+ element.style["touch-action"] = value || "none";
590
+ }
591
+
592
+ /**
593
+ * Associate a pointer event to a keycode<br>
594
+ * Left button – 0
595
+ * Middle button – 1
596
+ * Right button – 2
597
+ * @name bindPointer
598
+ * @memberof input
599
+ * @public
600
+ * @param {number} [button=input.pointer.LEFT] - (accordingly to W3C values : 0,1,2 for left, middle and right buttons)
601
+ * @param {input.KEY} keyCode
602
+ * @example
603
+ * // enable the keyboard
604
+ * me.input.bindKey(me.input.KEY.X, "shoot");
605
+ * // map the left button click on the X key (default if the button is not specified)
606
+ * me.input.bindPointer(me.input.KEY.X);
607
+ * // map the right button click on the X key
608
+ * me.input.bindPointer(me.input.pointer.RIGHT, me.input.KEY.X);
609
+ */
610
+ function bindPointer() {
611
+ var button = (arguments.length < 2) ? pointer.LEFT : arguments[0];
612
+ var keyCode = (arguments.length < 2) ? arguments[0] : arguments[1];
613
+
614
+ // make sure the mouse is initialized
615
+ enablePointerEvent();
616
+
617
+ // throw an exception if no action is defined for the specified keycode
618
+ if (!getBindingKey(keyCode)) {
619
+ throw new Error("no action defined for keycode " + keyCode);
620
+ }
621
+ // map the mouse button to the keycode
622
+ pointer.bind[button] = keyCode;
623
+ }
624
+
625
+ /**
626
+ * unbind the defined keycode
627
+ * @name unbindPointer
628
+ * @memberof input
629
+ * @public
630
+ * @param {number} [button=input.pointer.LEFT] - (accordingly to W3C values : 0,1,2 for left, middle and right buttons)
631
+ * @example
632
+ * me.input.unbindPointer(me.input.pointer.LEFT);
633
+ */
634
+ function unbindPointer(button) {
635
+ // clear the event status
636
+ pointer.bind[
637
+ typeof(button) === "undefined" ?
638
+ pointer.LEFT : button
639
+ ] = null;
640
+ }
641
+
642
+
643
+ /**
644
+ * allows registration of event listeners on the object target. <br>
645
+ * melonJS will pass a me.Pointer object to the defined callback.
646
+ * @see Pointer
647
+ * @see {@link http://www.w3.org/TR/pointerevents/#list-of-pointer-events|W3C Pointer Event list}
648
+ * @name registerPointerEvent
649
+ * @memberof input
650
+ * @public
651
+ * @param {string} eventType - The event type for which the object is registering <br>
652
+ * melonJS currently supports: <br>
653
+ * <ul>
654
+ * <li><code>"pointermove"</code></li>
655
+ * <li><code>"pointerdown"</code></li>
656
+ * <li><code>"pointerup"</code></li>
657
+ * <li><code>"pointerenter"</code></li>
658
+ * <li><code>"pointerover"</code></li>
659
+ * <li><code>"pointerleave"</code></li>
660
+ * <li><code>"pointercancel"</code></li>
661
+ * <li><code>"wheel"</code></li>
662
+ * </ul>
663
+ * @param {Rect|Polygon|Line|Ellipse} region - a shape representing the region to register on
664
+ * @param {Function} callback - methods to be called when the event occurs.
665
+ * Returning `false` from the defined callback will prevent the event to be propagated to other objects
666
+ * @example
667
+ * // onActivate function
668
+ * onActivateEvent: function () {
669
+ * // register on the 'pointerdown' event
670
+ * me.input.registerPointerEvent('pointerdown', this, this.pointerDown.bind(this));
671
+ * },
672
+ *
673
+ * // pointerDown event callback
674
+ * pointerDown: function (pointer) {
675
+ * // do something
676
+ * ....
677
+ * // don"t propagate the event to other objects
678
+ * return false;
679
+ * },
680
+ */
681
+ function registerPointerEvent(eventType, region, callback) {
682
+ // make sure the mouse/touch events are initialized
683
+ enablePointerEvent();
684
+
685
+ if (pointerEventList.indexOf(eventType) === -1) {
686
+ throw new Error("invalid event type : " + eventType);
687
+ }
688
+
689
+ if (typeof region === "undefined") {
690
+ throw new Error("registerPointerEvent: region for " + toString(region) + " event is undefined ");
691
+ }
692
+
693
+ var eventTypes = findAllActiveEvents(activeEventList, pointerEventMap[eventType]);
694
+
695
+ // register the event
696
+ if (!eventHandlers.has(region)) {
697
+ eventHandlers.set(region, {
698
+ region : region,
699
+ callbacks : {},
700
+ pointerId : null
701
+ });
702
+ }
703
+
704
+ // allocate array if not defined
705
+ var handlers = eventHandlers.get(region);
706
+ for (var i = 0; i < eventTypes.length; i++) {
707
+ eventType = eventTypes[i];
708
+ if (handlers.callbacks[eventType]) {
709
+ handlers.callbacks[eventType].push(callback);
710
+ } else {
711
+ handlers.callbacks[eventType] = [callback];
712
+ }
713
+ }
714
+ }
715
+
716
+ /**
717
+ * allows the removal of event listeners from the object target.
718
+ * @see {@link http://www.w3.org/TR/pointerevents/#list-of-pointer-events|W3C Pointer Event list}
719
+ * @name releasePointerEvent
720
+ * @memberof input
721
+ * @public
722
+ * @param {string} eventType - The event type for which the object was registered. See {@link input.registerPointerEvent}
723
+ * @param {Rect|Polygon|Line|Ellipse} region - the registered region to release for this event
724
+ * @param {Function} [callback="all"] - if specified unregister the event only for the specific callback
725
+ * @example
726
+ * // release the registered region on the 'pointerdown' event
727
+ * me.input.releasePointerEvent('pointerdown', this);
728
+ */
729
+ function releasePointerEvent(eventType, region, callback) {
730
+ if (pointerEventList.indexOf(eventType) === -1) {
731
+ throw new Error("invalid event type : " + eventType);
732
+ }
733
+
734
+ // convert to supported event type if pointerEvent not natively supported
735
+ var eventTypes = findAllActiveEvents(activeEventList, pointerEventMap[eventType]);
736
+
737
+ var handlers = eventHandlers.get(region);
738
+ if (typeof (handlers) !== "undefined") {
739
+ for (var i = 0; i < eventTypes.length; i++) {
740
+ eventType = eventTypes[i];
741
+ if (handlers.callbacks[eventType]) {
742
+ if (typeof (callback) !== "undefined") {
743
+ remove(handlers.callbacks[eventType], callback);
744
+ } else {
745
+ while (handlers.callbacks[eventType].length > 0) {
746
+ handlers.callbacks[eventType].pop();
747
+ }
748
+ }
749
+ // free the array if empty
750
+ if (handlers.callbacks[eventType].length === 0) {
751
+ delete handlers.callbacks[eventType];
752
+ }
753
+ }
754
+ }
755
+ if (Object.keys(handlers.callbacks).length === 0) {
756
+ eventHandlers.delete(region);
757
+ }
758
+ }
759
+ }
760
+
761
+ /**
762
+ * allows the removal of all registered event listeners from the object target.
763
+ * @name releaseAllPointerEvents
764
+ * @memberof input
765
+ * @public
766
+ * @param {Rect|Polygon|Line|Ellipse} region - the registered region to release event from
767
+ * @example
768
+ * // release all registered event on the
769
+ * me.input.releaseAllPointerEvents(this);
770
+ */
771
+ function releaseAllPointerEvents(region) {
772
+ if (eventHandlers.has(region)) {
773
+ for (var i = 0; i < pointerEventList.length; i++) {
774
+ releasePointerEvent(pointerEventList[i], region);
775
+ }
776
+ }
777
+ }
778
+
779
+ /**
780
+ * request for the pointer to be locked on the parent DOM element.
781
+ * (Must be called in a click event or an event that requires user interaction)
782
+ * @name requestPointerLock
783
+ * @memberof input
784
+ * @public
785
+ * @returns {boolean} return true if the request was successfully submitted
786
+ * @example
787
+ * // register on the pointer lock change event
788
+ * event.on(event.POINTERLOCKCHANGE, (locked)=> {
789
+ * console.log("pointer lock: " + locked);
790
+ * });
791
+ * // request for pointer lock
792
+ * me.input.requestPointerLock();
793
+ */
794
+ function requestPointerLock() {
795
+ if (hasPointerLockSupport) {
796
+ var element = getParent();
797
+ element.requestPointerLock();
798
+ return true;
799
+ }
800
+ return false;
801
+ }
802
+
803
+ /**
804
+ * Initiates an exit from pointer lock state
805
+ * @name exitPointerLock
806
+ * @memberof input
807
+ * @public
808
+ * @returns {boolean} return true if the request was successfully submitted
809
+ */
810
+ function exitPointerLock() {
811
+ if (hasPointerLockSupport) {
812
+ document.exitPointerLock();
813
+ return true;
814
+ }
815
+ return false;
816
+ }
817
+
818
+ export { bindPointer, exitPointerLock, globalToLocal, locked, pointer, pointerEventTarget, registerPointerEvent, releaseAllPointerEvents, releasePointerEvent, requestPointerLock, setTouchAction, throttlingInterval, unbindPointer };