melonjs 14.0.2 → 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,267 @@
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 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
+ var ParticleEmitter$1 = ParticleEmitter;
266
+
267
+ export { ParticleEmitter$1 as default };
@@ -0,0 +1,188 @@
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 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
+ var Particle$1 = Particle;
187
+
188
+ export { Particle$1 as default };