melonjs 14.0.2 → 14.1.1
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/README.md +2 -0
- package/dist/melonjs.mjs/_virtual/_commonjsHelpers.js +10 -0
- package/dist/melonjs.mjs/_virtual/arraymultimap.js +10 -0
- package/dist/melonjs.mjs/_virtual/earcut.js +10 -0
- package/dist/melonjs.mjs/_virtual/howler.js +10 -0
- package/dist/melonjs.mjs/_virtual/index.js +10 -0
- package/dist/melonjs.mjs/_virtual/index2.js +10 -0
- package/dist/melonjs.mjs/_virtual/multimap.js +10 -0
- package/dist/melonjs.mjs/_virtual/setmultimap.js +10 -0
- package/dist/melonjs.mjs/application/application.js +238 -0
- package/dist/melonjs.mjs/audio/audio.js +536 -0
- package/dist/melonjs.mjs/camera/camera2d.js +731 -0
- package/dist/melonjs.mjs/entity/entity.js +247 -0
- package/dist/melonjs.mjs/game.js +29 -0
- package/dist/melonjs.mjs/geometries/ellipse.js +274 -0
- package/dist/melonjs.mjs/geometries/line.js +115 -0
- package/dist/melonjs.mjs/geometries/path2d.js +318 -0
- package/dist/melonjs.mjs/geometries/point.js +88 -0
- package/dist/melonjs.mjs/geometries/poly.js +498 -0
- package/dist/melonjs.mjs/geometries/rectangle.js +374 -0
- package/dist/melonjs.mjs/geometries/roundrect.js +167 -0
- package/dist/melonjs.mjs/index.js +248 -0
- package/dist/melonjs.mjs/input/gamepad.js +501 -0
- package/dist/melonjs.mjs/input/input.js +26 -0
- package/dist/melonjs.mjs/input/keyboard.js +470 -0
- package/dist/melonjs.mjs/input/pointer.js +393 -0
- package/dist/melonjs.mjs/input/pointerevent.js +818 -0
- package/dist/melonjs.mjs/lang/deprecated.js +157 -0
- package/dist/melonjs.mjs/level/level.js +297 -0
- package/dist/melonjs.mjs/level/tiled/TMXGroup.js +141 -0
- package/dist/melonjs.mjs/level/tiled/TMXLayer.js +446 -0
- package/dist/melonjs.mjs/level/tiled/TMXObject.js +355 -0
- package/dist/melonjs.mjs/level/tiled/TMXTile.js +193 -0
- package/dist/melonjs.mjs/level/tiled/TMXTileMap.js +636 -0
- package/dist/melonjs.mjs/level/tiled/TMXTileset.js +309 -0
- package/dist/melonjs.mjs/level/tiled/TMXTilesetGroup.js +81 -0
- package/dist/melonjs.mjs/level/tiled/TMXUtils.js +367 -0
- package/dist/melonjs.mjs/level/tiled/renderer/TMXHexagonalRenderer.js +504 -0
- package/dist/melonjs.mjs/level/tiled/renderer/TMXIsometricRenderer.js +218 -0
- package/dist/melonjs.mjs/level/tiled/renderer/TMXOrthogonalRenderer.js +155 -0
- package/dist/melonjs.mjs/level/tiled/renderer/TMXRenderer.js +124 -0
- package/dist/melonjs.mjs/level/tiled/renderer/TMXStaggeredRenderer.js +107 -0
- package/dist/melonjs.mjs/loader/loader.js +801 -0
- package/dist/melonjs.mjs/loader/loadingscreen.js +120 -0
- package/dist/melonjs.mjs/loader/melonjs_logo.png.js +11 -0
- package/dist/melonjs.mjs/math/color.js +616 -0
- package/dist/melonjs.mjs/math/math.js +218 -0
- package/dist/melonjs.mjs/math/matrix2.js +501 -0
- package/dist/melonjs.mjs/math/matrix3.js +679 -0
- package/dist/melonjs.mjs/math/observable_vector2.js +469 -0
- package/dist/melonjs.mjs/math/observable_vector3.js +559 -0
- package/dist/melonjs.mjs/math/vector2.js +526 -0
- package/dist/melonjs.mjs/math/vector3.js +567 -0
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/arraymultimap.js +73 -0
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/index.js +21 -0
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/multimap.js +324 -0
- package/dist/melonjs.mjs/node_modules/@teppeis/multimaps/dist/src/setmultimap.js +69 -0
- package/dist/melonjs.mjs/node_modules/earcut/src/earcut.js +691 -0
- package/dist/melonjs.mjs/node_modules/eventemitter3/index.js +350 -0
- package/dist/melonjs.mjs/node_modules/howler/dist/howler.js +3241 -0
- package/dist/melonjs.mjs/particles/emitter.js +265 -0
- package/dist/melonjs.mjs/particles/particle.js +186 -0
- package/dist/melonjs.mjs/particles/settings.js +319 -0
- package/dist/melonjs.mjs/physics/body.js +702 -0
- package/dist/melonjs.mjs/physics/bounds.js +459 -0
- package/dist/melonjs.mjs/physics/collision.js +132 -0
- package/dist/melonjs.mjs/physics/detector.js +194 -0
- package/dist/melonjs.mjs/physics/quadtree.js +394 -0
- package/dist/melonjs.mjs/physics/response.js +57 -0
- package/dist/melonjs.mjs/physics/sat.js +483 -0
- package/dist/melonjs.mjs/physics/world.js +219 -0
- package/dist/melonjs.mjs/plugin/plugin.js +141 -0
- package/dist/melonjs.mjs/renderable/collectable.js +60 -0
- package/dist/melonjs.mjs/renderable/colorlayer.js +78 -0
- package/dist/melonjs.mjs/renderable/container.js +1016 -0
- package/dist/melonjs.mjs/renderable/dragndrop.js +224 -0
- package/dist/melonjs.mjs/renderable/imagelayer.js +305 -0
- package/dist/melonjs.mjs/renderable/light2d.js +155 -0
- package/dist/melonjs.mjs/renderable/nineslicesprite.js +246 -0
- package/dist/melonjs.mjs/renderable/renderable.js +781 -0
- package/dist/melonjs.mjs/renderable/sprite.js +653 -0
- package/dist/melonjs.mjs/renderable/trigger.js +156 -0
- package/dist/melonjs.mjs/renderable/ui/uibaseelement.js +212 -0
- package/dist/melonjs.mjs/renderable/ui/uispriteelement.js +225 -0
- package/dist/melonjs.mjs/renderable/ui/uitextbutton.js +127 -0
- package/dist/melonjs.mjs/state/stage.js +236 -0
- package/dist/melonjs.mjs/state/state.js +596 -0
- package/dist/melonjs.mjs/system/device.js +909 -0
- package/dist/melonjs.mjs/system/dom.js +78 -0
- package/dist/melonjs.mjs/system/event.js +537 -0
- package/dist/melonjs.mjs/system/platform.js +41 -0
- package/dist/melonjs.mjs/system/pooling.js +209 -0
- package/dist/melonjs.mjs/system/save.js +157 -0
- package/dist/melonjs.mjs/system/timer.js +286 -0
- package/dist/melonjs.mjs/text/bitmaptext.js +363 -0
- package/dist/melonjs.mjs/text/bitmaptextdata.js +198 -0
- package/dist/melonjs.mjs/text/glyph.js +65 -0
- package/dist/melonjs.mjs/text/text.js +452 -0
- package/dist/melonjs.mjs/text/textmetrics.js +175 -0
- package/dist/melonjs.mjs/text/textstyle.js +23 -0
- package/dist/melonjs.mjs/tweens/easing.js +336 -0
- package/dist/melonjs.mjs/tweens/interpolation.js +112 -0
- package/dist/melonjs.mjs/tweens/tween.js +479 -0
- package/dist/melonjs.mjs/utils/agent.js +76 -0
- package/dist/melonjs.mjs/utils/array.js +63 -0
- package/dist/melonjs.mjs/utils/file.js +42 -0
- package/dist/melonjs.mjs/utils/function.js +70 -0
- package/dist/melonjs.mjs/utils/string.js +82 -0
- package/dist/melonjs.mjs/utils/utils.js +173 -0
- package/dist/melonjs.mjs/video/canvas/canvas_renderer.js +806 -0
- package/dist/melonjs.mjs/video/renderer.js +410 -0
- package/dist/melonjs.mjs/video/texture/atlas.js +519 -0
- package/dist/melonjs.mjs/video/texture/cache.js +143 -0
- package/dist/melonjs.mjs/video/texture/canvas_texture.js +144 -0
- package/dist/melonjs.mjs/video/video.js +462 -0
- package/dist/melonjs.mjs/video/webgl/buffer/vertex.js +142 -0
- package/dist/melonjs.mjs/video/webgl/glshader.js +167 -0
- package/dist/melonjs.mjs/video/webgl/shaders/primitive.frag.js +10 -0
- package/dist/melonjs.mjs/video/webgl/shaders/primitive.vert.js +10 -0
- package/dist/melonjs.mjs/video/webgl/shaders/quad.frag.js +10 -0
- package/dist/melonjs.mjs/video/webgl/shaders/quad.vert.js +10 -0
- package/dist/melonjs.mjs/video/webgl/utils/attributes.js +25 -0
- package/dist/melonjs.mjs/video/webgl/utils/precision.js +20 -0
- package/dist/melonjs.mjs/video/webgl/utils/program.js +67 -0
- package/dist/melonjs.mjs/video/webgl/utils/string.js +25 -0
- package/dist/melonjs.mjs/video/webgl/utils/uniforms.js +92 -0
- package/dist/melonjs.mjs/video/webgl/webgl_compositor.js +494 -0
- package/dist/melonjs.mjs/video/webgl/webgl_renderer.js +1035 -0
- package/dist/melonjs.module.d.ts +1298 -1359
- package/dist/melonjs.module.js +2072 -3520
- package/package.json +21 -16
- package/src/application/application.js +4 -5
- package/src/audio/audio.js +32 -32
- package/src/camera/camera2d.js +32 -33
- package/src/entity/entity.js +18 -19
- package/src/geometries/ellipse.js +17 -18
- package/src/geometries/line.js +6 -7
- package/src/geometries/path2d.js +33 -34
- package/src/geometries/point.js +1 -2
- package/src/geometries/poly.js +16 -18
- package/src/geometries/rectangle.js +19 -20
- package/src/geometries/roundrect.js +9 -10
- package/src/input/gamepad.js +15 -15
- package/src/input/keyboard.js +12 -12
- package/src/input/pointer.js +6 -6
- package/src/input/pointerevent.js +12 -12
- package/src/lang/deprecated.js +12 -12
- package/src/level/level.js +25 -25
- package/src/level/tiled/TMXLayer.js +23 -24
- package/src/level/tiled/TMXTile.js +6 -7
- package/src/level/tiled/TMXTileMap.js +8 -10
- package/src/level/tiled/TMXTileset.js +3 -4
- package/src/level/tiled/TMXTilesetGroup.js +1 -2
- package/src/level/tiled/TMXUtils.js +5 -5
- package/src/level/tiled/renderer/TMXHexagonalRenderer.js +3 -4
- package/src/level/tiled/renderer/TMXIsometricRenderer.js +3 -4
- package/src/level/tiled/renderer/TMXOrthogonalRenderer.js +2 -3
- package/src/level/tiled/renderer/TMXRenderer.js +20 -21
- package/src/level/tiled/renderer/TMXStaggeredRenderer.js +1 -2
- package/src/loader/loader.js +20 -20
- package/src/math/color.js +21 -22
- package/src/math/math.js +16 -16
- package/src/math/matrix2.js +17 -18
- package/src/math/matrix3.js +26 -27
- package/src/math/observable_vector2.js +15 -16
- package/src/math/observable_vector3.js +17 -18
- package/src/math/vector2.js +10 -11
- package/src/math/vector3.js +11 -12
- package/src/particles/emitter.js +7 -8
- package/src/particles/particle.js +3 -4
- package/src/physics/body.js +29 -30
- package/src/physics/bounds.js +10 -10
- package/src/physics/collision.js +2 -2
- package/src/physics/detector.js +6 -6
- package/src/physics/quadtree.js +18 -23
- package/src/physics/sat.js +31 -31
- package/src/physics/world.js +6 -7
- package/src/plugin/plugin.js +5 -5
- package/src/renderable/collectable.js +4 -6
- package/src/renderable/colorlayer.js +6 -8
- package/src/renderable/container.js +25 -27
- package/src/renderable/dragndrop.js +14 -14
- package/src/renderable/imagelayer.js +14 -15
- package/src/renderable/light2d.js +4 -5
- package/src/renderable/nineslicesprite.js +17 -18
- package/src/renderable/renderable.js +26 -28
- package/src/renderable/sprite.js +29 -30
- package/src/renderable/trigger.js +16 -17
- package/src/renderable/ui/uibaseelement.js +8 -9
- package/src/renderable/ui/uispriteelement.js +8 -8
- package/src/renderable/ui/uitextbutton.js +15 -15
- package/src/state/stage.js +8 -9
- package/src/state/state.js +17 -17
- package/src/system/device.js +11 -11
- package/src/system/event.js +10 -10
- package/src/system/pooling.js +9 -9
- package/src/system/save.js +2 -2
- package/src/system/timer.js +10 -10
- package/src/text/bitmaptext.js +19 -20
- package/src/text/bitmaptextdata.js +3 -4
- package/src/text/glyph.js +1 -2
- package/src/text/text.js +24 -25
- package/src/text/textmetrics.js +9 -10
- package/src/tweens/tween.js +20 -21
- package/src/utils/agent.js +5 -5
- package/src/utils/array.js +4 -4
- package/src/utils/file.js +2 -2
- package/src/utils/function.js +6 -6
- package/src/utils/string.js +5 -5
- package/src/utils/utils.js +4 -4
- package/src/video/canvas/canvas_renderer.js +72 -73
- package/src/video/renderer.js +27 -28
- package/src/video/texture/atlas.js +22 -22
- package/src/video/texture/canvas_texture.js +9 -9
- package/src/video/video.js +17 -17
- package/src/video/webgl/buffer/vertex.js +1 -2
- package/src/video/webgl/glshader.js +12 -12
- package/src/video/webgl/webgl_compositor.js +42 -43
- package/src/video/webgl/webgl_renderer.js +76 -77
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* melonJS Game Engine - v14.1.1
|
|
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 };
|