@vpmedia/phaser 1.123.0 → 1.124.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/dist/index.js +339 -323
- package/dist/index.js.map +1 -1
- package/dist/phaser/core/animation.d.ts +3 -3
- package/dist/phaser/core/animation.d.ts.map +1 -1
- package/dist/phaser/core/animation_manager.d.ts.map +1 -1
- package/dist/phaser/core/animation_parser.d.ts +27 -2
- package/dist/phaser/core/animation_parser.d.ts.map +1 -1
- package/dist/phaser/core/array_set.d.ts +11 -11
- package/dist/phaser/core/array_set.d.ts.map +1 -1
- package/dist/phaser/core/cache.d.ts.map +1 -1
- package/dist/phaser/core/callback.d.ts.map +1 -1
- package/dist/phaser/core/dom.d.ts +125 -19
- package/dist/phaser/core/dom.d.ts.map +1 -1
- package/dist/phaser/core/factory.d.ts +3 -2
- package/dist/phaser/core/factory.d.ts.map +1 -1
- package/dist/phaser/core/input.d.ts +3 -2
- package/dist/phaser/core/input.d.ts.map +1 -1
- package/dist/phaser/core/input_handler.d.ts.map +1 -1
- package/dist/phaser/core/input_mouse.d.ts +5 -1
- package/dist/phaser/core/input_mouse.d.ts.map +1 -1
- package/dist/phaser/core/input_pointer.d.ts +3 -3
- package/dist/phaser/core/input_pointer.d.ts.map +1 -1
- package/dist/phaser/core/input_touch.d.ts +8 -8
- package/dist/phaser/core/input_touch.d.ts.map +1 -1
- package/dist/phaser/core/loader.d.ts +11 -2
- package/dist/phaser/core/loader.d.ts.map +1 -1
- package/dist/phaser/core/loader_parser.d.ts +14 -1
- package/dist/phaser/core/loader_parser.d.ts.map +1 -1
- package/dist/phaser/core/raf.d.ts +1 -1
- package/dist/phaser/core/raf.d.ts.map +1 -1
- package/dist/phaser/core/scale_manager.d.ts.map +1 -1
- package/dist/phaser/core/scene_manager.d.ts.map +1 -1
- package/dist/phaser/core/signal.d.ts.map +1 -1
- package/dist/phaser/core/sound.d.ts.map +1 -1
- package/dist/phaser/core/sound_manager.d.ts +1 -1
- package/dist/phaser/core/sound_manager.d.ts.map +1 -1
- package/dist/phaser/core/stage.d.ts +16 -6
- package/dist/phaser/core/stage.d.ts.map +1 -1
- package/dist/phaser/core/time.d.ts.map +1 -1
- package/dist/phaser/core/timer.d.ts +1 -1
- package/dist/phaser/core/timer.d.ts.map +1 -1
- package/dist/phaser/core/tween.d.ts +13 -5
- package/dist/phaser/core/tween.d.ts.map +1 -1
- package/dist/phaser/core/tween_data.d.ts +9 -7
- package/dist/phaser/core/tween_data.d.ts.map +1 -1
- package/dist/phaser/core/tween_manager.d.ts.map +1 -1
- package/dist/phaser/display/button.d.ts +6 -5
- package/dist/phaser/display/button.d.ts.map +1 -1
- package/dist/phaser/display/canvas/buffer.d.ts +1 -1
- package/dist/phaser/display/canvas/buffer.d.ts.map +1 -1
- package/dist/phaser/display/canvas/masker.d.ts +1 -1
- package/dist/phaser/display/canvas/masker.d.ts.map +1 -1
- package/dist/phaser/display/canvas/pool.d.ts +2 -2
- package/dist/phaser/display/canvas/pool.d.ts.map +1 -1
- package/dist/phaser/display/canvas/renderer.d.ts +9 -8
- package/dist/phaser/display/canvas/renderer.d.ts.map +1 -1
- package/dist/phaser/display/display_object.d.ts +3 -1
- package/dist/phaser/display/display_object.d.ts.map +1 -1
- package/dist/phaser/display/graphics.d.ts +1 -1
- package/dist/phaser/display/graphics.d.ts.map +1 -1
- package/dist/phaser/display/group.d.ts +1 -1
- package/dist/phaser/display/group.d.ts.map +1 -1
- package/dist/phaser/display/image.d.ts +6 -5
- package/dist/phaser/display/image.d.ts.map +1 -1
- package/dist/phaser/display/sprite_util.d.ts +3 -2
- package/dist/phaser/display/sprite_util.d.ts.map +1 -1
- package/dist/phaser/display/text.d.ts +2 -16
- package/dist/phaser/display/text.d.ts.map +1 -1
- package/dist/phaser/display/webgl/abstract_filter.d.ts +14 -8
- package/dist/phaser/display/webgl/abstract_filter.d.ts.map +1 -1
- package/dist/phaser/display/webgl/blend_manager.d.ts +2 -3
- package/dist/phaser/display/webgl/blend_manager.d.ts.map +1 -1
- package/dist/phaser/display/webgl/fast_sprite_batch.d.ts +11 -5
- package/dist/phaser/display/webgl/fast_sprite_batch.d.ts.map +1 -1
- package/dist/phaser/display/webgl/filter_manager.d.ts +6 -4
- package/dist/phaser/display/webgl/filter_manager.d.ts.map +1 -1
- package/dist/phaser/display/webgl/filter_texture.d.ts +4 -4
- package/dist/phaser/display/webgl/filter_texture.d.ts.map +1 -1
- package/dist/phaser/display/webgl/graphics.d.ts +2 -2
- package/dist/phaser/display/webgl/graphics.d.ts.map +1 -1
- package/dist/phaser/display/webgl/mask_manager.d.ts +3 -2
- package/dist/phaser/display/webgl/mask_manager.d.ts.map +1 -1
- package/dist/phaser/display/webgl/render_texture.d.ts +11 -8
- package/dist/phaser/display/webgl/render_texture.d.ts.map +1 -1
- package/dist/phaser/display/webgl/renderer.d.ts +8 -4
- package/dist/phaser/display/webgl/renderer.d.ts.map +1 -1
- package/dist/phaser/display/webgl/shader/normal.d.ts +28 -3
- package/dist/phaser/display/webgl/shader/normal.d.ts.map +1 -1
- package/dist/phaser/display/webgl/sprite_batch.d.ts +6 -5
- package/dist/phaser/display/webgl/sprite_batch.d.ts.map +1 -1
- package/dist/phaser/display/webgl/stencil_manager.d.ts +3 -3
- package/dist/phaser/display/webgl/stencil_manager.d.ts.map +1 -1
- package/dist/phaser/display/webgl/texture_util.d.ts +2 -2
- package/dist/phaser/display/webgl/texture_util.d.ts.map +1 -1
- package/dist/phaser/display/webgl/util.d.ts +1 -1
- package/dist/phaser/display/webgl/util.d.ts.map +1 -1
- package/dist/phaser/geom/circle.d.ts.map +1 -1
- package/dist/phaser/geom/line.d.ts +10 -1
- package/dist/phaser/geom/line.d.ts.map +1 -1
- package/dist/phaser/geom/rectangle.d.ts.map +1 -1
- package/dist/phaser/geom/util/circle.d.ts +2 -1
- package/dist/phaser/geom/util/circle.d.ts.map +1 -1
- package/dist/phaser/geom/util/point.d.ts +1 -1
- package/dist/phaser/geom/util/point.d.ts.map +1 -1
- package/dist/phaser/geom/util/rectangle.d.ts +1 -1
- package/dist/phaser/geom/util/rectangle.d.ts.map +1 -1
- package/dist/phaser/util/math.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/phaser/core/animation.ts +4 -4
- package/src/phaser/core/animation_manager.ts +10 -10
- package/src/phaser/core/animation_parser.ts +30 -24
- package/src/phaser/core/array_set.ts +27 -27
- package/src/phaser/core/cache.test.ts +33 -33
- package/src/phaser/core/cache.ts +3 -3
- package/src/phaser/core/callback.ts +1 -0
- package/src/phaser/core/callback_context.test.ts +8 -8
- package/src/phaser/core/dom.ts +15 -5
- package/src/phaser/core/factory.ts +9 -2
- package/src/phaser/core/frame_data.test.ts +23 -23
- package/src/phaser/core/input.ts +9 -8
- package/src/phaser/core/input_handler.test.ts +18 -18
- package/src/phaser/core/input_handler.ts +1 -1
- package/src/phaser/core/input_mouse.ts +9 -8
- package/src/phaser/core/input_pointer.test.ts +26 -26
- package/src/phaser/core/input_pointer.ts +3 -3
- package/src/phaser/core/input_touch.ts +8 -8
- package/src/phaser/core/loader.test.ts +26 -26
- package/src/phaser/core/loader.ts +25 -25
- package/src/phaser/core/loader_parser.test.ts +16 -16
- package/src/phaser/core/loader_parser.ts +16 -6
- package/src/phaser/core/raf.ts +1 -1
- package/src/phaser/core/registry.test.ts +6 -6
- package/src/phaser/core/scale_manager.ts +2 -2
- package/src/phaser/core/scene_manager.test.ts +30 -30
- package/src/phaser/core/scene_manager.ts +1 -1
- package/src/phaser/core/signal.test.ts +8 -8
- package/src/phaser/core/signal.ts +1 -1
- package/src/phaser/core/signal_dispatch.test.ts +30 -30
- package/src/phaser/core/sound.ts +20 -8
- package/src/phaser/core/sound_manager.ts +6 -6
- package/src/phaser/core/stage.ts +19 -9
- package/src/phaser/core/time.ts +1 -1
- package/src/phaser/core/timer.test.ts +47 -47
- package/src/phaser/core/timer.ts +1 -1
- package/src/phaser/core/tween.ts +28 -25
- package/src/phaser/core/tween_data.test.ts +119 -0
- package/src/phaser/core/tween_data.ts +54 -39
- package/src/phaser/core/tween_easing.test.ts +5 -5
- package/src/phaser/core/tween_manager.ts +2 -2
- package/src/phaser/display/bitmap_text.test.ts +30 -30
- package/src/phaser/display/button.ts +8 -6
- package/src/phaser/display/canvas/buffer.ts +2 -2
- package/src/phaser/display/canvas/masker.ts +1 -1
- package/src/phaser/display/canvas/pool.test.ts +20 -20
- package/src/phaser/display/canvas/pool.ts +3 -3
- package/src/phaser/display/canvas/renderer.ts +12 -11
- package/src/phaser/display/canvas/util.test.ts +25 -25
- package/src/phaser/display/display_object.ts +3 -1
- package/src/phaser/display/graphics.test.ts +70 -20
- package/src/phaser/display/graphics.ts +38 -32
- package/src/phaser/display/group.ts +4 -4
- package/src/phaser/display/image.ts +28 -25
- package/src/phaser/display/sprite_util.ts +3 -2
- package/src/phaser/display/text.test.ts +28 -25
- package/src/phaser/display/text.ts +21 -18
- package/src/phaser/display/webgl/abstract_filter.ts +20 -10
- package/src/phaser/display/webgl/blend_manager.ts +4 -5
- package/src/phaser/display/webgl/earcut.test.ts +20 -20
- package/src/phaser/display/webgl/fast_sprite_batch.ts +21 -16
- package/src/phaser/display/webgl/filter_manager.ts +7 -4
- package/src/phaser/display/webgl/filter_texture.ts +5 -5
- package/src/phaser/display/webgl/graphics.ts +2 -2
- package/src/phaser/display/webgl/mask_manager.ts +9 -14
- package/src/phaser/display/webgl/render_texture.ts +15 -14
- package/src/phaser/display/webgl/renderer.ts +7 -6
- package/src/phaser/display/webgl/shader/normal.ts +41 -31
- package/src/phaser/display/webgl/shader/shader.test.ts +24 -24
- package/src/phaser/display/webgl/shader_manager.test.ts +18 -18
- package/src/phaser/display/webgl/sprite_batch.ts +8 -8
- package/src/phaser/display/webgl/stencil_manager.ts +4 -4
- package/src/phaser/display/webgl/texture_util.ts +2 -2
- package/src/phaser/display/webgl/util.ts +1 -1
- package/src/phaser/geom/circle.test.ts +38 -38
- package/src/phaser/geom/circle.ts +7 -7
- package/src/phaser/geom/ellipse.test.ts +12 -12
- package/src/phaser/geom/line.test.ts +15 -15
- package/src/phaser/geom/line.ts +5 -2
- package/src/phaser/geom/matrix.test.ts +31 -31
- package/src/phaser/geom/point.test.ts +31 -31
- package/src/phaser/geom/polygon.test.ts +27 -27
- package/src/phaser/geom/rectangle.test.ts +87 -87
- package/src/phaser/geom/rectangle.ts +11 -11
- package/src/phaser/geom/rounded_rectangle.test.ts +9 -9
- package/src/phaser/geom/util/circle.test.ts +5 -5
- package/src/phaser/geom/util/circle.ts +2 -1
- package/src/phaser/geom/util/ellipse.test.ts +2 -2
- package/src/phaser/geom/util/line.test.ts +2 -2
- package/src/phaser/geom/util/matrix.test.ts +4 -4
- package/src/phaser/geom/util/point.test.ts +2 -2
- package/src/phaser/geom/util/point.ts +1 -1
- package/src/phaser/geom/util/polygon.test.ts +2 -2
- package/src/phaser/geom/util/rectangle.test.ts +2 -2
- package/src/phaser/geom/util/rectangle.ts +1 -1
- package/src/phaser/geom/util/rounded_rectangle.test.ts +2 -2
- package/src/phaser/util/math.test.ts +41 -41
- package/src/phaser/util/math.ts +5 -2
package/src/phaser/core/input.ts
CHANGED
|
@@ -14,6 +14,7 @@ import type { Game } from './game.js';
|
|
|
14
14
|
import type { DisplayObject } from '../display/display_object.js';
|
|
15
15
|
import type { InputEvent } from './input_event.js';
|
|
16
16
|
import type { CandidateHandler, PointerMoveCallback } from './callback.js';
|
|
17
|
+
import type { InputHandler } from './input_handler.js';
|
|
17
18
|
|
|
18
19
|
const MAX_POINTERS = 10;
|
|
19
20
|
|
|
@@ -50,7 +51,7 @@ export class Input {
|
|
|
50
51
|
public pointer7!: Pointer | null;
|
|
51
52
|
public pointer8!: Pointer | null;
|
|
52
53
|
public pointer9!: Pointer | null;
|
|
53
|
-
public pointer10!:
|
|
54
|
+
public pointer10!: Pointer | null;
|
|
54
55
|
public pointers!: Pointer[];
|
|
55
56
|
public activePointer!: Pointer;
|
|
56
57
|
public mousePointer!: Pointer;
|
|
@@ -63,7 +64,7 @@ export class Input {
|
|
|
63
64
|
public onTap!: Signal;
|
|
64
65
|
public onHold!: Signal;
|
|
65
66
|
public minPriorityID!: number;
|
|
66
|
-
public interactiveItems!: ArraySet
|
|
67
|
+
public interactiveItems!: ArraySet<InputHandler>;
|
|
67
68
|
public _localPoint!: Point;
|
|
68
69
|
public _pollCounter!: number;
|
|
69
70
|
public _oldPosition!: Point;
|
|
@@ -118,7 +119,7 @@ export class Input {
|
|
|
118
119
|
this.onTap = null!;
|
|
119
120
|
this.onHold = null!;
|
|
120
121
|
this.minPriorityID = 0;
|
|
121
|
-
this.interactiveItems = new ArraySet();
|
|
122
|
+
this.interactiveItems = new ArraySet<InputHandler>();
|
|
122
123
|
this._localPoint = new Point();
|
|
123
124
|
this._pollCounter = 0;
|
|
124
125
|
this._oldPosition = null!;
|
|
@@ -291,7 +292,7 @@ export class Input {
|
|
|
291
292
|
* @param {MouseEvent|TouchEvent|PointerEvent} event - TBD.
|
|
292
293
|
* @returns {Pointer} TBD.
|
|
293
294
|
*/
|
|
294
|
-
public startPointer(event: InputEvent) {
|
|
295
|
+
public startPointer(event: InputEvent): Pointer | null {
|
|
295
296
|
if (this.maxPointers >= 0 && this.countActivePointers(this.maxPointers) >= this.maxPointers) {
|
|
296
297
|
return null;
|
|
297
298
|
}
|
|
@@ -315,7 +316,7 @@ export class Input {
|
|
|
315
316
|
* @param {MouseEvent|TouchEvent|PointerEvent} event - TBD.
|
|
316
317
|
* @returns {Pointer} TBD.
|
|
317
318
|
*/
|
|
318
|
-
public updatePointer(event: InputEvent) {
|
|
319
|
+
public updatePointer(event: InputEvent): Pointer | null {
|
|
319
320
|
if (this.pointer1.active && this.pointer1.identifier === event.identifier) {
|
|
320
321
|
return this.pointer1.move(event);
|
|
321
322
|
}
|
|
@@ -336,7 +337,7 @@ export class Input {
|
|
|
336
337
|
* @param {MouseEvent|TouchEvent|PointerEvent} event - TBD.
|
|
337
338
|
* @returns {Pointer} TBD.
|
|
338
339
|
*/
|
|
339
|
-
public stopPointer(event: InputEvent) {
|
|
340
|
+
public stopPointer(event: InputEvent): Pointer | null {
|
|
340
341
|
if (this.pointer1.active && this.pointer1.identifier === event.identifier) {
|
|
341
342
|
return this.pointer1.stop(event);
|
|
342
343
|
}
|
|
@@ -489,7 +490,7 @@ export class Input {
|
|
|
489
490
|
/**
|
|
490
491
|
* TBD.
|
|
491
492
|
*/
|
|
492
|
-
public set x(value) {
|
|
493
|
+
public set x(value: number) {
|
|
493
494
|
this._x = Math.floor(value);
|
|
494
495
|
}
|
|
495
496
|
|
|
@@ -504,7 +505,7 @@ export class Input {
|
|
|
504
505
|
/**
|
|
505
506
|
* TBD.
|
|
506
507
|
*/
|
|
507
|
-
public set y(value) {
|
|
508
|
+
public set y(value: number) {
|
|
508
509
|
this._y = Math.floor(value);
|
|
509
510
|
}
|
|
510
511
|
|
|
@@ -9,28 +9,28 @@ const createSprite = (): Image =>
|
|
|
9
9
|
game: {
|
|
10
10
|
time: { time: 0 },
|
|
11
11
|
canvas: { style: { cursor: 'default' } },
|
|
12
|
-
input: { interactiveItems: { add: () => undefined, remove: () => undefined } },
|
|
12
|
+
input: { interactiveItems: { add: (): undefined => undefined, remove: (): undefined => undefined } },
|
|
13
13
|
},
|
|
14
14
|
events: {
|
|
15
|
-
onAddedToGroup: { add: () => undefined },
|
|
16
|
-
onRemovedFromGroup: { add: () => undefined },
|
|
15
|
+
onAddedToGroup: { add: (): undefined => undefined },
|
|
16
|
+
onRemovedFromGroup: { add: (): undefined => undefined },
|
|
17
17
|
},
|
|
18
18
|
}) as unknown as Image;
|
|
19
19
|
|
|
20
|
-
describe('InputHandler', () => {
|
|
21
|
-
describe('pointerData', () => {
|
|
22
|
-
it('seeds pointer 0 from the constructor', () => {
|
|
20
|
+
describe('InputHandler', (): void => {
|
|
21
|
+
describe('pointerData', (): void => {
|
|
22
|
+
it('seeds pointer 0 from the constructor', (): void => {
|
|
23
23
|
const handler = new InputHandler(createSprite());
|
|
24
24
|
expect(handler._pointerData).toHaveLength(1);
|
|
25
25
|
expect(handler.pointerData(0).id).toBe(0);
|
|
26
26
|
});
|
|
27
27
|
|
|
28
|
-
it('returns the same record on repeat access', () => {
|
|
28
|
+
it('returns the same record on repeat access', (): void => {
|
|
29
29
|
const handler = new InputHandler(createSprite());
|
|
30
30
|
expect(handler.pointerData(0)).toBe(handler.pointerData(0));
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
-
it('creates a record on first access of an unseeded pointer', () => {
|
|
33
|
+
it('creates a record on first access of an unseeded pointer', (): void => {
|
|
34
34
|
const handler = new InputHandler(createSprite());
|
|
35
35
|
const data = handler.pointerData(7);
|
|
36
36
|
expect(data.id).toBe(7);
|
|
@@ -38,13 +38,13 @@ describe('InputHandler', () => {
|
|
|
38
38
|
expect(handler.pointerData(7)).toBe(data);
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
it('hands back a record whose mutations are visible through the array', () => {
|
|
41
|
+
it('hands back a record whose mutations are visible through the array', (): void => {
|
|
42
42
|
const handler = new InputHandler(createSprite());
|
|
43
43
|
handler.pointerData(3).isOver = true;
|
|
44
44
|
expect(handler._pointerData[3]?.isOver).toBe(true);
|
|
45
45
|
});
|
|
46
46
|
|
|
47
|
-
it('exposes every field a fresh record needs', () => {
|
|
47
|
+
it('exposes every field a fresh record needs', (): void => {
|
|
48
48
|
const handler = new InputHandler(createSprite());
|
|
49
49
|
expect(handler.pointerData(1)).toStrictEqual({
|
|
50
50
|
id: 1,
|
|
@@ -66,18 +66,18 @@ describe('InputHandler', () => {
|
|
|
66
66
|
});
|
|
67
67
|
});
|
|
68
68
|
|
|
69
|
-
describe('start', () => {
|
|
70
|
-
it('populates the ten pointer slots the input system tracks', () => {
|
|
69
|
+
describe('start', (): void => {
|
|
70
|
+
it('populates the ten pointer slots the input system tracks', (): void => {
|
|
71
71
|
const handler = new InputHandler(createSprite());
|
|
72
72
|
handler.start();
|
|
73
73
|
expect(handler._pointerData).toHaveLength(10);
|
|
74
|
-
expect(handler._pointerData.map((data) => data.id)).toStrictEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
74
|
+
expect(handler._pointerData.map((data): number => data.id)).toStrictEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
75
75
|
expect(handler.enabled).toBe(true);
|
|
76
76
|
});
|
|
77
77
|
});
|
|
78
78
|
|
|
79
|
-
describe('reset', () => {
|
|
80
|
-
it('clears pointer state back to a fresh record', () => {
|
|
79
|
+
describe('reset', (): void => {
|
|
80
|
+
it('clears pointer state back to a fresh record', (): void => {
|
|
81
81
|
const handler = new InputHandler(createSprite());
|
|
82
82
|
handler.start();
|
|
83
83
|
handler.pointerData(2).isDown = true;
|
|
@@ -89,8 +89,8 @@ describe('InputHandler', () => {
|
|
|
89
89
|
});
|
|
90
90
|
});
|
|
91
91
|
|
|
92
|
-
describe('pointer accessors', () => {
|
|
93
|
-
it('read through to the backing record', () => {
|
|
92
|
+
describe('pointer accessors', (): void => {
|
|
93
|
+
it('read through to the backing record', (): void => {
|
|
94
94
|
const handler = new InputHandler(createSprite());
|
|
95
95
|
handler.start();
|
|
96
96
|
const data = handler.pointerData(4);
|
|
@@ -104,7 +104,7 @@ describe('InputHandler', () => {
|
|
|
104
104
|
expect(handler.pointerTimeDown(4)).toBe(99);
|
|
105
105
|
});
|
|
106
106
|
|
|
107
|
-
it('default to pointer 0', () => {
|
|
107
|
+
it('default to pointer 0', (): void => {
|
|
108
108
|
const handler = new InputHandler(createSprite());
|
|
109
109
|
handler.pointerData(0).x = 5;
|
|
110
110
|
expect(handler.pointerX()).toBe(5);
|
|
@@ -138,7 +138,7 @@ export class InputHandler {
|
|
|
138
138
|
* @param {boolean} useHandCursor - TBD.
|
|
139
139
|
* @returns {DisplayObject} TBD.
|
|
140
140
|
*/
|
|
141
|
-
public start(priority = 0, useHandCursor = false) {
|
|
141
|
+
public start(priority = 0, useHandCursor = false): Image {
|
|
142
142
|
// Turning on
|
|
143
143
|
if (!this.enabled) {
|
|
144
144
|
// Register, etc
|
|
@@ -2,6 +2,9 @@ import type { InputEvent } from './input_event.js';
|
|
|
2
2
|
import type { Input } from './input.js';
|
|
3
3
|
import type { Game } from './game.js';
|
|
4
4
|
|
|
5
|
+
/** The legacy wheel-event adapter Phaser 2 installed for old browsers; nothing sets it any more. */
|
|
6
|
+
export type WheelEventProxy = { bindEvent: (event: InputEvent) => InputEvent };
|
|
7
|
+
|
|
5
8
|
export class Mouse {
|
|
6
9
|
public game!: Game;
|
|
7
10
|
public input!: Input;
|
|
@@ -27,7 +30,7 @@ export class Mouse {
|
|
|
27
30
|
public _onMouseWheel: EventListener | null;
|
|
28
31
|
public _onMouseUpGlobal!: EventListener;
|
|
29
32
|
public _onMouseOutGlobal!: EventListener;
|
|
30
|
-
public _wheelEvent!:
|
|
33
|
+
public _wheelEvent!: WheelEventProxy | null;
|
|
31
34
|
/**
|
|
32
35
|
* TBD.
|
|
33
36
|
* @param {Game} game - TBD.
|
|
@@ -262,15 +265,13 @@ export class Mouse {
|
|
|
262
265
|
* @param {WheelEvent} event - TBD.
|
|
263
266
|
*/
|
|
264
267
|
public onMouseWheel(event: InputEvent): void {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
this.event = event;
|
|
269
|
-
this.eventPreventDefault(event);
|
|
268
|
+
const wheelEvent = this._wheelEvent ? this._wheelEvent.bindEvent(event) : event;
|
|
269
|
+
this.event = wheelEvent;
|
|
270
|
+
this.eventPreventDefault(wheelEvent);
|
|
270
271
|
// reverse detail for firefox
|
|
271
|
-
this.wheelDelta = Math.max(-1, Math.min(1, -(
|
|
272
|
+
this.wheelDelta = Math.max(-1, Math.min(1, -(wheelEvent.deltaY ?? 0)));
|
|
272
273
|
if (this.mouseWheelCallback) {
|
|
273
|
-
this.mouseWheelCallback.call(this.callbackContext,
|
|
274
|
+
this.mouseWheelCallback.call(this.callbackContext, wheelEvent);
|
|
274
275
|
}
|
|
275
276
|
}
|
|
276
277
|
|
|
@@ -9,82 +9,82 @@ import { Pointer } from './input_pointer.js';
|
|
|
9
9
|
const createGame = (): Game =>
|
|
10
10
|
({
|
|
11
11
|
time: { time: 0 },
|
|
12
|
-
scale: { bounds: { contains: () => true }, offset: { x: 0, y: 0 } },
|
|
12
|
+
scale: { bounds: { contains: (): boolean => true }, offset: { x: 0, y: 0 } },
|
|
13
13
|
input: {
|
|
14
14
|
enabled: true,
|
|
15
15
|
multiInputOverride: 0,
|
|
16
16
|
moveCallbacks: [],
|
|
17
|
-
interactiveItems: { total: 0, callAll: () => undefined },
|
|
17
|
+
interactiveItems: { total: 0, callAll: (): undefined => undefined },
|
|
18
18
|
mouse: { locked: false },
|
|
19
19
|
scale: new Point(1, 1),
|
|
20
20
|
position: new Point(),
|
|
21
21
|
circle: new Circle(),
|
|
22
22
|
speed: new Point(),
|
|
23
23
|
activePointer: null,
|
|
24
|
-
onDown: { dispatch: () => undefined },
|
|
25
|
-
onUp: { dispatch: () => undefined },
|
|
26
|
-
onHold: { dispatch: () => undefined },
|
|
27
|
-
onTap: { dispatch: () => undefined },
|
|
24
|
+
onDown: { dispatch: (): undefined => undefined },
|
|
25
|
+
onUp: { dispatch: (): undefined => undefined },
|
|
26
|
+
onHold: { dispatch: (): undefined => undefined },
|
|
27
|
+
onTap: { dispatch: (): undefined => undefined },
|
|
28
28
|
x: 0,
|
|
29
29
|
y: 0,
|
|
30
|
-
resetSpeed: () => undefined,
|
|
30
|
+
resetSpeed: (): undefined => undefined,
|
|
31
31
|
},
|
|
32
32
|
}) as unknown as Game;
|
|
33
33
|
|
|
34
34
|
const createPointer = (id = 1): Pointer => new Pointer(createGame(), id, POINTER_CURSOR);
|
|
35
35
|
|
|
36
36
|
const event = (fields: Partial<InputEvent> = {}): InputEvent =>
|
|
37
|
-
({ type: 'pointerdown', target: null, preventDefault: () => undefined, ...fields }) as InputEvent;
|
|
37
|
+
({ type: 'pointerdown', target: null, preventDefault: (): undefined => undefined, ...fields }) as InputEvent;
|
|
38
38
|
|
|
39
|
-
describe('Pointer', () => {
|
|
40
|
-
describe('updateButtons', () => {
|
|
41
|
-
it('reads a down event as pressed', () => {
|
|
39
|
+
describe('Pointer', (): void => {
|
|
40
|
+
describe('updateButtons', (): void => {
|
|
41
|
+
it('reads a down event as pressed', (): void => {
|
|
42
42
|
const pointer = createPointer();
|
|
43
43
|
pointer.updateButtons(event({ type: 'pointerdown' }));
|
|
44
44
|
expect(pointer.isDown).toBe(true);
|
|
45
45
|
expect(pointer.isUp).toBe(false);
|
|
46
46
|
});
|
|
47
47
|
|
|
48
|
-
it('reads an up event as released', () => {
|
|
48
|
+
it('reads an up event as released', (): void => {
|
|
49
49
|
const pointer = createPointer();
|
|
50
50
|
pointer.updateButtons(event({ type: 'pointerup' }));
|
|
51
51
|
expect(pointer.isDown).toBe(false);
|
|
52
52
|
expect(pointer.isUp).toBe(true);
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
-
it('matches the suffix case insensitively, as the legacy events are capitalised', () => {
|
|
55
|
+
it('matches the suffix case insensitively, as the legacy events are capitalised', (): void => {
|
|
56
56
|
const pointer = createPointer();
|
|
57
57
|
pointer.updateButtons(event({ type: 'MSPointerDown' }));
|
|
58
58
|
expect(pointer.isDown).toBe(true);
|
|
59
59
|
});
|
|
60
60
|
|
|
61
|
-
it('treats a move event as not pressed', () => {
|
|
61
|
+
it('treats a move event as not pressed', (): void => {
|
|
62
62
|
const pointer = createPointer();
|
|
63
63
|
pointer.updateButtons(event({ type: 'pointermove' }));
|
|
64
64
|
expect(pointer.isUp).toBe(true);
|
|
65
65
|
});
|
|
66
66
|
});
|
|
67
67
|
|
|
68
|
-
describe('start', () => {
|
|
69
|
-
it('records the identifier the event carries', () => {
|
|
68
|
+
describe('start', (): void => {
|
|
69
|
+
it('records the identifier the event carries', (): void => {
|
|
70
70
|
const pointer = createPointer();
|
|
71
71
|
pointer.start(event({ identifier: 7 }));
|
|
72
72
|
expect(pointer.identifier).toBe(7);
|
|
73
73
|
});
|
|
74
74
|
|
|
75
|
-
it('records a null identifier when the event has none', () => {
|
|
75
|
+
it('records a null identifier when the event has none', (): void => {
|
|
76
76
|
const pointer = createPointer();
|
|
77
77
|
pointer.start(event({}));
|
|
78
78
|
expect(pointer.identifier).toBeNull();
|
|
79
79
|
});
|
|
80
80
|
|
|
81
|
-
it('records the pointerId when the event carries one', () => {
|
|
81
|
+
it('records the pointerId when the event carries one', (): void => {
|
|
82
82
|
const pointer = createPointer();
|
|
83
83
|
pointer.start(event({ pointerId: 3 }));
|
|
84
84
|
expect(pointer.pointerId).toBe(3);
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
-
it('marks the pointer active and down', () => {
|
|
87
|
+
it('marks the pointer active and down', (): void => {
|
|
88
88
|
const pointer = createPointer();
|
|
89
89
|
pointer.start(event({ identifier: 1 }));
|
|
90
90
|
expect(pointer.active).toBe(true);
|
|
@@ -92,8 +92,8 @@ describe('Pointer', () => {
|
|
|
92
92
|
});
|
|
93
93
|
});
|
|
94
94
|
|
|
95
|
-
describe('move', () => {
|
|
96
|
-
it('copies the coordinate set off the event', () => {
|
|
95
|
+
describe('move', (): void => {
|
|
96
|
+
it('copies the coordinate set off the event', (): void => {
|
|
97
97
|
const pointer = createPointer();
|
|
98
98
|
pointer.start(event({ identifier: 1 }));
|
|
99
99
|
pointer.move(
|
|
@@ -115,7 +115,7 @@ describe('Pointer', () => {
|
|
|
115
115
|
expect(pointer.screenY).toBe(66);
|
|
116
116
|
});
|
|
117
117
|
|
|
118
|
-
it('falls back to zero for coordinates the event omits', () => {
|
|
118
|
+
it('falls back to zero for coordinates the event omits', (): void => {
|
|
119
119
|
const pointer = createPointer();
|
|
120
120
|
pointer.start(event({ identifier: 1 }));
|
|
121
121
|
pointer.move(event({ type: 'pointermove' }));
|
|
@@ -124,8 +124,8 @@ describe('Pointer', () => {
|
|
|
124
124
|
});
|
|
125
125
|
});
|
|
126
126
|
|
|
127
|
-
describe('stop', () => {
|
|
128
|
-
it('clears the identifiers it recorded', () => {
|
|
127
|
+
describe('stop', (): void => {
|
|
128
|
+
it('clears the identifiers it recorded', (): void => {
|
|
129
129
|
const pointer = createPointer();
|
|
130
130
|
pointer.start(event({ identifier: 5, pointerId: 5 }));
|
|
131
131
|
pointer.stop(event({ type: 'pointerup' }));
|
|
@@ -135,8 +135,8 @@ describe('Pointer', () => {
|
|
|
135
135
|
});
|
|
136
136
|
});
|
|
137
137
|
|
|
138
|
-
describe('reset', () => {
|
|
139
|
-
it('returns the pointer to its resting state', () => {
|
|
138
|
+
describe('reset', (): void => {
|
|
139
|
+
it('returns the pointer to its resting state', (): void => {
|
|
140
140
|
const pointer = createPointer();
|
|
141
141
|
pointer.start(event({ identifier: 5 }));
|
|
142
142
|
pointer.reset();
|
|
@@ -362,7 +362,7 @@ export class Pointer {
|
|
|
362
362
|
* @param {InputHandler} newTarget - TBD.
|
|
363
363
|
* @param {boolean} silent - TBD.
|
|
364
364
|
*/
|
|
365
|
-
public swapTarget(newTarget: InputHandler, silent = false): void {
|
|
365
|
+
public swapTarget(newTarget: InputHandler | null, silent = false): void {
|
|
366
366
|
// Now we know the top-most item (if any) we can process it
|
|
367
367
|
if (newTarget === null) {
|
|
368
368
|
// The pointer isn't currently over anything, check if we've got a lingering previous target
|
|
@@ -456,7 +456,7 @@ export class Pointer {
|
|
|
456
456
|
* @param {number} duration - TBD.
|
|
457
457
|
* @returns {boolean} TBD.
|
|
458
458
|
*/
|
|
459
|
-
public justPressed(duration
|
|
459
|
+
public justPressed(duration = 0): boolean {
|
|
460
460
|
const window = duration || this.game.input.justPressedRate;
|
|
461
461
|
return this.isDown && this.timeDown + window > this.game.time.time;
|
|
462
462
|
}
|
|
@@ -466,7 +466,7 @@ export class Pointer {
|
|
|
466
466
|
* @param {number} duration - TBD.
|
|
467
467
|
* @returns {boolean} TBD.
|
|
468
468
|
*/
|
|
469
|
-
public justReleased(duration
|
|
469
|
+
public justReleased(duration = 0): boolean {
|
|
470
470
|
const window = duration || this.game.input.justReleasedRate;
|
|
471
471
|
return this.isUp && this.timeUp + window > this.game.time.time;
|
|
472
472
|
}
|
|
@@ -2,15 +2,15 @@ import type { Game } from './game.js';
|
|
|
2
2
|
import type { InputEvent } from './input_event.js';
|
|
3
3
|
export class Touch {
|
|
4
4
|
public game!: Game;
|
|
5
|
-
public enabled!:
|
|
5
|
+
public enabled!: boolean;
|
|
6
6
|
public callbackContext!: unknown;
|
|
7
|
-
public touchStartCallback
|
|
8
|
-
public touchMoveCallback
|
|
9
|
-
public touchEndCallback
|
|
10
|
-
public touchEnterCallback
|
|
11
|
-
public touchLeaveCallback
|
|
12
|
-
public touchCancelCallback
|
|
13
|
-
public preventDefault!:
|
|
7
|
+
public touchStartCallback: EventListener | null;
|
|
8
|
+
public touchMoveCallback: EventListener | null;
|
|
9
|
+
public touchEndCallback: EventListener | null;
|
|
10
|
+
public touchEnterCallback: EventListener | null;
|
|
11
|
+
public touchLeaveCallback: EventListener | null;
|
|
12
|
+
public touchCancelCallback: EventListener | null;
|
|
13
|
+
public preventDefault!: boolean;
|
|
14
14
|
public event!: InputEvent | null;
|
|
15
15
|
public _onTouchStart: EventListener | null;
|
|
16
16
|
public _onTouchMove: EventListener | null;
|
|
@@ -4,7 +4,7 @@ import { Loader } from './loader.js';
|
|
|
4
4
|
|
|
5
5
|
const createGame = (formats: Record<string, boolean> = {}, noAudio = false): Game =>
|
|
6
6
|
({
|
|
7
|
-
logger: { warn: () => undefined, info: () => undefined, debug: () => undefined },
|
|
7
|
+
logger: { warn: (): undefined => undefined, info: (): undefined => undefined, debug: (): undefined => undefined },
|
|
8
8
|
config: { maxParallelDownloads: 4 },
|
|
9
9
|
cache: {},
|
|
10
10
|
sound: { noAudio },
|
|
@@ -14,35 +14,35 @@ const createGame = (formats: Record<string, boolean> = {}, noAudio = false): Gam
|
|
|
14
14
|
const createLoader = (formats: Record<string, boolean> = {}, noAudio = false): Loader =>
|
|
15
15
|
new Loader(createGame(formats, noAudio));
|
|
16
16
|
|
|
17
|
-
describe('Loader', () => {
|
|
18
|
-
describe('getAudioURL', () => {
|
|
19
|
-
it('returns null when the device has no audio', () => {
|
|
17
|
+
describe('Loader', (): void => {
|
|
18
|
+
describe('getAudioURL', (): void => {
|
|
19
|
+
it('returns null when the device has no audio', (): void => {
|
|
20
20
|
expect(createLoader({}, true).getAudioURL(['track.ogg'])).toBeNull();
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
-
it('picks a plain url whose extension the device can play', () => {
|
|
23
|
+
it('picks a plain url whose extension the device can play', (): void => {
|
|
24
24
|
expect(createLoader({ ogg: true }).getAudioURL(['track.ogg'])).toBe('track.ogg');
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
-
it('skips an extension the device cannot play', () => {
|
|
27
|
+
it('skips an extension the device cannot play', (): void => {
|
|
28
28
|
expect(createLoader({ ogg: false, mp3: true }).getAudioURL(['track.ogg', 'track.mp3'])).toBe('track.mp3');
|
|
29
29
|
});
|
|
30
30
|
|
|
31
|
-
it('returns null when no candidate is playable', () => {
|
|
31
|
+
it('returns null when no candidate is playable', (): void => {
|
|
32
32
|
expect(createLoader({ ogg: false, mp3: false }).getAudioURL(['track.ogg', 'track.mp3'])).toBeNull();
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
-
it('accepts a bare string as a single candidate', () => {
|
|
35
|
+
it('accepts a bare string as a single candidate', (): void => {
|
|
36
36
|
expect(createLoader({ mp3: true }).getAudioURL('track.mp3')).toBe('track.mp3');
|
|
37
37
|
});
|
|
38
38
|
|
|
39
|
-
it('reads the format from a uri and type pair', () => {
|
|
39
|
+
it('reads the format from a uri and type pair', (): void => {
|
|
40
40
|
expect(createLoader({ ogg: true }).getAudioURL([{ uri: 'track-no-extension', type: 'ogg' }])).toBe(
|
|
41
41
|
'track-no-extension'
|
|
42
42
|
);
|
|
43
43
|
});
|
|
44
44
|
|
|
45
|
-
it('skips a pair whose type the device cannot play', () => {
|
|
45
|
+
it('skips a pair whose type the device cannot play', (): void => {
|
|
46
46
|
const loader = createLoader({ ogg: false, mp3: true });
|
|
47
47
|
expect(
|
|
48
48
|
loader.getAudioURL([
|
|
@@ -52,55 +52,55 @@ describe('Loader', () => {
|
|
|
52
52
|
).toBe('b');
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
-
it('takes a blob url without checking the format', () => {
|
|
55
|
+
it('takes a blob url without checking the format', (): void => {
|
|
56
56
|
expect(createLoader().getAudioURL(['blob:https://example.test/abc'])).toBe('blob:https://example.test/abc');
|
|
57
57
|
});
|
|
58
58
|
|
|
59
|
-
it('takes a data uri without checking the format', () => {
|
|
59
|
+
it('takes a data uri without checking the format', (): void => {
|
|
60
60
|
expect(createLoader().getAudioURL(['data:audio/mp3;base64,AAAA'])).toBe('data:audio/mp3;base64,AAAA');
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
-
it('ignores a query string when reading the extension', () => {
|
|
63
|
+
it('ignores a query string when reading the extension', (): void => {
|
|
64
64
|
expect(createLoader({ mp3: true }).getAudioURL(['track.mp3?v=2'])).toBe('track.mp3?v=2');
|
|
65
65
|
});
|
|
66
66
|
|
|
67
|
-
it('returns null for an empty candidate list', () => {
|
|
67
|
+
it('returns null for an empty candidate list', (): void => {
|
|
68
68
|
expect(createLoader({ mp3: true }).getAudioURL([])).toBeNull();
|
|
69
69
|
});
|
|
70
70
|
});
|
|
71
71
|
|
|
72
|
-
describe('transformUrl', () => {
|
|
72
|
+
describe('transformUrl', (): void => {
|
|
73
73
|
const file = { path: 'assets/' } as Parameters<Loader['transformUrl']>[1];
|
|
74
74
|
|
|
75
|
-
it('returns false for a missing url', () => {
|
|
75
|
+
it('returns false for a missing url', (): void => {
|
|
76
76
|
expect(createLoader().transformUrl(null, file)).toBe(false);
|
|
77
77
|
});
|
|
78
78
|
|
|
79
|
-
it('returns false for an unresolved candidate list', () => {
|
|
79
|
+
it('returns false for an unresolved candidate list', (): void => {
|
|
80
80
|
expect(createLoader().transformUrl(['a.mp3'], file)).toBe(false);
|
|
81
81
|
});
|
|
82
82
|
|
|
83
|
-
it('passes an absolute url through', () => {
|
|
83
|
+
it('passes an absolute url through', (): void => {
|
|
84
84
|
expect(createLoader().transformUrl('https://example.test/a.png', file)).toBe('https://example.test/a.png');
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
-
it('passes a protocol relative url through', () => {
|
|
87
|
+
it('passes a protocol relative url through', (): void => {
|
|
88
88
|
expect(createLoader().transformUrl('//example.test/a.png', file)).toBe('//example.test/a.png');
|
|
89
89
|
});
|
|
90
90
|
|
|
91
|
-
it('passes a data uri through', () => {
|
|
91
|
+
it('passes a data uri through', (): void => {
|
|
92
92
|
expect(createLoader().transformUrl('data:image/png;base64,AAAA', file)).toBe('data:image/png;base64,AAAA');
|
|
93
93
|
});
|
|
94
94
|
|
|
95
|
-
it('prefixes a relative url with the base url and file path', () => {
|
|
95
|
+
it('prefixes a relative url with the base url and file path', (): void => {
|
|
96
96
|
const loader = createLoader();
|
|
97
97
|
loader.baseURL = 'https://cdn.test/';
|
|
98
98
|
expect(loader.transformUrl('a.png', file)).toBe('https://cdn.test/assets/a.png');
|
|
99
99
|
});
|
|
100
100
|
});
|
|
101
101
|
|
|
102
|
-
describe('addToFileList', () => {
|
|
103
|
-
it('records the core fields for a queued file', () => {
|
|
102
|
+
describe('addToFileList', (): void => {
|
|
103
|
+
it('records the core fields for a queued file', (): void => {
|
|
104
104
|
const loader = createLoader();
|
|
105
105
|
loader.image('logo', 'logo.png');
|
|
106
106
|
const asset = loader.getAsset('image', 'logo');
|
|
@@ -114,7 +114,7 @@ describe('Loader', () => {
|
|
|
114
114
|
});
|
|
115
115
|
});
|
|
116
116
|
|
|
117
|
-
it('folds the per-type extras onto the file', () => {
|
|
117
|
+
it('folds the per-type extras onto the file', (): void => {
|
|
118
118
|
const loader = createLoader();
|
|
119
119
|
loader.audio('theme', ['theme.mp3']);
|
|
120
120
|
expect(loader.getAsset('audio', 'theme')?.file).toMatchObject({
|
|
@@ -124,13 +124,13 @@ describe('Loader', () => {
|
|
|
124
124
|
});
|
|
125
125
|
});
|
|
126
126
|
|
|
127
|
-
it('skips a file with no key', () => {
|
|
127
|
+
it('skips a file with no key', (): void => {
|
|
128
128
|
const loader = createLoader();
|
|
129
129
|
loader.image('', 'logo.png');
|
|
130
130
|
expect(loader.getAsset('image', '')).toBeNull();
|
|
131
131
|
});
|
|
132
132
|
|
|
133
|
-
it('derives the url from the key and extension when none is given', () => {
|
|
133
|
+
it('derives the url from the key and extension when none is given', (): void => {
|
|
134
134
|
const loader = createLoader();
|
|
135
135
|
loader.image('logo');
|
|
136
136
|
expect(loader.getAsset('image', 'logo')?.file.url).toBe('logo.png');
|