@vpmedia/phaser 1.116.0 → 1.118.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 (202) hide show
  1. package/dist/index.js +195 -229
  2. package/dist/index.js.map +1 -1
  3. package/dist/phaser/core/animation.d.ts.map +1 -1
  4. package/dist/phaser/core/animation_manager.d.ts +16 -15
  5. package/dist/phaser/core/animation_manager.d.ts.map +1 -1
  6. package/dist/phaser/core/animation_parser.d.ts.map +1 -1
  7. package/dist/phaser/core/array_set.d.ts.map +1 -1
  8. package/dist/phaser/core/cache.d.ts +76 -47
  9. package/dist/phaser/core/cache.d.ts.map +1 -1
  10. package/dist/phaser/core/device_util.d.ts.map +1 -1
  11. package/dist/phaser/core/dom.d.ts.map +1 -1
  12. package/dist/phaser/core/factory.d.ts.map +1 -1
  13. package/dist/phaser/core/game.d.ts.map +1 -1
  14. package/dist/phaser/core/input.d.ts +17 -17
  15. package/dist/phaser/core/input.d.ts.map +1 -1
  16. package/dist/phaser/core/input_handler.d.ts +11 -13
  17. package/dist/phaser/core/input_handler.d.ts.map +1 -1
  18. package/dist/phaser/core/input_mouse.d.ts.map +1 -1
  19. package/dist/phaser/core/input_mspointer.d.ts +8 -7
  20. package/dist/phaser/core/input_mspointer.d.ts.map +1 -1
  21. package/dist/phaser/core/input_pointer.d.ts +19 -8
  22. package/dist/phaser/core/input_pointer.d.ts.map +1 -1
  23. package/dist/phaser/core/input_touch.d.ts.map +1 -1
  24. package/dist/phaser/core/loader.d.ts +30 -1
  25. package/dist/phaser/core/loader.d.ts.map +1 -1
  26. package/dist/phaser/core/loader_parser.d.ts +24 -4
  27. package/dist/phaser/core/loader_parser.d.ts.map +1 -1
  28. package/dist/phaser/core/raf.d.ts.map +1 -1
  29. package/dist/phaser/core/scale_manager.d.ts +37 -12
  30. package/dist/phaser/core/scale_manager.d.ts.map +1 -1
  31. package/dist/phaser/core/scene.d.ts.map +1 -1
  32. package/dist/phaser/core/scene_manager.d.ts.map +1 -1
  33. package/dist/phaser/core/signal.d.ts.map +1 -1
  34. package/dist/phaser/core/signal_binding.d.ts.map +1 -1
  35. package/dist/phaser/core/sound.d.ts +15 -5
  36. package/dist/phaser/core/sound.d.ts.map +1 -1
  37. package/dist/phaser/core/sound_manager.d.ts +24 -22
  38. package/dist/phaser/core/sound_manager.d.ts.map +1 -1
  39. package/dist/phaser/core/sound_sprite.d.ts.map +1 -1
  40. package/dist/phaser/core/stage.d.ts.map +1 -1
  41. package/dist/phaser/core/time.d.ts.map +1 -1
  42. package/dist/phaser/core/timer.d.ts +1 -1
  43. package/dist/phaser/core/timer.d.ts.map +1 -1
  44. package/dist/phaser/core/tween.d.ts +3 -3
  45. package/dist/phaser/core/tween.d.ts.map +1 -1
  46. package/dist/phaser/core/tween_data.d.ts +26 -26
  47. package/dist/phaser/core/tween_data.d.ts.map +1 -1
  48. package/dist/phaser/core/tween_manager.d.ts +8 -6
  49. package/dist/phaser/core/tween_manager.d.ts.map +1 -1
  50. package/dist/phaser/core/world.d.ts.map +1 -1
  51. package/dist/phaser/display/bitmap_text.d.ts +13 -8
  52. package/dist/phaser/display/bitmap_text.d.ts.map +1 -1
  53. package/dist/phaser/display/button.d.ts.map +1 -1
  54. package/dist/phaser/display/canvas/buffer.d.ts.map +1 -1
  55. package/dist/phaser/display/canvas/graphics.d.ts.map +1 -1
  56. package/dist/phaser/display/canvas/masker.d.ts.map +1 -1
  57. package/dist/phaser/display/canvas/pool.d.ts.map +1 -1
  58. package/dist/phaser/display/canvas/renderer.d.ts.map +1 -1
  59. package/dist/phaser/display/canvas/tinter.d.ts +3 -2
  60. package/dist/phaser/display/canvas/tinter.d.ts.map +1 -1
  61. package/dist/phaser/display/canvas/util.d.ts.map +1 -1
  62. package/dist/phaser/display/display_object.d.ts.map +1 -1
  63. package/dist/phaser/display/graphics.d.ts.map +1 -1
  64. package/dist/phaser/display/graphics_data.d.ts.map +1 -1
  65. package/dist/phaser/display/graphics_data_util.d.ts.map +1 -1
  66. package/dist/phaser/display/group.d.ts.map +1 -1
  67. package/dist/phaser/display/image.d.ts +2 -2
  68. package/dist/phaser/display/image.d.ts.map +1 -1
  69. package/dist/phaser/display/sprite_util.d.ts.map +1 -1
  70. package/dist/phaser/display/text.d.ts.map +1 -1
  71. package/dist/phaser/display/webgl/abstract_filter.d.ts.map +1 -1
  72. package/dist/phaser/display/webgl/base_texture.d.ts +12 -10
  73. package/dist/phaser/display/webgl/base_texture.d.ts.map +1 -1
  74. package/dist/phaser/display/webgl/blend_manager.d.ts.map +1 -1
  75. package/dist/phaser/display/webgl/earcut.d.ts.map +1 -1
  76. package/dist/phaser/display/webgl/fast_sprite_batch.d.ts +13 -12
  77. package/dist/phaser/display/webgl/fast_sprite_batch.d.ts.map +1 -1
  78. package/dist/phaser/display/webgl/filter_manager.d.ts.map +1 -1
  79. package/dist/phaser/display/webgl/filter_texture.d.ts.map +1 -1
  80. package/dist/phaser/display/webgl/graphics.d.ts +9 -7
  81. package/dist/phaser/display/webgl/graphics.d.ts.map +1 -1
  82. package/dist/phaser/display/webgl/graphics_data.d.ts.map +1 -1
  83. package/dist/phaser/display/webgl/mask_manager.d.ts.map +1 -1
  84. package/dist/phaser/display/webgl/render_texture.d.ts.map +1 -1
  85. package/dist/phaser/display/webgl/renderer.d.ts +12 -10
  86. package/dist/phaser/display/webgl/renderer.d.ts.map +1 -1
  87. package/dist/phaser/display/webgl/shader/normal.d.ts.map +1 -1
  88. package/dist/phaser/display/webgl/shader_manager.d.ts.map +1 -1
  89. package/dist/phaser/display/webgl/sprite_batch.d.ts.map +1 -1
  90. package/dist/phaser/display/webgl/stencil_manager.d.ts.map +1 -1
  91. package/dist/phaser/display/webgl/texture.d.ts +18 -33
  92. package/dist/phaser/display/webgl/texture.d.ts.map +1 -1
  93. package/dist/phaser/display/webgl/texture_util.d.ts.map +1 -1
  94. package/dist/phaser/display/webgl/util.d.ts.map +1 -1
  95. package/dist/phaser/geom/circle.d.ts.map +1 -1
  96. package/dist/phaser/geom/ellipse.d.ts.map +1 -1
  97. package/dist/phaser/geom/line.d.ts.map +1 -1
  98. package/dist/phaser/geom/matrix.d.ts +1 -1
  99. package/dist/phaser/geom/matrix.d.ts.map +1 -1
  100. package/dist/phaser/geom/point.d.ts.map +1 -1
  101. package/dist/phaser/geom/polygon.d.ts.map +1 -1
  102. package/dist/phaser/geom/rectangle.d.ts.map +1 -1
  103. package/dist/phaser/geom/rounded_rectangle.d.ts.map +1 -1
  104. package/dist/phaser/geom/util/circle.d.ts.map +1 -1
  105. package/dist/phaser/geom/util/ellipse.d.ts.map +1 -1
  106. package/dist/phaser/geom/util/line.d.ts +5 -4
  107. package/dist/phaser/geom/util/line.d.ts.map +1 -1
  108. package/dist/phaser/geom/util/matrix.d.ts.map +1 -1
  109. package/dist/phaser/geom/util/point.d.ts.map +1 -1
  110. package/dist/phaser/geom/util/polygon.d.ts.map +1 -1
  111. package/dist/phaser/geom/util/rectangle.d.ts +10 -1
  112. package/dist/phaser/geom/util/rectangle.d.ts.map +1 -1
  113. package/dist/phaser/geom/util/rounded_rectangle.d.ts.map +1 -1
  114. package/package.json +1 -1
  115. package/src/phaser/core/animation.ts +20 -20
  116. package/src/phaser/core/animation_manager.ts +27 -24
  117. package/src/phaser/core/animation_parser.ts +2 -2
  118. package/src/phaser/core/array_set.ts +7 -7
  119. package/src/phaser/core/cache.test.ts +201 -0
  120. package/src/phaser/core/cache.ts +174 -130
  121. package/src/phaser/core/device_util.ts +13 -13
  122. package/src/phaser/core/dom.ts +26 -22
  123. package/src/phaser/core/factory.ts +6 -6
  124. package/src/phaser/core/game.ts +10 -10
  125. package/src/phaser/core/input.ts +36 -38
  126. package/src/phaser/core/input_handler.ts +90 -93
  127. package/src/phaser/core/input_mouse.ts +19 -19
  128. package/src/phaser/core/input_mspointer.ts +25 -28
  129. package/src/phaser/core/input_pointer.ts +37 -28
  130. package/src/phaser/core/input_touch.ts +17 -17
  131. package/src/phaser/core/loader.ts +132 -92
  132. package/src/phaser/core/loader_parser.test.ts +115 -0
  133. package/src/phaser/core/loader_parser.ts +66 -38
  134. package/src/phaser/core/raf.ts +3 -3
  135. package/src/phaser/core/scale_manager.ts +86 -67
  136. package/src/phaser/core/scene.ts +7 -7
  137. package/src/phaser/core/scene_manager.ts +16 -16
  138. package/src/phaser/core/signal.ts +29 -19
  139. package/src/phaser/core/signal_binding.ts +4 -4
  140. package/src/phaser/core/sound.ts +45 -33
  141. package/src/phaser/core/sound_manager.ts +72 -73
  142. package/src/phaser/core/sound_sprite.ts +1 -1
  143. package/src/phaser/core/stage.ts +7 -7
  144. package/src/phaser/core/time.ts +16 -16
  145. package/src/phaser/core/timer.ts +36 -26
  146. package/src/phaser/core/tween.ts +29 -29
  147. package/src/phaser/core/tween_data.ts +41 -37
  148. package/src/phaser/core/tween_manager.ts +50 -43
  149. package/src/phaser/core/world.ts +1 -1
  150. package/src/phaser/display/bitmap_text.test.ts +212 -0
  151. package/src/phaser/display/bitmap_text.ts +52 -37
  152. package/src/phaser/display/button.ts +13 -13
  153. package/src/phaser/display/canvas/buffer.ts +3 -3
  154. package/src/phaser/display/canvas/graphics.ts +3 -3
  155. package/src/phaser/display/canvas/masker.ts +2 -2
  156. package/src/phaser/display/canvas/pool.ts +6 -6
  157. package/src/phaser/display/canvas/renderer.ts +6 -6
  158. package/src/phaser/display/canvas/tinter.ts +39 -8
  159. package/src/phaser/display/canvas/util.ts +15 -9
  160. package/src/phaser/display/display_object.ts +38 -38
  161. package/src/phaser/display/graphics.ts +30 -30
  162. package/src/phaser/display/graphics_data.ts +1 -1
  163. package/src/phaser/display/graphics_data_util.ts +1 -1
  164. package/src/phaser/display/group.ts +16 -16
  165. package/src/phaser/display/image.ts +30 -26
  166. package/src/phaser/display/sprite_util.ts +12 -4
  167. package/src/phaser/display/text.ts +55 -55
  168. package/src/phaser/display/webgl/abstract_filter.ts +1 -1
  169. package/src/phaser/display/webgl/base_texture.ts +22 -18
  170. package/src/phaser/display/webgl/blend_manager.ts +3 -3
  171. package/src/phaser/display/webgl/earcut.ts +3 -3
  172. package/src/phaser/display/webgl/fast_sprite_batch.ts +26 -24
  173. package/src/phaser/display/webgl/filter_manager.ts +7 -7
  174. package/src/phaser/display/webgl/filter_texture.ts +3 -3
  175. package/src/phaser/display/webgl/graphics.ts +43 -41
  176. package/src/phaser/display/webgl/graphics_data.ts +2 -2
  177. package/src/phaser/display/webgl/mask_manager.ts +2 -2
  178. package/src/phaser/display/webgl/render_texture.ts +6 -6
  179. package/src/phaser/display/webgl/renderer.ts +20 -25
  180. package/src/phaser/display/webgl/shader/normal.ts +3 -3
  181. package/src/phaser/display/webgl/shader_manager.ts +2 -2
  182. package/src/phaser/display/webgl/sprite_batch.ts +9 -9
  183. package/src/phaser/display/webgl/stencil_manager.ts +4 -4
  184. package/src/phaser/display/webgl/texture.ts +23 -42
  185. package/src/phaser/display/webgl/texture_util.ts +2 -2
  186. package/src/phaser/display/webgl/util.ts +11 -7
  187. package/src/phaser/geom/circle.ts +21 -21
  188. package/src/phaser/geom/ellipse.ts +7 -7
  189. package/src/phaser/geom/line.ts +29 -29
  190. package/src/phaser/geom/matrix.ts +13 -13
  191. package/src/phaser/geom/point.ts +36 -30
  192. package/src/phaser/geom/polygon.ts +6 -6
  193. package/src/phaser/geom/rectangle.ts +42 -42
  194. package/src/phaser/geom/rounded_rectangle.ts +2 -2
  195. package/src/phaser/geom/util/circle.ts +7 -7
  196. package/src/phaser/geom/util/ellipse.ts +1 -1
  197. package/src/phaser/geom/util/line.ts +13 -5
  198. package/src/phaser/geom/util/matrix.ts +3 -3
  199. package/src/phaser/geom/util/point.ts +20 -20
  200. package/src/phaser/geom/util/polygon.ts +1 -1
  201. package/src/phaser/geom/util/rectangle.ts +34 -17
  202. package/src/phaser/geom/util/rounded_rectangle.ts +1 -1
@@ -0,0 +1,201 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+ import { SCALE_LINEAR } from './const.js';
3
+ import { BITMAPFONT, Cache, IMAGE, SOUND } from './cache.js';
4
+ import { getRegistry } from './registry.js';
5
+ import type { Game } from './game.js';
6
+
7
+ const createGame = (): Game =>
8
+ ({
9
+ logger: { warn: (): void => undefined },
10
+ load: { baseURL: '' },
11
+ sound: { isLocked: false },
12
+ }) as unknown as Game;
13
+
14
+ const createImage = (width = 4, height = 4): HTMLImageElement => {
15
+ const img = new Image();
16
+ Object.defineProperty(img, 'width', { value: width });
17
+ Object.defineProperty(img, 'height', { value: height });
18
+ return img;
19
+ };
20
+
21
+ const FONT_XML = `<?xml version="1.0"?>
22
+ <font>
23
+ <info face="Arial" size="32" />
24
+ <common lineHeight="40" />
25
+ <chars>
26
+ <char id="65" x="0" y="0" width="20" height="30" xoffset="1" yoffset="2" xadvance="21" />
27
+ </chars>
28
+ </font>`;
29
+
30
+ describe('Cache', () => {
31
+ let cache: Cache;
32
+
33
+ beforeEach(() => {
34
+ getRegistry().TEXTURE_SCALE_MODE = SCALE_LINEAR;
35
+ cache = new Cache(createGame());
36
+ });
37
+
38
+ describe('images', () => {
39
+ it('seeds the default and missing images', () => {
40
+ expect(cache.checkImageKey('__default')).toBe(true);
41
+ expect(cache.checkImageKey('__missing')).toBe(true);
42
+ });
43
+
44
+ it('keeps the default image out of the reported keys', () => {
45
+ expect(cache.getKeys(IMAGE)).toStrictEqual([]);
46
+ });
47
+
48
+ it('returns the source bitmap by default and the whole entry when asked', () => {
49
+ const source = createImage();
50
+ cache.addImage('logo', 'logo.png', source);
51
+ expect(cache.getImage('logo')).toBe(source);
52
+ expect(cache.getImage('logo', true).key).toBe('logo');
53
+ });
54
+
55
+ it('falls back to the missing image for an unknown key', () => {
56
+ expect(cache.getImage('nope', true).key).toBe('__missing');
57
+ });
58
+
59
+ it('gives an image one frame covering the whole bitmap', () => {
60
+ cache.addImage('logo', 'logo.png', createImage(64, 32));
61
+ const frame = cache.getFrameByIndex('logo', 0);
62
+ expect(frame?.width).toBe(64);
63
+ expect(frame?.height).toBe(32);
64
+ expect(cache.getFrameCount('logo')).toBe(1);
65
+ });
66
+
67
+ it('reports no frames for a key it does not hold', () => {
68
+ expect(cache.getFrameData('nope')).toBeNull();
69
+ expect(cache.getFrameCount('nope')).toBe(0);
70
+ expect(cache.hasFrameData('nope')).toBe(false);
71
+ });
72
+
73
+ it('drops an image when it is removed', () => {
74
+ cache.addImage('logo', 'logo.png', createImage());
75
+ cache.removeImage('logo');
76
+ expect(cache.checkImageKey('logo')).toBe(false);
77
+ });
78
+
79
+ it('replaces an image registered twice under the same key', () => {
80
+ cache.addImage('logo', 'a.png', createImage(4, 4));
81
+ const second = createImage(8, 8);
82
+ cache.addImage('logo', 'b.png', second);
83
+ expect(cache.getImage('logo')).toBe(second);
84
+ });
85
+
86
+ it('clears the GL textures of every cached image', () => {
87
+ cache.addImage('logo', 'logo.png', createImage());
88
+ const entry = cache.getImage('logo', true);
89
+ entry.base._glTextures = [null];
90
+ cache.clearGLTextures();
91
+ expect(entry.base._glTextures).toStrictEqual([]);
92
+ });
93
+ });
94
+
95
+ describe('sounds', () => {
96
+ it('stores a sound as undecoded', () => {
97
+ cache.addSound('shot', 'shot.ogg', new ArrayBuffer(8));
98
+ expect(cache.isSoundDecoded('shot')).toBe(false);
99
+ expect(cache.isSoundReady('shot')).toBe(false);
100
+ });
101
+
102
+ it('reports an unknown sound as neither decoded nor ready', () => {
103
+ expect(cache.isSoundDecoded('nope')).toBeNull();
104
+ expect(cache.isSoundReady('nope')).toBe(false);
105
+ });
106
+
107
+ it('updates a single property of a cached sound', () => {
108
+ cache.addSound('shot', 'shot.ogg', new ArrayBuffer(8));
109
+ cache.updateSound('shot', 'isDecoding', true);
110
+ expect(cache.getSound('shot')?.isDecoding).toBe(true);
111
+ });
112
+
113
+ it('swaps in the decoded buffer and marks the sound ready', () => {
114
+ cache.addSound('shot', 'shot.ogg', new ArrayBuffer(8));
115
+ const buffer = { duration: 1.5 } as AudioBuffer;
116
+ cache.decodedSound('shot', buffer);
117
+ expect(cache.getSoundData('shot')).toBe(buffer);
118
+ expect(cache.isSoundDecoded('shot')).toBe(true);
119
+ expect(cache.isSoundReady('shot')).toBe(true);
120
+ });
121
+
122
+ it('ignores a decode result for a sound it never held', () => {
123
+ expect(() => {
124
+ cache.decodedSound('nope', {} as AudioBuffer);
125
+ }).not.toThrow();
126
+ });
127
+
128
+ it('drops a sound when it is removed', () => {
129
+ cache.addSound('shot', 'shot.ogg', new ArrayBuffer(8));
130
+ cache.removeSound('shot');
131
+ expect(cache.getSound('shot')).toBeNull();
132
+ });
133
+ });
134
+
135
+ describe('data', () => {
136
+ it('round-trips text', () => {
137
+ cache.addText('note', 'note.txt', 'hello');
138
+ expect(cache.getText('note')).toBe('hello');
139
+ cache.removeText('note');
140
+ expect(cache.getText('note')).toBeNull();
141
+ });
142
+
143
+ it('round-trips JSON', () => {
144
+ cache.addJSON('config', 'config.json', { a: 1 });
145
+ expect(cache.getJSON('config')).toStrictEqual({ a: 1 });
146
+ });
147
+
148
+ it('hands back a detached copy when a clone is asked for', () => {
149
+ const data = { a: 1 };
150
+ cache.addJSON('config', 'config.json', data);
151
+ const clone = cache.getJSON<{ a: number }>('config', true);
152
+ expect(clone).toStrictEqual(data);
153
+ expect(clone).not.toBe(data);
154
+ });
155
+
156
+ it('round-trips XML', () => {
157
+ const xml = new DOMParser().parseFromString('<root/>', 'text/xml');
158
+ cache.addXML('doc', 'doc.xml', xml);
159
+ expect(cache.getXML('doc')).toBe(xml);
160
+ });
161
+ });
162
+
163
+ describe('bitmap fonts', () => {
164
+ it('parses the descriptor and keeps it beside the atlas', () => {
165
+ const xml = new DOMParser().parseFromString(FONT_XML, 'text/xml');
166
+ cache.addBitmapFont('arial', 'arial.png', createImage(256, 256), xml, 'xml');
167
+ const entry = cache.getBitmapFont('arial');
168
+ expect(entry?.font.font).toBe('Arial');
169
+ expect(entry?.font.chars[65]?.xAdvance).toBe(21);
170
+ expect(entry?.base).toBeDefined();
171
+ });
172
+
173
+ it('reports a font it does not hold as absent', () => {
174
+ expect(cache.checkBitmapFontKey('nope')).toBe(false);
175
+ expect(cache.getBitmapFont('nope')).toBeNull();
176
+ });
177
+ });
178
+
179
+ describe('getItem', () => {
180
+ it('returns the whole entry when no property is named', () => {
181
+ cache.addText('note', 'note.txt', 'hello');
182
+ expect(cache.getItem('note', 4, 'test')).toStrictEqual({ url: 'note.txt', data: 'hello' });
183
+ });
184
+
185
+ it('returns null for a key the bucket does not hold', () => {
186
+ expect(cache.getItem('nope', SOUND, 'test')).toBeNull();
187
+ expect(cache.getItem('nope', BITMAPFONT, 'test', 'font')).toBeNull();
188
+ });
189
+ });
190
+
191
+ describe('destroy', () => {
192
+ it('empties every bucket but the built-in images', () => {
193
+ cache.addText('note', 'note.txt', 'hello');
194
+ cache.addSound('shot', 'shot.ogg', new ArrayBuffer(8));
195
+ cache.destroy();
196
+ expect(cache.getText('note')).toBeNull();
197
+ expect(cache.getSound('shot')).toBeNull();
198
+ expect(cache.checkImageKey('__default')).toBe(true);
199
+ });
200
+ });
201
+ });