@vpmedia/phaser 1.113.0 → 1.115.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 (170) hide show
  1. package/dist/index.js +402 -379
  2. package/dist/index.js.map +1 -1
  3. package/dist/phaser/core/animation_manager.d.ts +2 -1
  4. package/dist/phaser/core/animation_manager.d.ts.map +1 -1
  5. package/dist/phaser/core/array_set.d.ts +1 -1
  6. package/dist/phaser/core/array_set.d.ts.map +1 -1
  7. package/dist/phaser/core/cache.d.ts +1 -1
  8. package/dist/phaser/core/cache.d.ts.map +1 -1
  9. package/dist/phaser/core/factory.d.ts +1 -1
  10. package/dist/phaser/core/factory.d.ts.map +1 -1
  11. package/dist/phaser/core/game.d.ts +2 -0
  12. package/dist/phaser/core/game.d.ts.map +1 -1
  13. package/dist/phaser/core/input.d.ts +5 -5
  14. package/dist/phaser/core/input.d.ts.map +1 -1
  15. package/dist/phaser/core/input_event.d.ts +35 -0
  16. package/dist/phaser/core/input_event.d.ts.map +1 -0
  17. package/dist/phaser/core/input_handler.d.ts +2 -2
  18. package/dist/phaser/core/input_handler.d.ts.map +1 -1
  19. package/dist/phaser/core/input_mouse.d.ts +27 -26
  20. package/dist/phaser/core/input_mouse.d.ts.map +1 -1
  21. package/dist/phaser/core/input_mspointer.d.ts +16 -15
  22. package/dist/phaser/core/input_mspointer.d.ts.map +1 -1
  23. package/dist/phaser/core/input_pointer.d.ts +9 -8
  24. package/dist/phaser/core/input_pointer.d.ts.map +1 -1
  25. package/dist/phaser/core/input_touch.d.ts +18 -17
  26. package/dist/phaser/core/input_touch.d.ts.map +1 -1
  27. package/dist/phaser/core/loader.d.ts +64 -30
  28. package/dist/phaser/core/loader.d.ts.map +1 -1
  29. package/dist/phaser/core/scale_manager.d.ts +1 -1
  30. package/dist/phaser/core/scale_manager.d.ts.map +1 -1
  31. package/dist/phaser/core/scene_manager.d.ts +14 -4
  32. package/dist/phaser/core/scene_manager.d.ts.map +1 -1
  33. package/dist/phaser/core/signal.d.ts +8 -8
  34. package/dist/phaser/core/signal.d.ts.map +1 -1
  35. package/dist/phaser/core/signal_binding.d.ts +2 -2
  36. package/dist/phaser/core/signal_binding.d.ts.map +1 -1
  37. package/dist/phaser/core/sound.d.ts +1 -1
  38. package/dist/phaser/core/sound.d.ts.map +1 -1
  39. package/dist/phaser/core/sound_manager.d.ts +3 -3
  40. package/dist/phaser/core/sound_manager.d.ts.map +1 -1
  41. package/dist/phaser/core/sound_sprite.d.ts +1 -1
  42. package/dist/phaser/core/sound_sprite.d.ts.map +1 -1
  43. package/dist/phaser/core/timer.d.ts +5 -5
  44. package/dist/phaser/core/timer.d.ts.map +1 -1
  45. package/dist/phaser/core/timer_event.d.ts +2 -2
  46. package/dist/phaser/core/timer_event.d.ts.map +1 -1
  47. package/dist/phaser/core/tween.d.ts +4 -4
  48. package/dist/phaser/core/tween.d.ts.map +1 -1
  49. package/dist/phaser/core/tween_data.d.ts +2 -1
  50. package/dist/phaser/core/tween_data.d.ts.map +1 -1
  51. package/dist/phaser/core/tween_manager.d.ts +1 -1
  52. package/dist/phaser/core/tween_manager.d.ts.map +1 -1
  53. package/dist/phaser/display/button.d.ts +1 -1
  54. package/dist/phaser/display/button.d.ts.map +1 -1
  55. package/dist/phaser/display/canvas/buffer.d.ts +3 -3
  56. package/dist/phaser/display/canvas/buffer.d.ts.map +1 -1
  57. package/dist/phaser/display/canvas/graphics.d.ts +2 -2
  58. package/dist/phaser/display/canvas/graphics.d.ts.map +1 -1
  59. package/dist/phaser/display/canvas/masker.d.ts +5 -2
  60. package/dist/phaser/display/canvas/masker.d.ts.map +1 -1
  61. package/dist/phaser/display/canvas/renderer.d.ts +6 -5
  62. package/dist/phaser/display/canvas/renderer.d.ts.map +1 -1
  63. package/dist/phaser/display/canvas/tinter.d.ts +2 -1
  64. package/dist/phaser/display/canvas/tinter.d.ts.map +1 -1
  65. package/dist/phaser/display/canvas/util.d.ts +11 -4
  66. package/dist/phaser/display/canvas/util.d.ts.map +1 -1
  67. package/dist/phaser/display/display_object.d.ts +4 -3
  68. package/dist/phaser/display/display_object.d.ts.map +1 -1
  69. package/dist/phaser/display/graphics.d.ts +47 -27
  70. package/dist/phaser/display/graphics.d.ts.map +1 -1
  71. package/dist/phaser/display/graphics_data.d.ts +20 -11
  72. package/dist/phaser/display/graphics_data.d.ts.map +1 -1
  73. package/dist/phaser/display/image.d.ts +4 -3
  74. package/dist/phaser/display/image.d.ts.map +1 -1
  75. package/dist/phaser/display/render_session.d.ts +44 -0
  76. package/dist/phaser/display/render_session.d.ts.map +1 -0
  77. package/dist/phaser/display/sprite_util.d.ts +4 -3
  78. package/dist/phaser/display/sprite_util.d.ts.map +1 -1
  79. package/dist/phaser/display/text.d.ts +65 -31
  80. package/dist/phaser/display/text.d.ts.map +1 -1
  81. package/dist/phaser/display/webgl/base_texture.d.ts +3 -3
  82. package/dist/phaser/display/webgl/base_texture.d.ts.map +1 -1
  83. package/dist/phaser/display/webgl/earcut.d.ts +25 -25
  84. package/dist/phaser/display/webgl/earcut.d.ts.map +1 -1
  85. package/dist/phaser/display/webgl/earcut_node.d.ts +2 -2
  86. package/dist/phaser/display/webgl/earcut_node.d.ts.map +1 -1
  87. package/dist/phaser/display/webgl/fast_sprite_batch.d.ts +3 -2
  88. package/dist/phaser/display/webgl/fast_sprite_batch.d.ts.map +1 -1
  89. package/dist/phaser/display/webgl/filter_manager.d.ts +1 -1
  90. package/dist/phaser/display/webgl/filter_manager.d.ts.map +1 -1
  91. package/dist/phaser/display/webgl/graphics.d.ts +2 -1
  92. package/dist/phaser/display/webgl/graphics.d.ts.map +1 -1
  93. package/dist/phaser/display/webgl/graphics_data.d.ts +9 -9
  94. package/dist/phaser/display/webgl/graphics_data.d.ts.map +1 -1
  95. package/dist/phaser/display/webgl/mask_manager.d.ts +3 -2
  96. package/dist/phaser/display/webgl/mask_manager.d.ts.map +1 -1
  97. package/dist/phaser/display/webgl/render_texture.d.ts +3 -3
  98. package/dist/phaser/display/webgl/render_texture.d.ts.map +1 -1
  99. package/dist/phaser/display/webgl/renderer.d.ts +5 -4
  100. package/dist/phaser/display/webgl/renderer.d.ts.map +1 -1
  101. package/dist/phaser/display/webgl/shader/normal.d.ts +3 -1
  102. package/dist/phaser/display/webgl/shader/normal.d.ts.map +1 -1
  103. package/dist/phaser/display/webgl/shader_manager.d.ts +10 -4
  104. package/dist/phaser/display/webgl/shader_manager.d.ts.map +1 -1
  105. package/dist/phaser/display/webgl/sprite_batch.d.ts +4 -3
  106. package/dist/phaser/display/webgl/sprite_batch.d.ts.map +1 -1
  107. package/dist/phaser/display/webgl/stencil_manager.d.ts +4 -3
  108. package/dist/phaser/display/webgl/stencil_manager.d.ts.map +1 -1
  109. package/dist/phaser/display/webgl/texture.d.ts +6 -6
  110. package/dist/phaser/display/webgl/texture.d.ts.map +1 -1
  111. package/package.json +1 -1
  112. package/src/phaser/core/animation_manager.ts +2 -2
  113. package/src/phaser/core/array_set.ts +1 -1
  114. package/src/phaser/core/cache.ts +1 -1
  115. package/src/phaser/core/factory.ts +1 -1
  116. package/src/phaser/core/game.ts +2 -0
  117. package/src/phaser/core/input.ts +7 -6
  118. package/src/phaser/core/input_event.ts +34 -0
  119. package/src/phaser/core/input_handler.ts +2 -11
  120. package/src/phaser/core/input_mouse.ts +53 -36
  121. package/src/phaser/core/input_mspointer.ts +54 -29
  122. package/src/phaser/core/input_pointer.test.ts +149 -0
  123. package/src/phaser/core/input_pointer.ts +20 -21
  124. package/src/phaser/core/input_touch.ts +48 -31
  125. package/src/phaser/core/loader.test.ts +139 -0
  126. package/src/phaser/core/loader.ts +146 -83
  127. package/src/phaser/core/scale_manager.ts +1 -1
  128. package/src/phaser/core/scene_manager.ts +16 -8
  129. package/src/phaser/core/signal.ts +8 -8
  130. package/src/phaser/core/signal_binding.ts +2 -2
  131. package/src/phaser/core/sound.ts +4 -4
  132. package/src/phaser/core/sound_manager.ts +17 -19
  133. package/src/phaser/core/sound_sprite.ts +2 -2
  134. package/src/phaser/core/timer.ts +6 -6
  135. package/src/phaser/core/timer_event.ts +2 -2
  136. package/src/phaser/core/tween.ts +6 -6
  137. package/src/phaser/core/tween_data.ts +2 -1
  138. package/src/phaser/core/tween_manager.ts +1 -1
  139. package/src/phaser/display/button.ts +1 -1
  140. package/src/phaser/display/canvas/buffer.ts +3 -3
  141. package/src/phaser/display/canvas/graphics.ts +24 -20
  142. package/src/phaser/display/canvas/masker.ts +5 -2
  143. package/src/phaser/display/canvas/renderer.ts +10 -11
  144. package/src/phaser/display/canvas/tinter.ts +4 -3
  145. package/src/phaser/display/canvas/util.ts +15 -5
  146. package/src/phaser/display/display_object.ts +6 -5
  147. package/src/phaser/display/graphics.test.ts +122 -0
  148. package/src/phaser/display/graphics.ts +73 -64
  149. package/src/phaser/display/graphics_data.ts +22 -12
  150. package/src/phaser/display/image.ts +4 -3
  151. package/src/phaser/display/render_session.ts +45 -0
  152. package/src/phaser/display/sprite_util.ts +10 -8
  153. package/src/phaser/display/text.test.ts +136 -0
  154. package/src/phaser/display/text.ts +183 -119
  155. package/src/phaser/display/webgl/base_texture.ts +3 -3
  156. package/src/phaser/display/webgl/earcut.test.ts +132 -0
  157. package/src/phaser/display/webgl/earcut.ts +84 -74
  158. package/src/phaser/display/webgl/earcut_node.ts +5 -5
  159. package/src/phaser/display/webgl/fast_sprite_batch.ts +4 -4
  160. package/src/phaser/display/webgl/filter_manager.ts +1 -1
  161. package/src/phaser/display/webgl/graphics.ts +26 -17
  162. package/src/phaser/display/webgl/graphics_data.ts +9 -9
  163. package/src/phaser/display/webgl/mask_manager.ts +3 -2
  164. package/src/phaser/display/webgl/render_texture.ts +3 -3
  165. package/src/phaser/display/webgl/renderer.ts +7 -6
  166. package/src/phaser/display/webgl/shader/normal.ts +23 -6
  167. package/src/phaser/display/webgl/shader_manager.ts +15 -6
  168. package/src/phaser/display/webgl/sprite_batch.ts +4 -3
  169. package/src/phaser/display/webgl/stencil_manager.ts +10 -3
  170. package/src/phaser/display/webgl/texture.ts +6 -6
@@ -1,31 +1,32 @@
1
+ import type { InputEvent } from './input_event.js';
1
2
  import type { Input } from './input.js';
2
3
  import type { Game } from './game.js';
3
4
 
4
5
  export class Mouse {
5
- public game!: any;
6
+ public game!: Game;
6
7
  public input!: Input;
7
- public callbackContext!: any;
8
- public mouseDownCallback: ((event: MouseEvent) => void) | null;
9
- public mouseUpCallback: ((event: MouseEvent) => void) | null;
10
- public mouseOutCallback: ((event: MouseEvent) => void) | null;
11
- public mouseOverCallback: ((event: MouseEvent) => void) | null;
12
- public mouseWheelCallback: ((event: WheelEvent) => void) | null;
13
- public mouseMoveCallback: ((event: MouseEvent) => void) | null;
8
+ public callbackContext!: unknown;
9
+ public mouseDownCallback: EventListener | null;
10
+ public mouseUpCallback: EventListener | null;
11
+ public mouseOutCallback: EventListener | null;
12
+ public mouseOverCallback: EventListener | null;
13
+ public mouseWheelCallback: EventListener | null;
14
+ public mouseMoveCallback: EventListener | null;
14
15
  public capture!: boolean;
15
16
  public button!: number;
16
17
  public wheelDelta!: number;
17
18
  public enabled!: boolean;
18
19
  public locked!: boolean;
19
20
  public stopOnGameOut!: boolean;
20
- public event!: MouseEvent | WheelEvent | null;
21
- public _onMouseDown: ((event: MouseEvent) => void) | null;
22
- public _onMouseMove: ((event: MouseEvent) => void) | null;
23
- public _onMouseUp: ((event: MouseEvent) => void) | null;
24
- public _onMouseOut: ((event: MouseEvent) => void) | null;
25
- public _onMouseOver: ((event: MouseEvent) => void) | null;
26
- public _onMouseWheel: ((event: WheelEvent) => void) | null;
27
- public _onMouseUpGlobal!: (event: MouseEvent) => void;
28
- public _onMouseOutGlobal!: (event: MouseEvent) => void;
21
+ public event!: InputEvent | null;
22
+ public _onMouseDown: EventListener | null;
23
+ public _onMouseMove: EventListener | null;
24
+ public _onMouseUp: EventListener | null;
25
+ public _onMouseOut: EventListener | null;
26
+ public _onMouseOver: EventListener | null;
27
+ public _onMouseWheel: EventListener | null;
28
+ public _onMouseUpGlobal!: EventListener;
29
+ public _onMouseOutGlobal!: EventListener;
29
30
  public _wheelEvent!: any;
30
31
  /**
31
32
  * TBD.
@@ -61,7 +62,7 @@ export class Mouse {
61
62
  * TBD.
62
63
  */
63
64
  public start() {
64
- if (this.game.device.android && this.game.device.chrome === false) {
65
+ if (this.game.device.android && !this.game.device.chrome) {
65
66
  // Android stock browser fires mouse events even if you preventDefault on the touchStart, so ...
66
67
  return;
67
68
  }
@@ -113,24 +114,40 @@ export class Mouse {
113
114
  */
114
115
  public stop() {
115
116
  const { canvas } = this.game;
116
- canvas.removeEventListener('mousedown', this._onMouseDown, true);
117
- canvas.removeEventListener('mousemove', this._onMouseMove, true);
118
- canvas.removeEventListener('mouseup', this._onMouseUp, true);
119
- canvas.removeEventListener('mouseover', this._onMouseOver, true);
120
- canvas.removeEventListener('mouseout', this._onMouseOut, true);
117
+ if (this._onMouseDown) {
118
+ canvas.removeEventListener('mousedown', this._onMouseDown, true);
119
+ }
120
+ if (this._onMouseMove) {
121
+ canvas.removeEventListener('mousemove', this._onMouseMove, true);
122
+ }
123
+ if (this._onMouseUp) {
124
+ canvas.removeEventListener('mouseup', this._onMouseUp, true);
125
+ }
126
+ if (this._onMouseOver) {
127
+ canvas.removeEventListener('mouseover', this._onMouseOver, true);
128
+ }
129
+ if (this._onMouseOut) {
130
+ canvas.removeEventListener('mouseout', this._onMouseOut, true);
131
+ }
121
132
  const { wheelEvent } = this.game.device;
122
133
  if (wheelEvent) {
123
- canvas.removeEventListener(wheelEvent, this._onMouseWheel, true);
134
+ if (this._onMouseWheel) {
135
+ canvas.removeEventListener(wheelEvent, this._onMouseWheel, true);
136
+ }
137
+ }
138
+ if (this._onMouseUpGlobal) {
139
+ globalThis.removeEventListener('mouseup', this._onMouseUpGlobal, true);
140
+ }
141
+ if (this._onMouseOutGlobal) {
142
+ globalThis.removeEventListener('mouseout', this._onMouseOutGlobal, true);
124
143
  }
125
- globalThis.removeEventListener('mouseup', this._onMouseUpGlobal, true);
126
- globalThis.removeEventListener('mouseout', this._onMouseOutGlobal, true);
127
144
  }
128
145
 
129
146
  /**
130
147
  * TBD.
131
148
  * @param {MouseEvent} event - TBD.
132
149
  */
133
- public onMouseDown(event: any) {
150
+ public onMouseDown(event: InputEvent) {
134
151
  this.event = event;
135
152
  this.eventPreventDefault(event);
136
153
  if (this.mouseDownCallback) {
@@ -147,7 +164,7 @@ export class Mouse {
147
164
  * TBD.
148
165
  * @param {MouseEvent} event - TBD.
149
166
  */
150
- public onMouseMove(event: any) {
167
+ public onMouseMove(event: InputEvent) {
151
168
  this.event = event;
152
169
  this.eventPreventDefault(event);
153
170
  if (this.mouseMoveCallback) {
@@ -164,7 +181,7 @@ export class Mouse {
164
181
  * TBD.
165
182
  * @param {MouseEvent} event - TBD.
166
183
  */
167
- public onMouseUp(event: any) {
184
+ public onMouseUp(event: InputEvent) {
168
185
  this.event = event;
169
186
  this.eventPreventDefault(event);
170
187
  if (this.mouseUpCallback) {
@@ -181,7 +198,7 @@ export class Mouse {
181
198
  * TBD.
182
199
  * @param {MouseEvent} event - TBD.
183
200
  */
184
- public onMouseUpGlobal(event: any) {
201
+ public onMouseUpGlobal(event: InputEvent) {
185
202
  if (!this.input.mousePointer.withinGame) {
186
203
  if (this.mouseUpCallback) {
187
204
  this.mouseUpCallback.call(this.callbackContext, event);
@@ -195,7 +212,7 @@ export class Mouse {
195
212
  * TBD.
196
213
  * @param {MouseEvent} event - TBD.
197
214
  */
198
- public onMouseOutGlobal(event: any) {
215
+ public onMouseOutGlobal(event: InputEvent) {
199
216
  this.event = event;
200
217
  this.eventPreventDefault(event);
201
218
  this.input.mousePointer.withinGame = false;
@@ -214,7 +231,7 @@ export class Mouse {
214
231
  * TBD.
215
232
  * @param {MouseEvent} event - TBD.
216
233
  */
217
- public onMouseOut(event: any) {
234
+ public onMouseOut(event: InputEvent) {
218
235
  this.event = event;
219
236
  this.eventPreventDefault(event);
220
237
  this.input.mousePointer.withinGame = false;
@@ -234,7 +251,7 @@ export class Mouse {
234
251
  * TBD.
235
252
  * @param {MouseEvent} event - TBD.
236
253
  */
237
- public onMouseOver(event: any) {
254
+ public onMouseOver(event: InputEvent) {
238
255
  this.event = event;
239
256
  this.eventPreventDefault(event);
240
257
  this.input.mousePointer.withinGame = true;
@@ -247,14 +264,14 @@ export class Mouse {
247
264
  * TBD.
248
265
  * @param {WheelEvent} event - TBD.
249
266
  */
250
- public onMouseWheel(event: any) {
267
+ public onMouseWheel(event: InputEvent) {
251
268
  if (this._wheelEvent) {
252
269
  event = this._wheelEvent.bindEvent(event);
253
270
  }
254
271
  this.event = event;
255
272
  this.eventPreventDefault(event);
256
273
  // reverse detail for firefox
257
- this.wheelDelta = Math.max(-1, Math.min(1, -event.deltaY));
274
+ this.wheelDelta = Math.max(-1, Math.min(1, -(event.deltaY ?? 0)));
258
275
  if (this.mouseWheelCallback) {
259
276
  this.mouseWheelCallback.call(this.callbackContext, event);
260
277
  }
@@ -264,7 +281,7 @@ export class Mouse {
264
281
  * TBD.
265
282
  * @param {MouseEvent} event - TBD.
266
283
  */
267
- public eventPreventDefault(event: any) {
284
+ public eventPreventDefault(event: Event) {
268
285
  if (this.capture) {
269
286
  if (typeof event.cancelable !== 'boolean' || event.cancelable) {
270
287
  event.preventDefault();
@@ -1,21 +1,22 @@
1
1
  import type { Game } from './game.js';
2
+ import type { InputEvent } from './input_event.js';
2
3
  export class MSPointer {
3
- public game!: any;
4
+ public game!: Game;
4
5
  public input!: any;
5
- public callbackContext!: any;
6
+ public callbackContext!: unknown;
6
7
  public pointerDownCallback!: any;
7
8
  public pointerMoveCallback!: any;
8
9
  public pointerUpCallback!: any;
9
10
  public capture!: any;
10
11
  public button!: any;
11
- public event!: any;
12
+ public event!: InputEvent | null;
12
13
  public enabled!: any;
13
- public _onMSPointerDown: ((event: PointerEvent) => void) | null;
14
- public _onMSPointerMove: ((event: PointerEvent) => void) | null;
15
- public _onMSPointerUp: ((event: PointerEvent) => void) | null;
16
- public _onMSPointerUpGlobal: ((event: Event) => void) | null;
17
- public _onMSPointerOut: ((event: PointerEvent) => void) | null;
18
- public _onMSPointerOver: ((event: PointerEvent) => void) | null;
14
+ public _onMSPointerDown: EventListener | null;
15
+ public _onMSPointerMove: EventListener | null;
16
+ public _onMSPointerUp: EventListener | null;
17
+ public _onMSPointerUpGlobal: EventListener | null;
18
+ public _onMSPointerOut: EventListener | null;
19
+ public _onMSPointerOver: EventListener | null;
19
20
  /**
20
21
  * TBD.
21
22
  * @param {Game} game - TBD.
@@ -73,8 +74,8 @@ export class MSPointer {
73
74
  canvas.addEventListener('pointerdown', this._onMSPointerDown, false);
74
75
  canvas.addEventListener('pointermove', this._onMSPointerMove, false);
75
76
  canvas.addEventListener('pointerup', this._onMSPointerUp, false);
76
- canvas.style['-ms-content-zooming'] = 'none';
77
- canvas.style['-ms-touch-action'] = 'none';
77
+ canvas.style.setProperty('-ms-content-zooming', 'none');
78
+ canvas.style.setProperty('-ms-touch-action', 'none');
78
79
  globalThis.addEventListener('MSPointerUp', this._onMSPointerUpGlobal, true);
79
80
  canvas.addEventListener('MSPointerOver', this._onMSPointerOver, true);
80
81
  canvas.addEventListener('MSPointerOut', this._onMSPointerOut, true);
@@ -92,31 +93,55 @@ export class MSPointer {
92
93
  return;
93
94
  }
94
95
  const { canvas } = this.game;
95
- canvas.removeEventListener('MSPointerDown', this._onMSPointerDown, false);
96
- canvas.removeEventListener('MSPointerMove', this._onMSPointerMove, false);
97
- canvas.removeEventListener('MSPointerUp', this._onMSPointerUp, false);
96
+ if (this._onMSPointerDown) {
97
+ canvas.removeEventListener('MSPointerDown', this._onMSPointerDown, false);
98
+ }
99
+ if (this._onMSPointerMove) {
100
+ canvas.removeEventListener('MSPointerMove', this._onMSPointerMove, false);
101
+ }
102
+ if (this._onMSPointerUp) {
103
+ canvas.removeEventListener('MSPointerUp', this._onMSPointerUp, false);
104
+ }
98
105
  // IE11+ uses non-prefix events
99
- canvas.removeEventListener('pointerdown', this._onMSPointerDown, false);
100
- canvas.removeEventListener('pointermove', this._onMSPointerMove, false);
101
- canvas.removeEventListener('pointerup', this._onMSPointerUp, false);
106
+ if (this._onMSPointerDown) {
107
+ canvas.removeEventListener('pointerdown', this._onMSPointerDown, false);
108
+ }
109
+ if (this._onMSPointerMove) {
110
+ canvas.removeEventListener('pointermove', this._onMSPointerMove, false);
111
+ }
112
+ if (this._onMSPointerUp) {
113
+ canvas.removeEventListener('pointerup', this._onMSPointerUp, false);
114
+ }
102
115
  if (this._onMSPointerUpGlobal) {
103
- globalThis.removeEventListener('MSPointerUp', this._onMSPointerUpGlobal, true);
116
+ if (this._onMSPointerUpGlobal) {
117
+ globalThis.removeEventListener('MSPointerUp', this._onMSPointerUpGlobal, true);
118
+ }
119
+ }
120
+ if (this._onMSPointerOver) {
121
+ canvas.removeEventListener('MSPointerOver', this._onMSPointerOver, true);
122
+ }
123
+ if (this._onMSPointerOut) {
124
+ canvas.removeEventListener('MSPointerOut', this._onMSPointerOut, true);
104
125
  }
105
- canvas.removeEventListener('MSPointerOver', this._onMSPointerOver, true);
106
- canvas.removeEventListener('MSPointerOut', this._onMSPointerOut, true);
107
126
  // IE11+ uses non-prefix events
108
127
  if (this._onMSPointerUpGlobal) {
109
- globalThis.removeEventListener('pointerup', this._onMSPointerUpGlobal, true);
128
+ if (this._onMSPointerUpGlobal) {
129
+ globalThis.removeEventListener('pointerup', this._onMSPointerUpGlobal, true);
130
+ }
131
+ }
132
+ if (this._onMSPointerOver) {
133
+ canvas.removeEventListener('pointerover', this._onMSPointerOver, true);
134
+ }
135
+ if (this._onMSPointerOut) {
136
+ canvas.removeEventListener('pointerout', this._onMSPointerOut, true);
110
137
  }
111
- canvas.removeEventListener('pointerover', this._onMSPointerOver, true);
112
- canvas.removeEventListener('pointerout', this._onMSPointerOut, true);
113
138
  }
114
139
 
115
140
  /**
116
141
  * TBD.
117
142
  * @param {PointerEvent} event - TBD.
118
143
  */
119
- public onPointerDown(event: any) {
144
+ public onPointerDown(event: InputEvent) {
120
145
  this.event = event;
121
146
  this.eventPreventDefault(event);
122
147
  if (this.pointerDownCallback) {
@@ -137,7 +162,7 @@ export class MSPointer {
137
162
  * TBD.
138
163
  * @param {PointerEvent} event - TBD.
139
164
  */
140
- public onPointerMove(event: any) {
165
+ public onPointerMove(event: InputEvent) {
141
166
  this.event = event;
142
167
  this.eventPreventDefault(event);
143
168
  if (this.pointerMoveCallback) {
@@ -158,7 +183,7 @@ export class MSPointer {
158
183
  * TBD.
159
184
  * @param {PointerEvent} event - TBD.
160
185
  */
161
- public onPointerUp(event: any) {
186
+ public onPointerUp(event: InputEvent) {
162
187
  this.event = event;
163
188
  this.eventPreventDefault(event);
164
189
  if (this.pointerUpCallback) {
@@ -179,7 +204,7 @@ export class MSPointer {
179
204
  * TBD.
180
205
  * @param {PointerEvent} event - TBD.
181
206
  */
182
- public onPointerUpGlobal(event: any) {
207
+ public onPointerUpGlobal(event: InputEvent) {
183
208
  if ((event.pointerType === 'mouse' || event.pointerType === 0x00000004) && !this.input.mousePointer.withinGame) {
184
209
  this.onPointerUp(event);
185
210
  } else {
@@ -194,7 +219,7 @@ export class MSPointer {
194
219
  * TBD.
195
220
  * @param {PointerEvent} event - TBD.
196
221
  */
197
- public onPointerOut(event: any) {
222
+ public onPointerOut(event: InputEvent) {
198
223
  this.event = event;
199
224
  this.eventPreventDefault(event);
200
225
  let pointer;
@@ -226,7 +251,7 @@ export class MSPointer {
226
251
  * TBD.
227
252
  * @param {PointerEvent} event - TBD.
228
253
  */
229
- public onPointerOver(event: any) {
254
+ public onPointerOver(event: InputEvent) {
230
255
  this.event = event;
231
256
  this.eventPreventDefault(event);
232
257
  if (event.pointerType === 'mouse' || event.pointerType === 0x00000004) {
@@ -0,0 +1,149 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { Circle } from '../geom/circle.js';
3
+ import { Point } from '../geom/point.js';
4
+ import { POINTER_CURSOR } from './const.js';
5
+ import type { Game } from './game.js';
6
+ import type { InputEvent } from './input_event.js';
7
+ import { Pointer } from './input_pointer.js';
8
+
9
+ const createGame = (): Game =>
10
+ ({
11
+ time: { time: 0 },
12
+ scale: { bounds: { contains: () => true }, offset: { x: 0, y: 0 } },
13
+ input: {
14
+ enabled: true,
15
+ multiInputOverride: 0,
16
+ moveCallbacks: [],
17
+ interactiveItems: { total: 0, callAll: () => undefined },
18
+ mouse: { locked: false },
19
+ scale: new Point(1, 1),
20
+ position: new Point(),
21
+ circle: new Circle(),
22
+ speed: new Point(),
23
+ activePointer: null,
24
+ onDown: { dispatch: () => undefined },
25
+ onUp: { dispatch: () => undefined },
26
+ onHold: { dispatch: () => undefined },
27
+ onTap: { dispatch: () => undefined },
28
+ x: 0,
29
+ y: 0,
30
+ resetSpeed: () => undefined,
31
+ },
32
+ }) as unknown as Game;
33
+
34
+ const createPointer = (id = 1): Pointer => new Pointer(createGame(), id, POINTER_CURSOR);
35
+
36
+ const event = (fields: Partial<InputEvent> = {}): InputEvent =>
37
+ ({ type: 'pointerdown', target: null, preventDefault: () => undefined, ...fields }) as InputEvent;
38
+
39
+ describe('Pointer', () => {
40
+ describe('updateButtons', () => {
41
+ it('reads a down event as pressed', () => {
42
+ const pointer = createPointer();
43
+ pointer.updateButtons(event({ type: 'pointerdown' }));
44
+ expect(pointer.isDown).toBe(true);
45
+ expect(pointer.isUp).toBe(false);
46
+ });
47
+
48
+ it('reads an up event as released', () => {
49
+ const pointer = createPointer();
50
+ pointer.updateButtons(event({ type: 'pointerup' }));
51
+ expect(pointer.isDown).toBe(false);
52
+ expect(pointer.isUp).toBe(true);
53
+ });
54
+
55
+ it('matches the suffix case insensitively, as the legacy events are capitalised', () => {
56
+ const pointer = createPointer();
57
+ pointer.updateButtons(event({ type: 'MSPointerDown' }));
58
+ expect(pointer.isDown).toBe(true);
59
+ });
60
+
61
+ it('treats a move event as not pressed', () => {
62
+ const pointer = createPointer();
63
+ pointer.updateButtons(event({ type: 'pointermove' }));
64
+ expect(pointer.isUp).toBe(true);
65
+ });
66
+ });
67
+
68
+ describe('start', () => {
69
+ it('records the identifier the event carries', () => {
70
+ const pointer = createPointer();
71
+ pointer.start(event({ identifier: 7 }));
72
+ expect(pointer.identifier).toBe(7);
73
+ });
74
+
75
+ it('records a null identifier when the event has none', () => {
76
+ const pointer = createPointer();
77
+ pointer.start(event({}));
78
+ expect(pointer.identifier).toBeNull();
79
+ });
80
+
81
+ it('records the pointerId when the event carries one', () => {
82
+ const pointer = createPointer();
83
+ pointer.start(event({ pointerId: 3 }));
84
+ expect(pointer.pointerId).toBe(3);
85
+ });
86
+
87
+ it('marks the pointer active and down', () => {
88
+ const pointer = createPointer();
89
+ pointer.start(event({ identifier: 1 }));
90
+ expect(pointer.active).toBe(true);
91
+ expect(pointer.isDown).toBe(true);
92
+ });
93
+ });
94
+
95
+ describe('move', () => {
96
+ it('copies the coordinate set off the event', () => {
97
+ const pointer = createPointer();
98
+ pointer.start(event({ identifier: 1 }));
99
+ pointer.move(
100
+ event({
101
+ type: 'pointermove',
102
+ clientX: 11,
103
+ clientY: 22,
104
+ pageX: 33,
105
+ pageY: 44,
106
+ screenX: 55,
107
+ screenY: 66,
108
+ })
109
+ );
110
+ expect(pointer.clientX).toBe(11);
111
+ expect(pointer.clientY).toBe(22);
112
+ expect(pointer.pageX).toBe(33);
113
+ expect(pointer.pageY).toBe(44);
114
+ expect(pointer.screenX).toBe(55);
115
+ expect(pointer.screenY).toBe(66);
116
+ });
117
+
118
+ it('falls back to zero for coordinates the event omits', () => {
119
+ const pointer = createPointer();
120
+ pointer.start(event({ identifier: 1 }));
121
+ pointer.move(event({ type: 'pointermove' }));
122
+ expect(pointer.clientX).toBe(0);
123
+ expect(pointer.pageY).toBe(0);
124
+ });
125
+ });
126
+
127
+ describe('stop', () => {
128
+ it('clears the identifiers it recorded', () => {
129
+ const pointer = createPointer();
130
+ pointer.start(event({ identifier: 5, pointerId: 5 }));
131
+ pointer.stop(event({ type: 'pointerup' }));
132
+ expect(pointer.identifier).toBeNull();
133
+ expect(pointer.pointerId).toBeNull();
134
+ expect(pointer.isDown).toBe(false);
135
+ });
136
+ });
137
+
138
+ describe('reset', () => {
139
+ it('returns the pointer to its resting state', () => {
140
+ const pointer = createPointer();
141
+ pointer.start(event({ identifier: 5 }));
142
+ pointer.reset();
143
+ expect(pointer.identifier).toBeNull();
144
+ expect(pointer.pointerId).toBeNull();
145
+ expect(pointer.isDown).toBe(false);
146
+ expect(pointer.isUp).toBe(true);
147
+ });
148
+ });
149
+ });
@@ -1,3 +1,4 @@
1
+ import type { InputEvent } from './input_event.js';
1
2
  import type { Game } from './game.js';
2
3
  import type { InputHandler } from './input_handler.js';
3
4
  import { Circle } from '../geom/circle.js';
@@ -12,14 +13,14 @@ import {
12
13
  } from './const.js';
13
14
 
14
15
  export class Pointer {
15
- public game!: any;
16
+ public game!: Game;
16
17
  public id!: number;
17
18
  public type!: number;
18
19
  public exists!: boolean;
19
20
  public identifier!: number | null;
20
21
  public pointerId!: any;
21
22
  public pointerMode!: number;
22
- public target!: any;
23
+ public target!: EventTarget | null;
23
24
  public button!: any;
24
25
  public _holdSent!: boolean;
25
26
  public _history!: any;
@@ -121,8 +122,8 @@ export class Pointer {
121
122
  * TBD.
122
123
  * @param {MouseEvent|PointerEvent} event - TBD.
123
124
  */
124
- public updateButtons(event: any | PointerEvent) {
125
- if (event.type.toLowerCase().slice(-4) === 'down') {
125
+ public updateButtons(event: InputEvent) {
126
+ if (event.type.toLowerCase().endsWith('down')) {
126
127
  this.isUp = false;
127
128
  this.isDown = true;
128
129
  } else {
@@ -136,12 +137,12 @@ export class Pointer {
136
137
  * @param {PointerEvent} event - TBD.
137
138
  * @returns {Pointer} TBD.
138
139
  */
139
- public start(event: any) {
140
+ public start(event: InputEvent) {
140
141
  const { input } = this.game;
141
142
  if (event.pointerId) {
142
143
  this.pointerId = event.pointerId;
143
144
  }
144
- this.identifier = event.identifier;
145
+ this.identifier = event.identifier ?? null;
145
146
  this.target = event.target;
146
147
  if (this.isMouse) {
147
148
  this.updateButtons(event);
@@ -225,7 +226,7 @@ export class Pointer {
225
226
  * @param {boolean} fromClick - TBD.
226
227
  * @returns {Pointer} TBD.
227
228
  */
228
- public move(event: any | PointerEvent, fromClick = false) {
229
+ public move(event: InputEvent, fromClick = false) {
229
230
  const { input } = this.game;
230
231
  if (input.pollLocked) {
231
232
  return null;
@@ -233,12 +234,12 @@ export class Pointer {
233
234
  if (fromClick && this.isMouse) {
234
235
  this.updateButtons(event);
235
236
  }
236
- this.clientX = event.clientX;
237
- this.clientY = event.clientY;
238
- this.pageX = event.pageX;
239
- this.pageY = event.pageY;
240
- this.screenX = event.screenX;
241
- this.screenY = event.screenY;
237
+ this.clientX = event.clientX ?? 0;
238
+ this.clientY = event.clientY ?? 0;
239
+ this.pageX = event.pageX ?? 0;
240
+ this.pageY = event.pageY ?? 0;
241
+ this.screenX = event.screenX ?? 0;
242
+ this.screenY = event.screenY ?? 0;
242
243
  if (this.isMouse && input.mouse.locked && !fromClick) {
243
244
  this.rawMovementX = event.movementX ?? event.mozMovementX ?? event.webkitMovementX ?? 0;
244
245
  this.rawMovementY = event.movementY ?? event.mozMovementY ?? event.webkitMovementY ?? 0;
@@ -270,7 +271,8 @@ export class Pointer {
270
271
  let i = input.moveCallbacks.length;
271
272
  while (i) {
272
273
  i -= 1;
273
- input.moveCallbacks[i].callback.call(input.moveCallbacks[i].context, this, this.x, this.y, fromClick);
274
+ const moveCallback = input.moveCallbacks[i]!;
275
+ moveCallback.callback.call(moveCallback.context, this, this.x, this.y, fromClick);
274
276
  }
275
277
  // Easy out if we're dragging something and it still exists
276
278
  if (this.targetObject !== null && this.targetObject.isDragged === true) {
@@ -381,7 +383,7 @@ export class Pointer {
381
383
  * TBD.
382
384
  * @param {MouseEvent|PointerEvent} event - TBD.
383
385
  */
384
- public leave(event: any | PointerEvent) {
386
+ public leave(event: InputEvent) {
385
387
  this.withinGame = false;
386
388
  this.move(event, false);
387
389
  }
@@ -391,7 +393,7 @@ export class Pointer {
391
393
  * @param {MouseEvent|PointerEvent} event - TBD.
392
394
  * @returns {Pointer} TBD.
393
395
  */
394
- public stop(event: any | PointerEvent) {
396
+ public stop(event: InputEvent) {
395
397
  const { input } = this.game;
396
398
  if (this._stateReset && this.withinGame) {
397
399
  event.preventDefault();
@@ -427,13 +429,10 @@ export class Pointer {
427
429
  if (this.id > 0) {
428
430
  this.active = false;
429
431
  }
430
- this.withinGame = this.game.scale.bounds.contains(event.pageX, event.pageY);
432
+ this.withinGame = this.game.scale.bounds.contains(event.pageX ?? 0, event.pageY ?? 0);
431
433
  this.pointerId = null;
432
434
  this.identifier = null;
433
435
  this.positionUp.setTo(this.x, this.y);
434
- if (!this.isMouse) {
435
- input.currentPointers -= 1;
436
- }
437
436
  input.interactiveItems.callAll('_releasedHandler', this);
438
437
  if (this._clickTrampolines) {
439
438
  this._trampolineTargetObject = this.targetObject;
@@ -469,7 +468,7 @@ export class Pointer {
469
468
  * @param {object} callbackContext - TBD.
470
469
  * @param {...any} callbackArgs - TBD.
471
470
  */
472
- public addClickTrampoline(name: string, callback: Function, callbackContext: any, callbackArgs: any) {
471
+ public addClickTrampoline(name: string, callback: Function, callbackContext: unknown, callbackArgs: any) {
473
472
  if (!this.isDown) {
474
473
  return;
475
474
  }