@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,115 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import type { BaseTexture } from '../display/webgl/base_texture.js';
3
+ import { bitmapFont, jsonBitmapFont, xmlBitmapFont } from './loader_parser.js';
4
+
5
+ const baseTexture = { width: 256, height: 256 } as unknown as BaseTexture;
6
+
7
+ const parseXml = (markup: string): XMLDocument => new DOMParser().parseFromString(markup, 'text/xml');
8
+
9
+ const FONT_XML = `<?xml version="1.0"?>
10
+ <font>
11
+ <info face="Arial" size="32" />
12
+ <common lineHeight="40" />
13
+ <chars>
14
+ <char id="65" x="0" y="0" width="20" height="30" xoffset="1" yoffset="2" xadvance="21" />
15
+ <char id="66" x="20" y="0" width="22" height="30" xoffset="0" yoffset="2" xadvance="23" />
16
+ </chars>
17
+ <kernings>
18
+ <kerning first="65" second="66" amount="-3" />
19
+ </kernings>
20
+ </font>`;
21
+
22
+ const FONT_JSON = {
23
+ font: {
24
+ info: { _face: 'Arial', _size: '32' },
25
+ common: { _lineHeight: '40' },
26
+ chars: {
27
+ char: [
28
+ { _id: '65', _x: '0', _y: '0', _width: '20', _height: '30', _xoffset: '1', _yoffset: '2', _xadvance: '21' },
29
+ { _id: '66', _x: '20', _y: '0', _width: '22', _height: '30', _xoffset: '0', _yoffset: '2', _xadvance: '23' },
30
+ ],
31
+ },
32
+ kernings: { kerning: [{ _first: '65', _second: '66', _amount: '-3' }] },
33
+ },
34
+ };
35
+
36
+ describe('bitmap font parsing', () => {
37
+ describe('xmlBitmapFont', () => {
38
+ it('reads the font metrics', () => {
39
+ const data = xmlBitmapFont(parseXml(FONT_XML), baseTexture, 0, 0);
40
+ expect(data.font).toBe('Arial');
41
+ expect(data.size).toBe(32);
42
+ expect(data.lineHeight).toBe(40);
43
+ });
44
+
45
+ it('reads every glyph, keyed by character code', () => {
46
+ const data = xmlBitmapFont(parseXml(FONT_XML), baseTexture, 0, 0);
47
+ expect(Object.keys(data.chars)).toStrictEqual(['65', '66']);
48
+ expect(data.chars[65]).toMatchObject({ x: 0, y: 0, width: 20, height: 30, xOffset: 1, yOffset: 2 });
49
+ });
50
+
51
+ it('adds the spacing arguments to advance and line height', () => {
52
+ const data = xmlBitmapFont(parseXml(FONT_XML), baseTexture, 5, 7);
53
+ expect(data.chars[65]?.xAdvance).toBe(26);
54
+ expect(data.lineHeight).toBe(47);
55
+ });
56
+
57
+ it('records kerning against the second character of the pair', () => {
58
+ const data = xmlBitmapFont(parseXml(FONT_XML), baseTexture, 0, 0);
59
+ expect(data.chars[66]?.kerning[65]).toBe(-3);
60
+ });
61
+
62
+ it('attaches a texture to every glyph', () => {
63
+ const data = xmlBitmapFont(parseXml(FONT_XML), baseTexture, 0, 0);
64
+ expect(data.chars[65]?.texture).toBeDefined();
65
+ expect(data.chars[66]?.texture).toBeDefined();
66
+ });
67
+
68
+ it('survives a font with no kerning table', () => {
69
+ const markup = FONT_XML.replace(/<kernings>[\s\S]*<\/kernings>/, '');
70
+ expect(() => xmlBitmapFont(parseXml(markup), baseTexture, 0, 0)).not.toThrow();
71
+ });
72
+
73
+ it('ignores kerning that names a character the font does not have', () => {
74
+ const markup = FONT_XML.replace('second="66"', 'second="999"');
75
+ const data = xmlBitmapFont(parseXml(markup), baseTexture, 0, 0);
76
+ expect(data.chars[66]?.kerning).toStrictEqual({});
77
+ });
78
+
79
+ it('falls back to an empty face when the info element is missing', () => {
80
+ const markup = FONT_XML.replace(/<info[^>]*\/>/, '');
81
+ expect(xmlBitmapFont(parseXml(markup), baseTexture, 0, 0).font).toBe('');
82
+ });
83
+ });
84
+
85
+ describe('jsonBitmapFont', () => {
86
+ it('reads the same metrics as the xml form', () => {
87
+ const data = jsonBitmapFont(FONT_JSON, baseTexture, 0, 0);
88
+ expect(data.font).toBe('Arial');
89
+ expect(data.size).toBe(32);
90
+ expect(data.lineHeight).toBe(40);
91
+ });
92
+
93
+ it('produces the same glyphs as the xml form', () => {
94
+ const fromJson = jsonBitmapFont(FONT_JSON, baseTexture, 0, 0);
95
+ const fromXml = xmlBitmapFont(parseXml(FONT_XML), baseTexture, 0, 0);
96
+ for (const code of [65, 66]) {
97
+ expect(fromJson.chars[code]).toMatchObject({
98
+ x: fromXml.chars[code]!.x,
99
+ width: fromXml.chars[code]!.width,
100
+ xAdvance: fromXml.chars[code]!.xAdvance,
101
+ });
102
+ }
103
+ });
104
+
105
+ it('records the same kerning as the xml form', () => {
106
+ expect(jsonBitmapFont(FONT_JSON, baseTexture, 0, 0).chars[66]?.kerning[65]).toBe(-3);
107
+ });
108
+ });
109
+
110
+ describe('bitmapFont', () => {
111
+ it('parses the xml form', () => {
112
+ expect(bitmapFont(parseXml(FONT_XML), baseTexture, 0, 0).font).toBe('Arial');
113
+ });
114
+ });
115
+ });
@@ -2,17 +2,37 @@ import { Texture } from '../display/webgl/texture.js';
2
2
  import { Rectangle } from '../geom/rectangle.js';
3
3
  import type { BaseTexture } from '../display/webgl/base_texture.js';
4
4
 
5
+ /** One glyph in a bitmap font, as parsed from the font descriptor. */
6
+ export type BitmapFontChar = {
7
+ x: number;
8
+ y: number;
9
+ width: number;
10
+ height: number;
11
+ xOffset: number;
12
+ yOffset: number;
13
+ xAdvance: number;
14
+ kerning: Record<number, number>;
15
+ texture?: Texture;
16
+ };
17
+
18
+ /** A parsed bitmap font: its metrics and the glyphs it can draw. */
19
+ export type BitmapFontData = {
20
+ font: string;
21
+ size: number;
22
+ lineHeight: number;
23
+ chars: Record<number, BitmapFontChar>;
24
+ };
25
+
5
26
  /**
6
27
  * Finalizes bitmap font data by attaching textures to characters.
7
28
  * @param {BaseTexture} baseTexture - The base texture for the font.
8
29
  * @param {object} bitmapFontData - The bitmap font data to finalize.
9
30
  * @returns {object} The finalized bitmap font data.
10
31
  */
11
- export const finalizeBitmapFont = (baseTexture: BaseTexture, bitmapFontData: any) => {
12
- Object.keys(bitmapFontData.chars).forEach((charCode) => {
13
- const letter = bitmapFontData.chars[charCode];
32
+ export const finalizeBitmapFont = (baseTexture: BaseTexture, bitmapFontData: BitmapFontData): BitmapFontData => {
33
+ for (const letter of Object.values(bitmapFontData.chars)) {
14
34
  letter.texture = new Texture(baseTexture, new Rectangle(letter.x, letter.y, letter.width, letter.height));
15
- });
35
+ }
16
36
  return bitmapFontData;
17
37
  };
18
38
 
@@ -24,34 +44,38 @@ export const finalizeBitmapFont = (baseTexture: BaseTexture, bitmapFontData: any
24
44
  * @param {number} ySpacing - Vertical spacing between characters.
25
45
  * @returns {object} The parsed bitmap font data.
26
46
  */
27
- export const xmlBitmapFont = (xml: any, baseTexture: BaseTexture, xSpacing: number, ySpacing: number) => {
28
- const data: any = {};
47
+ export const xmlBitmapFont = (
48
+ xml: XMLDocument,
49
+ baseTexture: BaseTexture,
50
+ xSpacing: number,
51
+ ySpacing: number
52
+ ): BitmapFontData => {
29
53
  const info = xml.querySelectorAll('info')[0];
30
54
  const common = xml.querySelectorAll('common')[0];
31
- data.font = info.getAttribute('face');
32
- data.size = Math.trunc(Number(info.getAttribute('size')));
33
- data.lineHeight = Math.trunc(Number(common.getAttribute('lineHeight'))) + ySpacing;
34
- data.chars = {};
35
- const letters = xml.querySelectorAll('char');
36
- for (let i = 0; i < letters.length; i += 1) {
37
- const charCode = Math.trunc(Number(letters[i].getAttribute('id')));
38
- data.chars[charCode] = {
39
- x: Math.trunc(Number(letters[i].getAttribute('x'))),
40
- y: Math.trunc(Number(letters[i].getAttribute('y'))),
41
- width: Math.trunc(Number(letters[i].getAttribute('width'))),
42
- height: Math.trunc(Number(letters[i].getAttribute('height'))),
43
- xOffset: Math.trunc(Number(letters[i].getAttribute('xoffset'))),
44
- yOffset: Math.trunc(Number(letters[i].getAttribute('yoffset'))),
45
- xAdvance: Math.trunc(Number(letters[i].getAttribute('xadvance'))) + xSpacing,
55
+ const attr = (element: Element | undefined, name: string): number => Math.trunc(Number(element?.getAttribute(name)));
56
+ const data: BitmapFontData = {
57
+ font: info?.getAttribute('face') ?? '',
58
+ size: attr(info, 'size'),
59
+ lineHeight: attr(common, 'lineHeight') + ySpacing,
60
+ chars: {},
61
+ };
62
+ for (const letter of xml.querySelectorAll('char')) {
63
+ data.chars[attr(letter, 'id')] = {
64
+ x: attr(letter, 'x'),
65
+ y: attr(letter, 'y'),
66
+ width: attr(letter, 'width'),
67
+ height: attr(letter, 'height'),
68
+ xOffset: attr(letter, 'xoffset'),
69
+ yOffset: attr(letter, 'yoffset'),
70
+ xAdvance: attr(letter, 'xadvance') + xSpacing,
46
71
  kerning: {},
47
72
  };
48
73
  }
49
- const kernings = xml.querySelectorAll('kerning');
50
- for (let i = 0; i < kernings.length; i += 1) {
51
- const first = Math.trunc(Number(kernings[i].getAttribute('first')));
52
- const second = Math.trunc(Number(kernings[i].getAttribute('second')));
53
- const amount = Math.trunc(Number(kernings[i].getAttribute('amount')));
54
- data.chars[second].kerning[first] = amount;
74
+ for (const kerning of xml.querySelectorAll('kerning')) {
75
+ const char = data.chars[attr(kerning, 'second')];
76
+ if (char) {
77
+ char.kerning[attr(kerning, 'first')] = attr(kerning, 'amount');
78
+ }
55
79
  }
56
80
  return finalizeBitmapFont(baseTexture, data);
57
81
  };
@@ -64,8 +88,12 @@ export const xmlBitmapFont = (xml: any, baseTexture: BaseTexture, xSpacing: numb
64
88
  * @param {number} ySpacing - Vertical spacing between characters.
65
89
  * @returns {object} The parsed bitmap font data.
66
90
  */
67
- export const bitmapFont = (xml: any, baseTexture: BaseTexture, xSpacing: number, ySpacing: number) =>
68
- xmlBitmapFont(xml, baseTexture, xSpacing, ySpacing);
91
+ export const bitmapFont = (
92
+ xml: XMLDocument,
93
+ baseTexture: BaseTexture,
94
+ xSpacing: number,
95
+ ySpacing: number
96
+ ): BitmapFontData => xmlBitmapFont(xml, baseTexture, xSpacing, ySpacing);
69
97
 
70
98
  /**
71
99
  * Parses JSON bitmap font data.
@@ -75,19 +103,19 @@ export const bitmapFont = (xml: any, baseTexture: BaseTexture, xSpacing: number,
75
103
  * @param {number} ySpacing - Vertical spacing between characters.
76
104
  * @returns {object} The parsed bitmap font data.
77
105
  */
78
- export const jsonBitmapFont = (json: any, baseTexture: BaseTexture, xSpacing: number, ySpacing: number) => {
79
- const data: {
80
- font: string;
81
- size: number;
82
- lineHeight: number;
83
- chars: Record<number, { kerning: Record<number, number>; [key: string]: unknown }>;
84
- } = {
106
+ export const jsonBitmapFont = (
107
+ json: any,
108
+ baseTexture: BaseTexture,
109
+ xSpacing: number,
110
+ ySpacing: number
111
+ ): BitmapFontData => {
112
+ const data: BitmapFontData = {
85
113
  font: json.font.info._face,
86
114
  size: Math.trunc(Number(json.font.info._size)),
87
115
  lineHeight: Math.trunc(Number(json.font.common._lineHeight)) + ySpacing,
88
116
  chars: {},
89
117
  };
90
- json.font.chars.char.forEach((letter: Record<string, string>) => {
118
+ json.font.chars.char.forEach((letter: Record<string, string>): void => {
91
119
  const charCode = Math.trunc(Number(letter['_id']));
92
120
  data.chars[charCode] = {
93
121
  x: Math.trunc(Number(letter['_x'])),
@@ -101,7 +129,7 @@ export const jsonBitmapFont = (json: any, baseTexture: BaseTexture, xSpacing: nu
101
129
  };
102
130
  });
103
131
  if (json.font.kernings && json.font.kernings.kerning) {
104
- json.font.kernings.kerning.forEach((kerning: Record<string, string>) => {
132
+ json.font.kernings.kerning.forEach((kerning: Record<string, string>): void => {
105
133
  const char = data.chars[Math.trunc(Number(kerning['_second']))];
106
134
  if (char) {
107
135
  char.kerning[Math.trunc(Number(kerning['_first']))] = Math.trunc(Number(kerning['_amount']));
@@ -15,14 +15,14 @@ export class RequestAnimationFrame {
15
15
  /**
16
16
  * Starts an animation frame request.
17
17
  */
18
- public start = () => {
18
+ public start = (): void => {
19
19
  this.rafId = requestAnimationFrame(this.update);
20
20
  };
21
21
 
22
22
  /**
23
23
  * Cancels an animation frame request.
24
24
  */
25
- public stop = () => {
25
+ public stop = (): void => {
26
26
  cancelAnimationFrame(this.rafId);
27
27
  };
28
28
 
@@ -30,7 +30,7 @@ export class RequestAnimationFrame {
30
30
  * Performs an animation frame request.
31
31
  * @param {number} rafTime - The timestamp provided by the browser's animation frame.
32
32
  */
33
- public update = (rafTime: number) => {
33
+ public update = (rafTime: number): void => {
34
34
  this.game.update(rafTime);
35
35
  this.rafId = requestAnimationFrame(this.update);
36
36
  };