melonjs 14.0.1 → 14.1.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 (214) hide show
  1. package/README.md +2 -0
  2. package/dist/melonjs.mjs/_virtual/_commonjsHelpers.js +10 -0
  3. package/dist/melonjs.mjs/_virtual/arraymultimap.js +10 -0
  4. package/dist/melonjs.mjs/_virtual/earcut.js +10 -0
  5. package/dist/melonjs.mjs/_virtual/howler.js +10 -0
  6. package/dist/melonjs.mjs/_virtual/index.js +10 -0
  7. package/dist/melonjs.mjs/_virtual/index2.js +10 -0
  8. package/dist/melonjs.mjs/_virtual/multimap.js +10 -0
  9. package/dist/melonjs.mjs/_virtual/setmultimap.js +10 -0
  10. package/dist/melonjs.mjs/application/application.js +240 -0
  11. package/dist/melonjs.mjs/audio/audio.js +536 -0
  12. package/dist/melonjs.mjs/camera/camera2d.js +732 -0
  13. package/dist/melonjs.mjs/entity/entity.js +248 -0
  14. package/dist/melonjs.mjs/game.js +29 -0
  15. package/dist/melonjs.mjs/geometries/ellipse.js +275 -0
  16. package/dist/melonjs.mjs/geometries/line.js +116 -0
  17. package/dist/melonjs.mjs/geometries/path2d.js +319 -0
  18. package/dist/melonjs.mjs/geometries/point.js +89 -0
  19. package/dist/melonjs.mjs/geometries/poly.js +500 -0
  20. package/dist/melonjs.mjs/geometries/rectangle.js +375 -0
  21. package/dist/melonjs.mjs/geometries/roundrect.js +168 -0
  22. package/dist/melonjs.mjs/index.js +248 -0
  23. package/dist/melonjs.mjs/input/gamepad.js +501 -0
  24. package/dist/melonjs.mjs/input/input.js +26 -0
  25. package/dist/melonjs.mjs/input/keyboard.js +470 -0
  26. package/dist/melonjs.mjs/input/pointer.js +393 -0
  27. package/dist/melonjs.mjs/input/pointerevent.js +818 -0
  28. package/dist/melonjs.mjs/lang/deprecated.js +157 -0
  29. package/dist/melonjs.mjs/level/level.js +297 -0
  30. package/dist/melonjs.mjs/level/tiled/TMXGroup.js +141 -0
  31. package/dist/melonjs.mjs/level/tiled/TMXLayer.js +448 -0
  32. package/dist/melonjs.mjs/level/tiled/TMXObject.js +355 -0
  33. package/dist/melonjs.mjs/level/tiled/TMXTile.js +194 -0
  34. package/dist/melonjs.mjs/level/tiled/TMXTileMap.js +639 -0
  35. package/dist/melonjs.mjs/level/tiled/TMXTileset.js +311 -0
  36. package/dist/melonjs.mjs/level/tiled/TMXTilesetGroup.js +83 -0
  37. package/dist/melonjs.mjs/level/tiled/TMXUtils.js +367 -0
  38. package/dist/melonjs.mjs/level/tiled/renderer/TMXHexagonalRenderer.js +506 -0
  39. package/dist/melonjs.mjs/level/tiled/renderer/TMXIsometricRenderer.js +220 -0
  40. package/dist/melonjs.mjs/level/tiled/renderer/TMXOrthogonalRenderer.js +157 -0
  41. package/dist/melonjs.mjs/level/tiled/renderer/TMXRenderer.js +125 -0
  42. package/dist/melonjs.mjs/level/tiled/renderer/TMXStaggeredRenderer.js +109 -0
  43. package/dist/melonjs.mjs/loader/loader.js +801 -0
  44. package/dist/melonjs.mjs/loader/loadingscreen.js +120 -0
  45. package/dist/melonjs.mjs/loader/melonjs_logo.png.js +11 -0
  46. package/dist/melonjs.mjs/math/color.js +618 -0
  47. package/dist/melonjs.mjs/math/math.js +218 -0
  48. package/dist/melonjs.mjs/math/matrix2.js +503 -0
  49. package/dist/melonjs.mjs/math/matrix3.js +681 -0
  50. package/dist/melonjs.mjs/math/observable_vector2.js +471 -0
  51. package/dist/melonjs.mjs/math/observable_vector3.js +561 -0
  52. package/dist/melonjs.mjs/math/vector2.js +528 -0
  53. package/dist/melonjs.mjs/math/vector3.js +569 -0
  54. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/arraymultimap.js +73 -0
  55. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/index.js +21 -0
  56. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/multimap.js +324 -0
  57. package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/setmultimap.js +69 -0
  58. package/dist/melonjs.mjs/node_modules/earcut/src/earcut.js +691 -0
  59. package/dist/melonjs.mjs/node_modules/eventemitter3/index.js +350 -0
  60. package/dist/melonjs.mjs/node_modules/howler/dist/howler.js +3241 -0
  61. package/dist/melonjs.mjs/particles/emitter.js +267 -0
  62. package/dist/melonjs.mjs/particles/particle.js +188 -0
  63. package/dist/melonjs.mjs/particles/settings.js +319 -0
  64. package/dist/melonjs.mjs/physics/body.js +704 -0
  65. package/dist/melonjs.mjs/physics/bounds.js +460 -0
  66. package/dist/melonjs.mjs/physics/collision.js +132 -0
  67. package/dist/melonjs.mjs/physics/detector.js +194 -0
  68. package/dist/melonjs.mjs/physics/quadtree.js +391 -0
  69. package/dist/melonjs.mjs/physics/response.js +57 -0
  70. package/dist/melonjs.mjs/physics/sat.js +483 -0
  71. package/dist/melonjs.mjs/physics/world.js +221 -0
  72. package/dist/melonjs.mjs/plugin/plugin.js +141 -0
  73. package/dist/melonjs.mjs/renderable/collectable.js +62 -0
  74. package/dist/melonjs.mjs/renderable/colorlayer.js +80 -0
  75. package/dist/melonjs.mjs/renderable/container.js +1018 -0
  76. package/dist/melonjs.mjs/renderable/dragndrop.js +224 -0
  77. package/dist/melonjs.mjs/renderable/imagelayer.js +306 -0
  78. package/dist/melonjs.mjs/renderable/light2d.js +156 -0
  79. package/dist/melonjs.mjs/renderable/nineslicesprite.js +247 -0
  80. package/dist/melonjs.mjs/renderable/renderable.js +783 -0
  81. package/dist/melonjs.mjs/renderable/sprite.js +654 -0
  82. package/dist/melonjs.mjs/renderable/trigger.js +157 -0
  83. package/dist/melonjs.mjs/renderable/ui/uibaseelement.js +213 -0
  84. package/dist/melonjs.mjs/renderable/ui/uispriteelement.js +226 -0
  85. package/dist/melonjs.mjs/renderable/ui/uitextbutton.js +128 -0
  86. package/dist/melonjs.mjs/state/stage.js +237 -0
  87. package/dist/melonjs.mjs/state/state.js +596 -0
  88. package/dist/melonjs.mjs/system/device.js +909 -0
  89. package/dist/melonjs.mjs/system/dom.js +78 -0
  90. package/dist/melonjs.mjs/system/event.js +537 -0
  91. package/dist/melonjs.mjs/system/platform.js +41 -0
  92. package/dist/melonjs.mjs/system/pooling.js +209 -0
  93. package/dist/melonjs.mjs/system/save.js +157 -0
  94. package/dist/melonjs.mjs/system/timer.js +286 -0
  95. package/dist/melonjs.mjs/text/bitmaptext.js +364 -0
  96. package/dist/melonjs.mjs/text/bitmaptextdata.js +199 -0
  97. package/dist/melonjs.mjs/text/glyph.js +66 -0
  98. package/dist/melonjs.mjs/text/text.js +453 -0
  99. package/dist/melonjs.mjs/text/textmetrics.js +176 -0
  100. package/dist/melonjs.mjs/text/textstyle.js +23 -0
  101. package/dist/melonjs.mjs/tweens/easing.js +336 -0
  102. package/dist/melonjs.mjs/tweens/interpolation.js +112 -0
  103. package/dist/melonjs.mjs/tweens/tween.js +480 -0
  104. package/dist/melonjs.mjs/utils/agent.js +76 -0
  105. package/dist/melonjs.mjs/utils/array.js +63 -0
  106. package/dist/melonjs.mjs/utils/file.js +42 -0
  107. package/dist/melonjs.mjs/utils/function.js +70 -0
  108. package/dist/melonjs.mjs/utils/string.js +82 -0
  109. package/dist/melonjs.mjs/utils/utils.js +173 -0
  110. package/dist/melonjs.mjs/video/canvas/canvas_renderer.js +807 -0
  111. package/dist/melonjs.mjs/video/renderer.js +411 -0
  112. package/dist/melonjs.mjs/video/texture/atlas.js +519 -0
  113. package/dist/melonjs.mjs/video/texture/cache.js +143 -0
  114. package/dist/melonjs.mjs/video/texture/canvas_texture.js +144 -0
  115. package/dist/melonjs.mjs/video/video.js +462 -0
  116. package/dist/melonjs.mjs/video/webgl/buffer/vertex.js +143 -0
  117. package/dist/melonjs.mjs/video/webgl/glshader.js +168 -0
  118. package/dist/melonjs.mjs/video/webgl/shaders/primitive.frag.js +10 -0
  119. package/dist/melonjs.mjs/video/webgl/shaders/primitive.vert.js +10 -0
  120. package/dist/melonjs.mjs/video/webgl/shaders/quad.frag.js +10 -0
  121. package/dist/melonjs.mjs/video/webgl/shaders/quad.vert.js +10 -0
  122. package/dist/melonjs.mjs/video/webgl/utils/attributes.js +25 -0
  123. package/dist/melonjs.mjs/video/webgl/utils/precision.js +20 -0
  124. package/dist/melonjs.mjs/video/webgl/utils/program.js +67 -0
  125. package/dist/melonjs.mjs/video/webgl/utils/string.js +25 -0
  126. package/dist/melonjs.mjs/video/webgl/utils/uniforms.js +92 -0
  127. package/dist/melonjs.mjs/video/webgl/webgl_compositor.js +495 -0
  128. package/dist/melonjs.mjs/video/webgl/webgl_renderer.js +1036 -0
  129. package/dist/melonjs.module.d.ts +1163 -1163
  130. package/dist/melonjs.module.js +1903 -3274
  131. package/package.json +22 -17
  132. package/src/application/application.js +3 -3
  133. package/src/audio/audio.js +32 -32
  134. package/src/camera/camera2d.js +31 -31
  135. package/src/entity/entity.js +17 -17
  136. package/src/geometries/ellipse.js +16 -16
  137. package/src/geometries/line.js +5 -5
  138. package/src/geometries/path2d.js +32 -32
  139. package/src/geometries/poly.js +15 -15
  140. package/src/geometries/rectangle.js +18 -18
  141. package/src/geometries/roundrect.js +8 -8
  142. package/src/input/gamepad.js +15 -15
  143. package/src/input/keyboard.js +12 -12
  144. package/src/input/pointer.js +6 -6
  145. package/src/input/pointerevent.js +12 -12
  146. package/src/lang/deprecated.js +12 -12
  147. package/src/level/level.js +25 -25
  148. package/src/level/tiled/TMXLayer.js +22 -22
  149. package/src/level/tiled/TMXTile.js +5 -5
  150. package/src/level/tiled/TMXTileMap.js +6 -6
  151. package/src/level/tiled/TMXTileset.js +2 -2
  152. package/src/level/tiled/TMXUtils.js +5 -5
  153. package/src/level/tiled/renderer/TMXHexagonalRenderer.js +2 -2
  154. package/src/level/tiled/renderer/TMXIsometricRenderer.js +2 -2
  155. package/src/level/tiled/renderer/TMXOrthogonalRenderer.js +1 -1
  156. package/src/level/tiled/renderer/TMXRenderer.js +19 -19
  157. package/src/loader/loader.js +20 -20
  158. package/src/math/color.js +20 -20
  159. package/src/math/math.js +16 -16
  160. package/src/math/matrix2.js +16 -16
  161. package/src/math/matrix3.js +25 -25
  162. package/src/math/observable_vector2.js +14 -14
  163. package/src/math/observable_vector3.js +16 -16
  164. package/src/math/vector2.js +9 -9
  165. package/src/math/vector3.js +10 -10
  166. package/src/particles/emitter.js +6 -6
  167. package/src/particles/particle.js +2 -2
  168. package/src/physics/body.js +28 -28
  169. package/src/physics/bounds.js +8 -8
  170. package/src/physics/collision.js +2 -2
  171. package/src/physics/detector.js +6 -6
  172. package/src/physics/quadtree.js +11 -11
  173. package/src/physics/sat.js +31 -31
  174. package/src/physics/world.js +5 -5
  175. package/src/plugin/plugin.js +5 -5
  176. package/src/renderable/collectable.js +3 -3
  177. package/src/renderable/colorlayer.js +5 -5
  178. package/src/renderable/container.js +21 -21
  179. package/src/renderable/dragndrop.js +14 -14
  180. package/src/renderable/imagelayer.js +13 -13
  181. package/src/renderable/light2d.js +3 -3
  182. package/src/renderable/nineslicesprite.js +16 -16
  183. package/src/renderable/renderable.js +23 -23
  184. package/src/renderable/sprite.js +28 -28
  185. package/src/renderable/trigger.js +15 -15
  186. package/src/renderable/ui/uibaseelement.js +7 -7
  187. package/src/renderable/ui/uispriteelement.js +6 -6
  188. package/src/renderable/ui/uitextbutton.js +13 -13
  189. package/src/state/stage.js +7 -7
  190. package/src/state/state.js +17 -17
  191. package/src/system/device.js +11 -11
  192. package/src/system/event.js +10 -10
  193. package/src/system/pooling.js +9 -9
  194. package/src/system/save.js +2 -2
  195. package/src/system/timer.js +10 -10
  196. package/src/text/bitmaptext.js +18 -18
  197. package/src/text/bitmaptextdata.js +2 -2
  198. package/src/text/text.js +23 -23
  199. package/src/text/textmetrics.js +8 -8
  200. package/src/tweens/tween.js +19 -19
  201. package/src/utils/agent.js +5 -5
  202. package/src/utils/array.js +4 -4
  203. package/src/utils/file.js +2 -2
  204. package/src/utils/function.js +6 -6
  205. package/src/utils/string.js +5 -5
  206. package/src/utils/utils.js +4 -4
  207. package/src/video/canvas/canvas_renderer.js +70 -70
  208. package/src/video/renderer.js +26 -26
  209. package/src/video/texture/atlas.js +22 -22
  210. package/src/video/texture/canvas_texture.js +9 -9
  211. package/src/video/video.js +17 -17
  212. package/src/video/webgl/glshader.js +10 -10
  213. package/src/video/webgl/webgl_compositor.js +41 -41
  214. package/src/video/webgl/webgl_renderer.js +75 -75
@@ -0,0 +1,596 @@
1
+ /*!
2
+ * melonJS Game Engine - v14.1.0
3
+ * http://www.melonjs.org
4
+ * melonjs is licensed under the MIT License.
5
+ * http://www.opensource.org/licenses/mit-license
6
+ * @copyright (C) 2011 - 2022 Olivier Biot (AltByte Pte Ltd)
7
+ */
8
+ import { pauseTrack, resumeTrack } from '../audio/audio.js';
9
+ import { defer } from '../utils/function.js';
10
+ import { on, VIDEO_INIT, BOOT, emit, STATE_STOP, STATE_PAUSE, STATE_RESTART, STATE_RESUME, STATE_CHANGE } from '../system/event.js';
11
+ import game from '../game.js';
12
+ import { focus } from '../system/device.js';
13
+ import Stage from './stage.js';
14
+ import DefaultLoadingScreen from '../loader/loadingscreen.js';
15
+
16
+ // current state
17
+ var _state = -1;
18
+
19
+ // requestAnimeFrame Id
20
+ var _animFrameId = -1;
21
+
22
+ // whether the game state is "paused"
23
+ var _isPaused = false;
24
+
25
+ // list of stages
26
+ var _stages = {};
27
+
28
+ // fading transition parameters between screen
29
+ var _fade = {
30
+ color : "",
31
+ duration : 0
32
+ };
33
+
34
+ // callback when state switch is done
35
+ /** @ignore */
36
+ var _onSwitchComplete = null;
37
+
38
+ // just to keep track of possible extra arguments
39
+ var _extraArgs = null;
40
+
41
+ // store the elapsed time during pause/stop period
42
+ var _pauseTime = 0;
43
+
44
+ /**
45
+ * @ignore
46
+ */
47
+ function _startRunLoop() {
48
+ // ensure nothing is running first and in valid state
49
+ if ((_animFrameId === -1) && (_state !== -1)) {
50
+ // start the main loop
51
+ _animFrameId = globalThis.requestAnimationFrame(_renderFrame);
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Resume the game loop after a pause.
57
+ * @ignore
58
+ */
59
+ function _resumeRunLoop() {
60
+ // ensure game is actually paused and in valid state
61
+ if (_isPaused && (_state !== -1)) {
62
+ _isPaused = false;
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Pause the loop for most stage objects.
68
+ * @ignore
69
+ */
70
+ function _pauseRunLoop() {
71
+ // Set the paused boolean to stop updates on (most) entities
72
+ _isPaused = true;
73
+ }
74
+
75
+ /**
76
+ * this is only called when using requestAnimFrame stuff
77
+ * @param {number} time - current timestamp in milliseconds
78
+ * @ignore
79
+ */
80
+ function _renderFrame(time) {
81
+ var stage = _stages[_state].stage;
82
+ // update all game objects
83
+ game.update(time, stage);
84
+ // render all game objects
85
+ game.draw(stage);
86
+ // schedule the next frame update
87
+ if (_animFrameId !== -1) {
88
+ _animFrameId = globalThis.requestAnimationFrame(_renderFrame);
89
+ }
90
+ }
91
+
92
+ /**
93
+ * stop the SO main loop
94
+ * @ignore
95
+ */
96
+ function _stopRunLoop() {
97
+ // cancel any previous animationRequestFrame
98
+ globalThis.cancelAnimationFrame(_animFrameId);
99
+ _animFrameId = -1;
100
+ }
101
+
102
+ /**
103
+ * start the SO main loop
104
+ * @ignore
105
+ */
106
+ function _switchState(state) {
107
+ // clear previous interval if any
108
+ _stopRunLoop();
109
+
110
+ // call the stage destroy method
111
+ if (_stages[_state]) {
112
+ // just notify the object
113
+ _stages[_state].stage.destroy();
114
+ }
115
+
116
+ if (_stages[state]) {
117
+ // set the global variable
118
+ _state = state;
119
+
120
+ // call the reset function with _extraArgs as arguments
121
+ _stages[_state].stage.reset.apply(_stages[_state].stage, _extraArgs);
122
+
123
+ // and start the main loop of the
124
+ // new requested state
125
+ _startRunLoop();
126
+
127
+ // publish the pause event
128
+ emit(STATE_CHANGE);
129
+
130
+ // execute callback if defined
131
+ if (_onSwitchComplete) {
132
+ _onSwitchComplete();
133
+ }
134
+
135
+ // force repaint
136
+ game.repaint();
137
+ }
138
+ }
139
+
140
+ // initialize me.state on system boot
141
+ on(BOOT, () => {
142
+ // set the built-in loading stage
143
+ state.set(state.LOADING, new DefaultLoadingScreen());
144
+ // set and enable the default stage
145
+ state.set(state.DEFAULT, new Stage());
146
+ // enable by default as soon as the display is initialized
147
+ on(VIDEO_INIT, () => {
148
+ state.change(state.DEFAULT, true);
149
+ });
150
+
151
+ if (typeof globalThis.addEventListener === "function") {
152
+ // set pause/stop action on losing focus
153
+ globalThis.addEventListener("blur", () => {
154
+ {
155
+ state.pause(true);
156
+ }
157
+ }, false);
158
+ // set restart/resume action on gaining focus
159
+ globalThis.addEventListener("focus", () => {
160
+ {
161
+ state.resume(true);
162
+ }
163
+ // force focus if autofocus is on
164
+ {
165
+ focus();
166
+ }
167
+ }, false);
168
+ }
169
+
170
+ if (typeof globalThis.document !== "undefined") {
171
+ if (typeof globalThis.document.addEventListener === "function") {
172
+ // register on the visibilitychange event if supported
173
+ globalThis.document.addEventListener("visibilitychange", () => {
174
+ if (globalThis.document.visibilityState === "visible") {
175
+ {
176
+ state.resume(true);
177
+ }
178
+ } else {
179
+ {
180
+ state.pause(true);
181
+ }
182
+ }
183
+ }, false );
184
+ }
185
+ }
186
+ });
187
+
188
+ /**
189
+ * a State Manager (state machine)
190
+ * @namespace state
191
+ */
192
+ var state = {
193
+
194
+ /**
195
+ * default state ID for Loading Stage
196
+ * @constant
197
+ * @name LOADING
198
+ * @memberof state
199
+ */
200
+ LOADING : 0,
201
+
202
+ /**
203
+ * default state ID for Menu Stage
204
+ * @constant
205
+ * @name MENU
206
+ * @memberof state
207
+ */
208
+ MENU : 1,
209
+
210
+ /**
211
+ * default state ID for "Ready" Stage
212
+ * @constant
213
+ * @name READY
214
+ * @memberof state
215
+ */
216
+ READY : 2,
217
+
218
+ /**
219
+ * default state ID for Play Stage
220
+ * @constant
221
+ * @name PLAY
222
+ * @memberof state
223
+ */
224
+ PLAY : 3,
225
+
226
+ /**
227
+ * default state ID for Game Over Stage
228
+ * @constant
229
+ * @name GAMEOVER
230
+ * @memberof state
231
+ */
232
+ GAMEOVER : 4,
233
+
234
+ /**
235
+ * default state ID for Game End Stage
236
+ * @constant
237
+ * @name GAME_END
238
+ * @memberof state
239
+ */
240
+ GAME_END : 5,
241
+
242
+ /**
243
+ * default state ID for High Score Stage
244
+ * @constant
245
+ * @name SCORE
246
+ * @memberof state
247
+ */
248
+ SCORE : 6,
249
+
250
+ /**
251
+ * default state ID for Credits Stage
252
+ * @constant
253
+ * @name CREDITS
254
+ * @memberof state
255
+ */
256
+ CREDITS : 7,
257
+
258
+ /**
259
+ * default state ID for Settings Stage
260
+ * @constant
261
+ * @name SETTINGS
262
+ * @memberof state
263
+ */
264
+ SETTINGS : 8,
265
+
266
+ /**
267
+ * default state ID for the default Stage
268
+ * (the default stage is the one running as soon as melonJS is started)
269
+ * @constant
270
+ * @name SETTINGS
271
+ * @memberof state
272
+ */
273
+ DEFAULT : 9,
274
+
275
+ /**
276
+ * default state ID for user defined constants<br>
277
+ * @constant
278
+ * @name USER
279
+ * @memberof state
280
+ * @example
281
+ * var STATE_INFO = me.state.USER + 0;
282
+ * var STATE_WARN = me.state.USER + 1;
283
+ * var STATE_ERROR = me.state.USER + 2;
284
+ * var STATE_CUTSCENE = me.state.USER + 3;
285
+ */
286
+ USER : 100,
287
+
288
+ /**
289
+ * Stop the current stage.
290
+ * @name stop
291
+ * @memberof state
292
+ * @public
293
+ * @param {boolean} [pauseTrack=false] - pause current track on screen stop.
294
+ */
295
+ stop(pauseTrack=false) {
296
+ // only stop when we are not loading stuff
297
+ if ((_state !== this.LOADING) && this.isRunning()) {
298
+ // stop the main loop
299
+ _stopRunLoop();
300
+
301
+ // current music stop
302
+ if (pauseTrack === true) {
303
+ pauseTrack();
304
+ }
305
+
306
+ // store time when stopped
307
+ _pauseTime = globalThis.performance.now();
308
+
309
+ // publish the stop notification
310
+ emit(STATE_STOP);
311
+ }
312
+ },
313
+
314
+ /**
315
+ * pause the current stage
316
+ * @name pause
317
+ * @memberof state
318
+ * @public
319
+ * @param {boolean} [music=false] - pause current music track on screen pause
320
+ */
321
+ pause(music=false) {
322
+ // only pause when we are not loading stuff
323
+ if ((_state !== this.LOADING) && !this.isPaused()) {
324
+ // stop the main loop
325
+ _pauseRunLoop();
326
+ // current music stop
327
+ if (music === true) {
328
+ pauseTrack();
329
+ }
330
+
331
+ // store time when paused
332
+ _pauseTime = globalThis.performance.now();
333
+
334
+ // publish the pause event
335
+ emit(STATE_PAUSE);
336
+ }
337
+ },
338
+
339
+ /**
340
+ * Restart the current stage from a full stop.
341
+ * @name restart
342
+ * @memberof state
343
+ * @public
344
+ * @param {boolean} [music=false] - resume current music track on screen resume
345
+ */
346
+ restart(music=false) {
347
+ if (!this.isRunning()) {
348
+ // restart the main loop
349
+ _startRunLoop();
350
+ // current music stop
351
+ if (music === true) {
352
+ resumeTrack();
353
+ }
354
+
355
+ // calculate the elpased time
356
+ _pauseTime = globalThis.performance.now() - _pauseTime;
357
+
358
+ // force repaint
359
+ game.repaint();
360
+
361
+ // publish the restart notification
362
+ emit(STATE_RESTART, _pauseTime);
363
+ }
364
+ },
365
+
366
+ /**
367
+ * resume the current stage
368
+ * @name resume
369
+ * @memberof state
370
+ * @public
371
+ * @param {boolean} [music=false] - resume current music track on screen resume
372
+ */
373
+ resume(music=false) {
374
+ if (this.isPaused()) {
375
+ // resume the main loop
376
+ _resumeRunLoop();
377
+ // current music stop
378
+ if (music === true) {
379
+ resumeTrack();
380
+ }
381
+
382
+ // calculate the elpased time
383
+ _pauseTime = globalThis.performance.now() - _pauseTime;
384
+
385
+ // publish the resume event
386
+ emit(STATE_RESUME, _pauseTime);
387
+ }
388
+ },
389
+
390
+ /**
391
+ * return the running state of the state manager
392
+ * @name isRunning
393
+ * @memberof state
394
+ * @public
395
+ * @returns {boolean} true if a "process is running"
396
+ */
397
+ isRunning() {
398
+ return _animFrameId !== -1;
399
+ },
400
+
401
+ /**
402
+ * Return the pause state of the state manager
403
+ * @name isPaused
404
+ * @memberof state
405
+ * @public
406
+ * @returns {boolean} true if the game is paused
407
+ */
408
+ isPaused() {
409
+ return _isPaused;
410
+ },
411
+
412
+ /**
413
+ * associate the specified state with a Stage
414
+ * @name set
415
+ * @memberof state
416
+ * @public
417
+ * @param {number} state - State ID (see constants)
418
+ * @param {Stage} stage - Instantiated Stage to associate with state ID
419
+ * @param {boolean} [start = false] - if true the state will be changed immediately after adding it.
420
+ * @example
421
+ * class MenuButton extends me.GUI_Object {
422
+ * onClick() {
423
+ * // Change to the PLAY state when the button is clicked
424
+ * me.state.change(me.state.PLAY);
425
+ * return true;
426
+ * }
427
+ * };
428
+ *
429
+ * class MenuScreen extends me.Stage {
430
+ * onResetEvent() {
431
+ * // Load background image
432
+ * me.game.world.addChild(
433
+ * new me.ImageLayer(0, 0, {
434
+ * image : "bg",
435
+ * z: 0 // z-index
436
+ * }
437
+ * );
438
+ *
439
+ * // Add a button
440
+ * me.game.world.addChild(
441
+ * new MenuButton(350, 200, { "image" : "start" }),
442
+ * 1 // z-index
443
+ * );
444
+ *
445
+ * // Play music
446
+ * me.audio.playTrack("menu");
447
+ * }
448
+ *
449
+ * onDestroyEvent() {
450
+ * // Stop music
451
+ * me.audio.stopTrack();
452
+ * }
453
+ * };
454
+ *
455
+ * me.state.set(me.state.MENU, new MenuScreen());
456
+ */
457
+ set(state, stage, start = false) {
458
+ if (!(stage instanceof Stage)) {
459
+ throw new Error(stage + " is not an instance of me.Stage");
460
+ }
461
+ _stages[state] = {};
462
+ _stages[state].stage = stage;
463
+ _stages[state].transition = true;
464
+
465
+ if (start === true) {
466
+ this.change(state);
467
+ }
468
+ },
469
+
470
+ /**
471
+ * returns the stage associated with the specified state
472
+ * (or the current one if none is specified)
473
+ * @name set
474
+ * @memberof state
475
+ * @public
476
+ * @param {number} [state] - State ID (see constants)
477
+ * @returns {Stage}
478
+ */
479
+ get(state = _state) {
480
+ if (typeof _stages[state] !== "undefined") {
481
+ return _stages[state].stage;
482
+ } else {
483
+ return undefined;
484
+ }
485
+
486
+ },
487
+
488
+ /**
489
+ * return a reference to the current stage<br>
490
+ * useful to call a object specific method
491
+ * @name current
492
+ * @memberof state
493
+ * @public
494
+ * @returns {Stage}
495
+ */
496
+ current() {
497
+ return this.get();
498
+ },
499
+
500
+ /**
501
+ * specify a global transition effect
502
+ * @name transition
503
+ * @memberof state
504
+ * @public
505
+ * @param {string} effect - (only "fade" is supported for now)
506
+ * @param {Color|string} color - a CSS color value
507
+ * @param {number} [duration=1000] - expressed in milliseconds
508
+ */
509
+ transition(effect, color, duration) {
510
+ if (effect === "fade") {
511
+ _fade.color = color;
512
+ _fade.duration = duration;
513
+ }
514
+ },
515
+
516
+ /**
517
+ * enable/disable transition for a specific state (by default enabled for all)
518
+ * @name setTransition
519
+ * @memberof state
520
+ * @public
521
+ * @param {number} state - State ID (see constants)
522
+ * @param {boolean} enable
523
+ */
524
+ setTransition(state, enable) {
525
+ _stages[state].transition = enable;
526
+ },
527
+
528
+ /**
529
+ * change the game/app state
530
+ * @name change
531
+ * @memberof state
532
+ * @public
533
+ * @param {number} state - State ID (see constants)
534
+ * @param {boolean} forceChange - if true the state will be changed immediately
535
+ * @param {object} [...arguments] - extra arguments to be passed to the reset functions
536
+ * @example
537
+ * // The onResetEvent method on the play screen will receive two args:
538
+ * // "level_1" and the number 3
539
+ * me.state.change(me.state.PLAY, "level_1", 3);
540
+ */
541
+ change(state, forceChange) {
542
+ // Protect against undefined Stage
543
+ if (typeof(_stages[state]) === "undefined") {
544
+ throw new Error("Undefined Stage for state '" + state + "'");
545
+ }
546
+
547
+ // do nothing if already the current state
548
+ if (!this.isCurrent(state)) {
549
+ _extraArgs = null;
550
+ if (arguments.length > 1) {
551
+ // store extra arguments if any
552
+ _extraArgs = Array.prototype.slice.call(arguments, 1);
553
+ }
554
+ // if fading effect
555
+ if (_fade.duration && _stages[state].transition) {
556
+ _onSwitchComplete = () => {
557
+ game.viewport.fadeOut(_fade.color, _fade.duration);
558
+ };
559
+ game.viewport.fadeIn(
560
+ _fade.color,
561
+ _fade.duration,
562
+ function () {
563
+ defer(_switchState, this, state);
564
+ }
565
+ );
566
+
567
+ }
568
+ // else just switch without any effects
569
+ else {
570
+ // wait for the last frame to be
571
+ // "finished" before switching
572
+ if (forceChange === true) {
573
+ _switchState(state);
574
+ } else {
575
+ defer(_switchState, this, state);
576
+ }
577
+ }
578
+ }
579
+ },
580
+
581
+ /**
582
+ * return true if the specified state is the current one
583
+ * @name isCurrent
584
+ * @memberof state
585
+ * @public
586
+ * @param {number} state - State ID (see constants)
587
+ * @returns {boolean} true if the specified state is the current one
588
+ */
589
+ isCurrent(state) {
590
+ return _state === state;
591
+ }
592
+
593
+ };
594
+ var state$1 = state;
595
+
596
+ export { state$1 as default };