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,265 @@
|
|
|
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 pool from '../system/pooling.js';
|
|
9
|
+
import ParticleEmitterSettings from './settings.js';
|
|
10
|
+
import { randomFloat } from '../math/math.js';
|
|
11
|
+
import Container from '../renderable/container.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @ignore
|
|
15
|
+
*/
|
|
16
|
+
function createDefaultParticleTexture(w = 8, h = 8) {
|
|
17
|
+
var defaultParticleTexture = pool.pull("CanvasTexture", w, h, { offscreenCanvas: true });
|
|
18
|
+
|
|
19
|
+
defaultParticleTexture.context.fillStyle = "#fff";
|
|
20
|
+
defaultParticleTexture.context.fillRect(0, 0, w, h);
|
|
21
|
+
|
|
22
|
+
return defaultParticleTexture;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @classdesc
|
|
27
|
+
* Particle Emitter Object.
|
|
28
|
+
* @augments Container
|
|
29
|
+
*/
|
|
30
|
+
class ParticleEmitter extends Container {
|
|
31
|
+
/**
|
|
32
|
+
* @param {number} x - x position of the particle emitter
|
|
33
|
+
* @param {number} y - y position of the particle emitter
|
|
34
|
+
* @param {ParticleEmitterSettings} [settings=ParticleEmitterSettings] - the settings for the particle emitter.
|
|
35
|
+
* @example
|
|
36
|
+
* // Create a particle emitter at position 100, 100
|
|
37
|
+
* var emitter = new ParticleEmitter(100, 100, {
|
|
38
|
+
* width: 16,
|
|
39
|
+
* height : 16,
|
|
40
|
+
* tint: "#f00",
|
|
41
|
+
* totalParticles: 32,
|
|
42
|
+
* angle: 0,
|
|
43
|
+
* angleVariation: 6.283185307179586,
|
|
44
|
+
* maxLife: 5,
|
|
45
|
+
* speed: 3
|
|
46
|
+
* });
|
|
47
|
+
*
|
|
48
|
+
* // Add the emitter to the game world
|
|
49
|
+
* me.game.world.addChild(emitter);
|
|
50
|
+
*
|
|
51
|
+
* // Launch all particles one time and stop, like a explosion
|
|
52
|
+
* emitter.burstParticles();
|
|
53
|
+
*
|
|
54
|
+
* // Launch constantly the particles, like a fountain
|
|
55
|
+
* emitter.streamParticles();
|
|
56
|
+
*
|
|
57
|
+
* // At the end, remove emitter from the game world
|
|
58
|
+
* // call this in onDestroyEvent function
|
|
59
|
+
* me.game.world.removeChild(emitter);
|
|
60
|
+
*/
|
|
61
|
+
constructor(x, y, settings = {}) {
|
|
62
|
+
// call the super constructor
|
|
63
|
+
super(
|
|
64
|
+
x, y,
|
|
65
|
+
settings.width | 1,
|
|
66
|
+
settings.height | 1
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* the current (active) emitter settings
|
|
71
|
+
* @public
|
|
72
|
+
* @type {ParticleEmitterSettings}
|
|
73
|
+
* @name settings
|
|
74
|
+
* @memberof ParticleEmitter
|
|
75
|
+
*/
|
|
76
|
+
this.settings = {};
|
|
77
|
+
|
|
78
|
+
// center the emitter around the given coordinates
|
|
79
|
+
this.centerOn(x, y);
|
|
80
|
+
|
|
81
|
+
// Emitter is Stream, launch particles constantly
|
|
82
|
+
/** @ignore */
|
|
83
|
+
this._stream = false;
|
|
84
|
+
|
|
85
|
+
// Frequency timer (in ms) for emitter launch new particles
|
|
86
|
+
// used only in stream emitter
|
|
87
|
+
/** @ignore */
|
|
88
|
+
this._frequencyTimer = 0;
|
|
89
|
+
|
|
90
|
+
// Time of live (in ms) for emitter launch new particles
|
|
91
|
+
// used only in stream emitter
|
|
92
|
+
/** @ignore */
|
|
93
|
+
this._durationTimer = 0;
|
|
94
|
+
|
|
95
|
+
// Emitter is emitting particles
|
|
96
|
+
/** @ignore */
|
|
97
|
+
this._enabled = false;
|
|
98
|
+
|
|
99
|
+
// Emitter will always update
|
|
100
|
+
this.alwaysUpdate = true;
|
|
101
|
+
|
|
102
|
+
// don't sort the particles by z-index
|
|
103
|
+
this.autoSort = false;
|
|
104
|
+
|
|
105
|
+
// count the updates
|
|
106
|
+
this._updateCount = 0;
|
|
107
|
+
|
|
108
|
+
// internally store how much time was skipped when frames are skipped
|
|
109
|
+
this._dt = 0;
|
|
110
|
+
|
|
111
|
+
//this.anchorPoint.set(0, 0);
|
|
112
|
+
|
|
113
|
+
// Reset the emitter to defaults
|
|
114
|
+
this.reset(settings);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Reset the emitter with particle emitter settings.
|
|
119
|
+
* @param {ParticleEmitterSettings} settings - [optional] object with emitter settings. See {@link ParticleEmitterSettings}
|
|
120
|
+
*/
|
|
121
|
+
reset(settings = {}) {
|
|
122
|
+
Object.assign(this.settings, ParticleEmitterSettings, settings);
|
|
123
|
+
|
|
124
|
+
if (typeof this.settings.image === "undefined") {
|
|
125
|
+
this._defaultParticle = createDefaultParticleTexture(settings.textureSize, settings.textureSize);
|
|
126
|
+
this.settings.image = this._defaultParticle.canvas;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
this.floating = this.settings.floating;
|
|
130
|
+
|
|
131
|
+
this.isDirty = true;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* returns a random point on the x axis within the bounds of this emitter
|
|
136
|
+
* @returns {number}
|
|
137
|
+
*/
|
|
138
|
+
getRandomPointX() {
|
|
139
|
+
return randomFloat(0, this.getBounds().width);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* returns a random point on the y axis within the bounds this emitter
|
|
144
|
+
* @returns {number}
|
|
145
|
+
*/
|
|
146
|
+
getRandomPointY() {
|
|
147
|
+
return randomFloat(0, this.getBounds().height);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Add count particles in the game world
|
|
151
|
+
/** @ignore */
|
|
152
|
+
addParticles(count) {
|
|
153
|
+
for (var i = 0; i < count; i++) {
|
|
154
|
+
// Add particle to the container
|
|
155
|
+
this.addChild(pool.pull("Particle", this), this.pos.z);
|
|
156
|
+
}
|
|
157
|
+
this.isDirty = true;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Emitter is of type stream and is launching particles
|
|
162
|
+
* @returns {boolean} Emitter is Stream and is launching particles
|
|
163
|
+
*/
|
|
164
|
+
isRunning() {
|
|
165
|
+
return this._enabled && this._stream;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Launch particles from emitter constantly (e.g. for stream)
|
|
170
|
+
* @param {number} duration - [optional] time that the emitter releases particles in ms
|
|
171
|
+
*/
|
|
172
|
+
streamParticles(duration) {
|
|
173
|
+
this._enabled = true;
|
|
174
|
+
this._stream = true;
|
|
175
|
+
this.settings.frequency = Math.max(1, this.settings.frequency);
|
|
176
|
+
this._durationTimer = (typeof duration === "number") ? duration : this.settings.duration;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Stop the emitter from generating new particles (used only if emitter is Stream)
|
|
181
|
+
*/
|
|
182
|
+
stopStream() {
|
|
183
|
+
this._enabled = false;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Launch all particles from emitter and stop (e.g. for explosion)
|
|
188
|
+
* @param {number} total - [optional] number of particles to launch
|
|
189
|
+
*/
|
|
190
|
+
burstParticles(total) {
|
|
191
|
+
this._enabled = true;
|
|
192
|
+
this._stream = false;
|
|
193
|
+
this.addParticles((typeof total === "number") ? total : this.settings.totalParticles);
|
|
194
|
+
this._enabled = false;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @ignore
|
|
199
|
+
*/
|
|
200
|
+
update(dt) {
|
|
201
|
+
// skip frames if necessary
|
|
202
|
+
if (++this._updateCount > this.settings.framesToSkip) {
|
|
203
|
+
this._updateCount = 0;
|
|
204
|
+
}
|
|
205
|
+
if (this._updateCount > 0) {
|
|
206
|
+
this._dt += dt;
|
|
207
|
+
return this.isDirty;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// apply skipped delta time
|
|
211
|
+
dt += this._dt;
|
|
212
|
+
this._dt = 0;
|
|
213
|
+
|
|
214
|
+
// Update particles
|
|
215
|
+
this.isDirty |= super.update(dt);
|
|
216
|
+
|
|
217
|
+
// Launch new particles, if emitter is Stream
|
|
218
|
+
if ((this._enabled) && (this._stream)) {
|
|
219
|
+
// Check if the emitter has duration set
|
|
220
|
+
if (this._durationTimer !== Infinity) {
|
|
221
|
+
this._durationTimer -= dt;
|
|
222
|
+
|
|
223
|
+
if (this._durationTimer <= 0) {
|
|
224
|
+
this.stopStream();
|
|
225
|
+
return this.isDirty;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Increase the emitter launcher timer
|
|
230
|
+
this._frequencyTimer += dt;
|
|
231
|
+
|
|
232
|
+
// Check for new particles launch
|
|
233
|
+
var particlesCount = this.children.length;
|
|
234
|
+
if ((particlesCount < this.settings.totalParticles) && (this._frequencyTimer >= this.settings.frequency)) {
|
|
235
|
+
if ((particlesCount + this.settings.maxParticles) <= this.settings.totalParticles) {
|
|
236
|
+
this.addParticles(this.settings.maxParticles);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
this.addParticles(this.settings.totalParticles - particlesCount);
|
|
240
|
+
}
|
|
241
|
+
this._frequencyTimer = 0;
|
|
242
|
+
this.isDirty = true;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return this.isDirty;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Destroy function
|
|
250
|
+
* @ignore
|
|
251
|
+
*/
|
|
252
|
+
destroy() {
|
|
253
|
+
// call the parent destroy method
|
|
254
|
+
super.destroy(arguments);
|
|
255
|
+
// clean emitter specific Properties
|
|
256
|
+
if (typeof this._defaultParticle !== "undefined") {
|
|
257
|
+
pool.push(this._defaultParticle);
|
|
258
|
+
this._defaultParticle = undefined;
|
|
259
|
+
}
|
|
260
|
+
this.settings.image = undefined;
|
|
261
|
+
this.settings = undefined;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export { ParticleEmitter as default };
|
|
@@ -0,0 +1,186 @@
|
|
|
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 pool from '../system/pooling.js';
|
|
9
|
+
import timer from '../system/timer.js';
|
|
10
|
+
import { randomFloat, clamp } from '../math/math.js';
|
|
11
|
+
import Renderable from '../renderable/renderable.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @classdesc
|
|
15
|
+
* Single Particle Object.
|
|
16
|
+
* @augments Renderable
|
|
17
|
+
*/
|
|
18
|
+
class Particle extends Renderable {
|
|
19
|
+
/**
|
|
20
|
+
* @param {ParticleEmitter} emitter - the particle emitter
|
|
21
|
+
*/
|
|
22
|
+
constructor(emitter) {
|
|
23
|
+
// Call the super constructor
|
|
24
|
+
super(
|
|
25
|
+
emitter.getRandomPointX(),
|
|
26
|
+
emitter.getRandomPointY(),
|
|
27
|
+
emitter.settings.image.width,
|
|
28
|
+
emitter.settings.image.height
|
|
29
|
+
);
|
|
30
|
+
this.onResetEvent(emitter, true);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @ignore
|
|
35
|
+
*/
|
|
36
|
+
onResetEvent(emitter, newInstance = false) {
|
|
37
|
+
if (newInstance === false) {
|
|
38
|
+
this.pos.set(
|
|
39
|
+
emitter.getRandomPointX(),
|
|
40
|
+
emitter.getRandomPointY()
|
|
41
|
+
);
|
|
42
|
+
this.resize(
|
|
43
|
+
emitter.settings.image.width,
|
|
44
|
+
emitter.settings.image.height
|
|
45
|
+
);
|
|
46
|
+
this.currentTransform.identity();
|
|
47
|
+
} else {
|
|
48
|
+
// particle velocity
|
|
49
|
+
this.vel = pool.pull("Vector2d");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
this.image = emitter.settings.image;
|
|
53
|
+
|
|
54
|
+
// Particle will always update
|
|
55
|
+
this.alwaysUpdate = true;
|
|
56
|
+
|
|
57
|
+
if (typeof emitter.settings.tint === "string") {
|
|
58
|
+
this.tint.parseCSS(emitter.settings.tint);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (emitter.settings.textureAdditive === true) {
|
|
62
|
+
this.blendMode = "additive";
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (emitter.settings.blendMode !== "normal") {
|
|
66
|
+
this.blendMode = emitter.settings.blendMode;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Set the start particle Angle and Speed as defined in emitter
|
|
70
|
+
var angle = emitter.settings.angle + ((emitter.settings.angleVariation > 0) ? (randomFloat(0, 2) - 1) * emitter.settings.angleVariation : 0);
|
|
71
|
+
var speed = emitter.settings.speed + ((emitter.settings.speedVariation > 0) ? (randomFloat(0, 2) - 1) * emitter.settings.speedVariation : 0);
|
|
72
|
+
|
|
73
|
+
// Set the start particle Velocity
|
|
74
|
+
this.vel.set(speed * Math.cos(angle), -speed * Math.sin(angle));
|
|
75
|
+
|
|
76
|
+
// Set the start particle Time of Life as defined in emitter
|
|
77
|
+
this.life = randomFloat(emitter.settings.minLife, emitter.settings.maxLife);
|
|
78
|
+
this.startLife = this.life;
|
|
79
|
+
|
|
80
|
+
// Set the start and end particle Scale as defined in emitter
|
|
81
|
+
// clamp the values as minimum and maximum scales range
|
|
82
|
+
this.startScale = clamp(
|
|
83
|
+
randomFloat(emitter.settings.minStartScale, emitter.settings.maxStartScale),
|
|
84
|
+
emitter.settings.minStartScale,
|
|
85
|
+
emitter.settings.maxStartScale
|
|
86
|
+
);
|
|
87
|
+
this.endScale = clamp(
|
|
88
|
+
randomFloat(emitter.settings.minEndScale, emitter.settings.maxEndScale),
|
|
89
|
+
emitter.settings.minEndScale,
|
|
90
|
+
emitter.settings.maxEndScale
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// Set the particle Gravity and Wind (horizontal gravity) as defined in emitter
|
|
94
|
+
this.gravity = emitter.settings.gravity;
|
|
95
|
+
this.wind = emitter.settings.wind;
|
|
96
|
+
|
|
97
|
+
// Set if the particle update the rotation in accordance the trajectory
|
|
98
|
+
this.followTrajectory = emitter.settings.followTrajectory;
|
|
99
|
+
|
|
100
|
+
// Set if the particle update only in Viewport
|
|
101
|
+
this.onlyInViewport = emitter.settings.onlyInViewport;
|
|
102
|
+
|
|
103
|
+
// cache inverse of the expected delta time
|
|
104
|
+
this._deltaInv = timer.maxfps / 1000;
|
|
105
|
+
|
|
106
|
+
// Set the start particle rotation as defined in emitter
|
|
107
|
+
// if the particle not follow trajectory
|
|
108
|
+
if (!emitter.settings.followTrajectory) {
|
|
109
|
+
this.angle = randomFloat(emitter.settings.minRotation, emitter.settings.maxRotation);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Update the Particle <br>
|
|
115
|
+
* This is automatically called by the game manager {@link game}
|
|
116
|
+
* @ignore
|
|
117
|
+
* @param {number} dt - time since the last update in milliseconds
|
|
118
|
+
*/
|
|
119
|
+
update(dt) {
|
|
120
|
+
// move things forward independent of the current frame rate
|
|
121
|
+
var skew = dt * this._deltaInv;
|
|
122
|
+
|
|
123
|
+
// Decrease particle life
|
|
124
|
+
this.life = this.life > dt ? this.life - dt : 0;
|
|
125
|
+
|
|
126
|
+
if (this.life <= 0) {
|
|
127
|
+
this.ancestor.removeChild(this);
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Calculate the particle Age Ratio
|
|
132
|
+
var ageRatio = this.life / this.startLife;
|
|
133
|
+
|
|
134
|
+
// Resize the particle as particle Age Ratio
|
|
135
|
+
var scale = this.startScale;
|
|
136
|
+
if (this.startScale > this.endScale) {
|
|
137
|
+
scale *= ageRatio;
|
|
138
|
+
scale = (scale < this.endScale) ? this.endScale : scale;
|
|
139
|
+
}
|
|
140
|
+
else if (this.startScale < this.endScale) {
|
|
141
|
+
scale /= ageRatio;
|
|
142
|
+
scale = (scale > this.endScale) ? this.endScale : scale;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Set the particle opacity as Age Ratio
|
|
146
|
+
this.alpha = ageRatio;
|
|
147
|
+
|
|
148
|
+
// Adjust the particle velocity
|
|
149
|
+
this.vel.x += this.wind * skew;
|
|
150
|
+
this.vel.y += this.gravity * skew;
|
|
151
|
+
|
|
152
|
+
// If necessary update the rotation of particle in accordance the particle trajectory
|
|
153
|
+
var angle = this.followTrajectory ? Math.atan2(this.vel.y, this.vel.x) : this.angle;
|
|
154
|
+
|
|
155
|
+
this.pos.x += this.vel.x * skew;
|
|
156
|
+
this.pos.y += this.vel.y * skew;
|
|
157
|
+
|
|
158
|
+
// Update particle transform
|
|
159
|
+
this.currentTransform.setTransform(
|
|
160
|
+
scale, 0, 0,
|
|
161
|
+
0, scale, 0,
|
|
162
|
+
this.pos.x, this.pos.y, 1
|
|
163
|
+
).rotate(angle);
|
|
164
|
+
|
|
165
|
+
// mark as dirty if the particle is not dead yet
|
|
166
|
+
this.isDirty = this.inViewport || !this.onlyInViewport;
|
|
167
|
+
|
|
168
|
+
return super.update(dt);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* @ignore
|
|
173
|
+
*/
|
|
174
|
+
draw(renderer) {
|
|
175
|
+
var w = this.width, h = this.height;
|
|
176
|
+
renderer.drawImage(
|
|
177
|
+
this.image,
|
|
178
|
+
0, 0,
|
|
179
|
+
w, h,
|
|
180
|
+
-w / 2, -h / 2,
|
|
181
|
+
w, h
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export { Particle as default };
|