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,224 @@
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 Vector2d from '../math/vector2.js';
9
+ import { emit, DRAGSTART, DRAGEND, on, POINTERMOVE, off } from '../system/event.js';
10
+ import Renderable from './renderable.js';
11
+ import { registerPointerEvent, releasePointerEvent } from '../input/pointerevent.js';
12
+
13
+ /**
14
+ * @classdesc
15
+ * A Draggable base object
16
+ * @see DropTarget
17
+ * @augments Renderable
18
+ */
19
+ class Draggable extends Renderable {
20
+ /**
21
+ * @param {number} x - the x coordinates of the draggable object
22
+ * @param {number} y - the y coordinates of the draggable object
23
+ * @param {number} width - draggable object width
24
+ * @param {number} height - draggable object height
25
+ */
26
+ constructor(x, y, width, height) {
27
+ super(x, y, width, height);
28
+ this.isKinematic = false;
29
+ this.dragging = false;
30
+ this.dragId = null;
31
+ this.grabOffset = new Vector2d(0, 0);
32
+ this.initEvents();
33
+ }
34
+
35
+ /**
36
+ * Initializes the events the modules needs to listen to
37
+ * It translates the pointer events to me.events
38
+ * in order to make them pass through the system and to make
39
+ * this module testable. Then we subscribe this module to the
40
+ * transformed events.
41
+ * @name initEvents
42
+ * @memberof Draggable
43
+ * @private
44
+ */
45
+ initEvents() {
46
+ registerPointerEvent("pointerdown", this, (e) => { emit(DRAGSTART, e, this); });
47
+ registerPointerEvent("pointerup", this, (e) => { emit(DRAGEND, e, this); });
48
+ registerPointerEvent("pointercancel", this, (e) => { emit(DRAGEND, e, this); });
49
+ on(POINTERMOVE, this.dragMove.bind(this));
50
+ on(DRAGSTART, (e, draggable) => {
51
+ if (draggable === this) {
52
+ this.dragStart(e);
53
+ }
54
+ });
55
+ on(DRAGEND, (e, draggable) => {
56
+ if (draggable === this) {
57
+ this.dragEnd(e);
58
+ }
59
+ });
60
+ }
61
+
62
+ /**
63
+ * Gets called when the user starts dragging the entity
64
+ * @name dragStart
65
+ * @memberof Draggable
66
+ * @param {object} e - the pointer event
67
+ * @returns {boolean} false if the object is being dragged
68
+ */
69
+ dragStart(e) {
70
+ if (this.dragging === false) {
71
+ this.dragging = true;
72
+ this.grabOffset.set(e.gameX, e.gameY);
73
+ this.grabOffset.sub(this.pos);
74
+ return false;
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Gets called when the user drags this entity around
80
+ * @name dragMove
81
+ * @memberof Draggable
82
+ * @param {object} e - the pointer event
83
+ */
84
+ dragMove(e) {
85
+ if (this.dragging === true) {
86
+ this.pos.set(e.gameX, e.gameY, this.pos.z); //TODO : z ?
87
+ this.pos.sub(this.grabOffset);
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Gets called when the user stops dragging the entity
93
+ * @name dragEnd
94
+ * @memberof Draggable
95
+ * @returns {boolean} false if the object stopped being dragged
96
+ */
97
+ dragEnd() {
98
+ if (this.dragging === true) {
99
+ this.dragging = false;
100
+ return false;
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Destructor
106
+ * @name destroy
107
+ * @memberof Draggable
108
+ * @ignore
109
+ */
110
+ destroy() {
111
+ off(POINTERMOVE, this.dragMove);
112
+ off(DRAGSTART, this.dragStart);
113
+ off(DRAGEND, this.dragEnd);
114
+ releasePointerEvent("pointerdown", this);
115
+ releasePointerEvent("pointerup", this);
116
+ releasePointerEvent("pointercancel", this);
117
+ super.destroy();
118
+ }
119
+ }
120
+
121
+ /**
122
+ * @classdesc
123
+ * a base drop target object
124
+ * @see Draggable
125
+ * @augments Renderable
126
+ */
127
+ class DropTarget extends Renderable {
128
+ /**
129
+ * @param {number} x - the x coordinates of the drop target
130
+ * @param {number} y - the y coordinates of the drop target
131
+ * @param {number} width - drop target width
132
+ * @param {number} height - drop target height
133
+ */
134
+ constructor(x, y, width, height) {
135
+ super(x, y, width, height);
136
+
137
+ this.isKinematic = false;
138
+
139
+ /**
140
+ * constant for the overlaps method
141
+ * @public
142
+ * @constant
143
+ * @type {string}
144
+ * @name CHECKMETHOD_OVERLAP
145
+ * @memberof DropTarget
146
+ */
147
+ this.CHECKMETHOD_OVERLAP = "overlaps";
148
+
149
+ /**
150
+ * constant for the contains method
151
+ * @public
152
+ * @constant
153
+ * @type {string}
154
+ * @name CHECKMETHOD_CONTAINS
155
+ * @memberof DropTarget
156
+ */
157
+ this.CHECKMETHOD_CONTAINS = "contains";
158
+
159
+ /**
160
+ * the checkmethod we want to use
161
+ * @public
162
+ * @constant
163
+ * @type {string}
164
+ * @name checkMethod
165
+ * @default "overlaps"
166
+ * @memberof DropTarget
167
+ */
168
+ this.checkMethod = this.CHECKMETHOD_OVERLAP;
169
+
170
+ on(DRAGEND, this.checkOnMe, this);
171
+
172
+ }
173
+
174
+ /**
175
+ * Sets the collision method which is going to be used to check a valid drop
176
+ * @name setCheckMethod
177
+ * @memberof DropTarget
178
+ * @param {string} checkMethod - the checkmethod (defaults to CHECKMETHOD_OVERLAP)
179
+ */
180
+ setCheckMethod(checkMethod) {
181
+ // We can improve this check,
182
+ // because now you can use every method in theory
183
+ if (typeof(this.getBounds()[this.checkMethod]) === "function") {
184
+ this.checkMethod = checkMethod;
185
+ }
186
+ }
187
+
188
+ /**
189
+ * Checks if a dropped entity is dropped on the current entity
190
+ * @name checkOnMe
191
+ * @memberof DropTarget
192
+ * @param {object} e - the triggering event
193
+ * @param {Draggable} draggable - the draggable object that is dropped
194
+ */
195
+ checkOnMe(e, draggable) {
196
+ if (draggable && this.getBounds()[this.checkMethod](draggable.getBounds())) {
197
+ // call the drop method on the current entity
198
+ this.drop(draggable);
199
+ }
200
+ }
201
+
202
+ /**
203
+ * Gets called when a draggable entity is dropped on the current entity
204
+ * @name drop
205
+ * @memberof DropTarget
206
+ * @param {Draggable} draggable - the draggable object that is dropped
207
+ */
208
+ drop(draggable) { // eslint-disable-line no-unused-vars
209
+
210
+ }
211
+
212
+ /**
213
+ * Destructor
214
+ * @name destroy
215
+ * @memberof DropTarget
216
+ * @ignore
217
+ */
218
+ destroy() {
219
+ off(DRAGEND, this.checkOnMe);
220
+ super.destroy();
221
+ }
222
+ }
223
+
224
+ export { Draggable, DropTarget };
@@ -0,0 +1,306 @@
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 { renderer } from '../video/video.js';
9
+ import { on, ONCONTEXT_RESTORED, VIEWPORT_ONCHANGE, VIEWPORT_ONRESIZE, once, LEVEL_LOADED, off } from '../system/event.js';
10
+ import pool from '../system/pooling.js';
11
+ import game from '../game.js';
12
+ import Sprite from './sprite.js';
13
+ import { isNumeric } from '../utils/string.js';
14
+
15
+ /**
16
+ * @classdesc
17
+ * a generic Image Layer Object
18
+ * @augments Renderable
19
+ */
20
+ class ImageLayer extends Sprite {
21
+ /**
22
+ * @param {number} x - x coordinate
23
+ * @param {number} y - y coordinate
24
+ * @param {object} settings - ImageLayer properties
25
+ * @param {HTMLImageElement|HTMLCanvasElement|string} settings.image - Image reference. See {@link loader.getImage}
26
+ * @param {string} [settings.name="me.ImageLayer"] - layer name
27
+ * @param {number} [settings.z=0] - z-index position
28
+ * @param {number|Vector2d} [settings.ratio=1.0] - Scrolling ratio to be applied. See {@link ImageLayer#ratio}
29
+ * @param {string} [settings.repeat='repeat'] - define if and how an Image Layer should be repeated (accepted values are 'repeat', 'repeat-x', 'repeat-y', 'no-repeat'). See {@link ImageLayer#repeat}
30
+ * @param {number|Vector2d} [settings.anchorPoint=0.0] - Image origin. See {@link ImageLayer#anchorPoint}
31
+ * @example
32
+ * // create a repetitive background pattern on the X axis using the citycloud image asset
33
+ * me.game.world.addChild(new me.ImageLayer(0, 0, {
34
+ * image:"citycloud",
35
+ * repeat :"repeat-x"
36
+ * }), 1);
37
+ */
38
+ constructor(x, y, settings) {
39
+ // call the constructor
40
+ super(x, y, settings);
41
+
42
+ // render in screen coordinates
43
+ this.floating = true;
44
+
45
+ // image drawing offset
46
+ this.offset.set(x, y);
47
+
48
+ /**
49
+ * Define the image scrolling ratio<br>
50
+ * Scrolling speed is defined by multiplying the viewport delta position by the specified ratio.
51
+ * Setting this vector to &lt;0.0,0.0&gt; will disable automatic scrolling.<br>
52
+ * To specify a value through Tiled, use one of the following format : <br>
53
+ * - a number, to change the value for both axis <br>
54
+ * - a json expression like `json:{"x":0.5,"y":0.5}` if you wish to specify a different value for both x and y
55
+ * @public
56
+ * @type {Vector2d}
57
+ * @default <1.0,1.0>
58
+ * @name ImageLayer#ratio
59
+ */
60
+ this.ratio = pool.pull("Vector2d", 1.0, 1.0);
61
+
62
+ if (typeof(settings.ratio) !== "undefined") {
63
+ // little hack for backward compatiblity
64
+ if (isNumeric(settings.ratio)) {
65
+ this.ratio.set(settings.ratio, +settings.ratio);
66
+ } else /* vector */ {
67
+ this.ratio.setV(settings.ratio);
68
+ }
69
+ }
70
+
71
+ if (typeof(settings.anchorPoint) === "undefined") {
72
+ /**
73
+ * Define how the image is anchored to the viewport bounds<br>
74
+ * By default, its upper-left corner is anchored to the viewport bounds upper left corner.<br>
75
+ * The anchorPoint is a unit vector where each component falls in range [0.0,1.0].<br>
76
+ * Some common examples:<br>
77
+ * - &lt;0.0,0.0&gt; : (Default) Anchor image to the upper-left corner of viewport bounds
78
+ * - &lt;0.5,0.5&gt; : Center the image within viewport bounds
79
+ * - &lt;1.0,1.0&gt; : Anchor image to the lower-right corner of viewport bounds
80
+ * To specify a value through Tiled, use one of the following format : <br>
81
+ * - a number, to change the value for both axis <br>
82
+ * - a json expression like `json:{"x":0.5,"y":0.5}` if you wish to specify a different value for both x and y
83
+ * @public
84
+ * @member {Vector2d}
85
+ * @default <0.0,0.0>
86
+ * @name ImageLayer#anchorPoint
87
+ */
88
+ this.anchorPoint.set(0, 0);
89
+ }
90
+ else {
91
+ if (typeof(settings.anchorPoint) === "number") {
92
+ this.anchorPoint.set(settings.anchorPoint, settings.anchorPoint);
93
+ }
94
+ else /* vector */ {
95
+ this.anchorPoint.setV(settings.anchorPoint);
96
+ }
97
+ }
98
+
99
+ this.repeat = settings.repeat || "repeat";
100
+
101
+ // on context lost, all previous textures are destroyed
102
+ on(ONCONTEXT_RESTORED, this.createPattern, this);
103
+ }
104
+
105
+ /**
106
+ * Define if and how an Image Layer should be repeated.<br>
107
+ * By default, an Image Layer is repeated both vertically and horizontally.<br>
108
+ * Acceptable values : <br>
109
+ * - 'repeat' - The background image will be repeated both vertically and horizontally <br>
110
+ * - 'repeat-x' - The background image will be repeated only horizontally.<br>
111
+ * - 'repeat-y' - The background image will be repeated only vertically.<br>
112
+ * - 'no-repeat' - The background-image will not be repeated.<br>
113
+ * @public
114
+ * @type {string}
115
+ * @default 'repeat'
116
+ * @name ImageLayer#repeat
117
+ */
118
+
119
+ get repeat() {
120
+ return this._repeat;
121
+ }
122
+
123
+ set repeat(value) {
124
+ this._repeat = value;
125
+ switch (this._repeat) {
126
+ case "no-repeat" :
127
+ this.repeatX = false;
128
+ this.repeatY = false;
129
+ break;
130
+ case "repeat-x" :
131
+ this.repeatX = true;
132
+ this.repeatY = false;
133
+ break;
134
+ case "repeat-y" :
135
+ this.repeatX = false;
136
+ this.repeatY = true;
137
+ break;
138
+ default : // "repeat"
139
+ this.repeatX = true;
140
+ this.repeatY = true;
141
+ break;
142
+ }
143
+ this.resize(game.viewport.width, game.viewport.height);
144
+ this.createPattern();
145
+ }
146
+
147
+
148
+ // called when the layer is added to the game world or a container
149
+ onActivateEvent() {
150
+ // register to the viewport change notification
151
+ on(VIEWPORT_ONCHANGE, this.updateLayer, this);
152
+ on(VIEWPORT_ONRESIZE, this.resize, this);
153
+ // force a first refresh when the level is loaded
154
+ once(LEVEL_LOADED, () => {
155
+ this.updateLayer(game.viewport.pos);
156
+ });
157
+ // in case the level is not added to the root container,
158
+ // the onActivateEvent call happens after the LEVEL_LOADED event
159
+ // so we need to force a first update
160
+ if (this.ancestor.root !== true) {
161
+ this.updateLayer(game.viewport.pos);
162
+ }
163
+ }
164
+
165
+ /**
166
+ * resize the Image Layer to match the given size
167
+ * @name resize
168
+ * @memberof ImageLayer
169
+ * @param {number} w - new width
170
+ * @param {number} h - new height
171
+ */
172
+ resize(w, h) {
173
+ return super.resize(
174
+ this.repeatX ? Infinity : w,
175
+ this.repeatY ? Infinity : h
176
+ );
177
+ }
178
+
179
+ /**
180
+ * createPattern function
181
+ * @ignore
182
+ */
183
+ createPattern() {
184
+ this._pattern = renderer.createPattern(this.image, this._repeat);
185
+ }
186
+
187
+ /**
188
+ * updateLayer function
189
+ * @ignore
190
+ */
191
+ updateLayer(vpos) {
192
+ var rx = this.ratio.x,
193
+ ry = this.ratio.y;
194
+
195
+ if (rx === 0 && ry === 0) {
196
+ // static image
197
+ return;
198
+ }
199
+
200
+ var width = this.width,
201
+ height = this.height,
202
+ bw = game.viewport.bounds.width,
203
+ bh = game.viewport.bounds.height,
204
+ ax = this.anchorPoint.x,
205
+ ay = this.anchorPoint.y,
206
+
207
+ /*
208
+ * Automatic positioning
209
+ *
210
+ * See https://github.com/melonjs/melonJS/issues/741#issuecomment-138431532
211
+ * for a thorough description of how this works.
212
+ */
213
+ x = ax * (rx - 1) * (bw - game.viewport.width) + this.offset.x - rx * vpos.x,
214
+ y = ay * (ry - 1) * (bh - game.viewport.height) + this.offset.y - ry * vpos.y;
215
+
216
+
217
+ // Repeat horizontally; start drawing from left boundary
218
+ if (this.repeatX) {
219
+ this.pos.x = x % width;
220
+ }
221
+ else {
222
+ this.pos.x = x;
223
+ }
224
+
225
+ // Repeat vertically; start drawing from top boundary
226
+ if (this.repeatY) {
227
+ this.pos.y = y % height;
228
+ }
229
+ else {
230
+ this.pos.y = y;
231
+ }
232
+
233
+ this.isDirty = true;
234
+ }
235
+
236
+ /**
237
+ * override the default predraw function
238
+ * as repeat and anchor are managed directly in the draw method
239
+ * @ignore
240
+ */
241
+ preDraw(renderer) {
242
+ // save the context
243
+ renderer.save();
244
+ // apply the defined alpha value
245
+ renderer.setGlobalAlpha(renderer.globalAlpha() * this.getOpacity());
246
+
247
+ // apply the defined tint, if any
248
+ renderer.setTint(this.tint);
249
+ }
250
+
251
+ /**
252
+ * draw this ImageLayer (automatically called by melonJS)
253
+ * @name draw
254
+ * @memberof ImageLayer
255
+ * @protected
256
+ * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance
257
+ * @param {Camera2d} [viewport] - the viewport to (re)draw
258
+ */
259
+ draw(renderer, viewport) {
260
+ var width = this.width,
261
+ height = this.height,
262
+ bw = viewport.bounds.width,
263
+ bh = viewport.bounds.height,
264
+ ax = this.anchorPoint.x,
265
+ ay = this.anchorPoint.y,
266
+ x = this.pos.x,
267
+ y = this.pos.y;
268
+
269
+ if (this.ratio.x === 0 && this.ratio.y === 0) {
270
+ // static image
271
+ x = x + ax * (bw - width);
272
+ y = y + ay * (bh - height);
273
+ }
274
+
275
+ renderer.translate(x, y);
276
+ renderer.drawPattern(
277
+ this._pattern,
278
+ 0,
279
+ 0,
280
+ viewport.width * 2,
281
+ viewport.height * 2
282
+ );
283
+ }
284
+
285
+ // called when the layer is removed from the game world or a container
286
+ onDeactivateEvent() {
287
+ // cancel all event subscriptions
288
+ off(VIEWPORT_ONCHANGE, this.updateLayer);
289
+ off(VIEWPORT_ONRESIZE, this.resize);
290
+ }
291
+
292
+ /**
293
+ * Destroy function<br>
294
+ * @ignore
295
+ */
296
+ destroy() {
297
+ pool.push(this.ratio);
298
+ this.ratio = undefined;
299
+ off(ONCONTEXT_RESTORED, this.createPattern);
300
+ super.destroy();
301
+ }
302
+
303
+ }
304
+ var ImageLayer$1 = ImageLayer;
305
+
306
+ export { ImageLayer$1 as default };
@@ -0,0 +1,156 @@
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 Renderable from './renderable.js';
10
+
11
+ /** @ignore */
12
+ function createGradient(light) {
13
+ var context = light.texture.context;
14
+
15
+ var x1 = light.texture.width / 2,
16
+ y1 = light.texture.height / 2;
17
+
18
+ var radiusX = light.radiusX,
19
+ radiusY = light.radiusY;
20
+
21
+ var scaleX, scaleY, invScaleX, invScaleY;
22
+ var gradient;
23
+
24
+
25
+ light.texture.clear();
26
+
27
+ if (radiusX >= radiusY) {
28
+ scaleX = 1;
29
+ invScaleX = 1;
30
+ scaleY = radiusY/radiusX;
31
+ invScaleY = radiusX/radiusY;
32
+ gradient = context.createRadialGradient(x1, y1 * invScaleY, 0, x1, radiusY * invScaleY, radiusX);
33
+ }
34
+ else {
35
+ scaleY = 1;
36
+ invScaleY = 1;
37
+ scaleX = radiusX/radiusY;
38
+ invScaleX = radiusY/radiusX;
39
+ gradient = context.createRadialGradient(x1 * invScaleX, y1, 0, x1 * invScaleX, y1, radiusY);
40
+ }
41
+
42
+ gradient.addColorStop( 0, light.color.toRGBA(light.intensity));
43
+ gradient.addColorStop( 1, light.color.toRGBA(0.0));
44
+
45
+ context.fillStyle = gradient;
46
+
47
+ context.setTransform(scaleX, 0, 0, scaleY, 0, 0);
48
+ context.fillRect(0, 0, light.texture.width * invScaleX, light.texture.height * invScaleY);
49
+ }
50
+
51
+ /**
52
+ * @classdesc
53
+ * A 2D point light.
54
+ * Note: this is a very experimental and work in progress feature, that provides a simple spot light effect.
55
+ * The light effect is best rendered in WebGL, as they are few limitations when using the Canvas Renderer
56
+ * (multiple lights are not supported, alpha component of the ambient light is ignored)
57
+ * @see stage.lights
58
+ */
59
+ class Light2d extends Renderable {
60
+ /**
61
+ * @param {number} x - The horizontal position of the light.
62
+ * @param {number} y - The vertical position of the light.
63
+ * @param {number} radiusX - The horizontal radius of the light.
64
+ * @param {number} [radiusY=radiusX] - The vertical radius of the light.
65
+ * @param {Color|string} [color="#FFF"] - the color of the light
66
+ * @param {number} [intensity=0.7] - The intensity of the light.
67
+ */
68
+ constructor(x, y, radiusX, radiusY = radiusX, color = "#FFF", intensity = 0.7) {
69
+ // call the parent constructor
70
+ super(x, y, radiusX * 2, radiusY * 2);
71
+
72
+ /**
73
+ * the color of the light
74
+ * @type {Color}
75
+ * @default "#FFF"
76
+ */
77
+ this.color = pool.pull("Color").parseCSS(color);
78
+
79
+ /**
80
+ * The horizontal radius of the light
81
+ * @type {number}
82
+ */
83
+ this.radiusX = radiusX;
84
+
85
+ /**
86
+ * The vertical radius of the light
87
+ * @type {number}
88
+ */
89
+ this.radiusY = radiusY;
90
+
91
+ /**
92
+ * The intensity of the light
93
+ * @type {number}
94
+ * @default 0.7
95
+ */
96
+ this.intensity = intensity;
97
+
98
+ /**
99
+ * the default blend mode to be applied when rendering this light
100
+ * @type {string}
101
+ * @default "lighter"
102
+ * @see CanvasRenderer#setBlendMode
103
+ * @see WebGLRenderer#setBlendMode
104
+ */
105
+ this.blendMode = "lighter";
106
+
107
+ /** @ignore */
108
+ this.visibleArea = pool.pull("Ellipse", this.centerX, this.centerY, this.width, this.height);
109
+
110
+ /** @ignore */
111
+ this.texture = pool.pull("CanvasTexture", this.width, this.height, { offscreenCanvas: false });
112
+
113
+ this.anchorPoint.set(0, 0);
114
+
115
+ createGradient(this);
116
+ }
117
+
118
+ /**
119
+ * returns a geometry representing the visible area of this light
120
+ * @name getVisibleArea
121
+ * @memberof Light2d
122
+ * @returns {Ellipse} the light visible mask
123
+ */
124
+ getVisibleArea() {
125
+ return this.visibleArea.setShape(this.getBounds().centerX, this.getBounds().centerY, this.width, this.height);
126
+ }
127
+
128
+ /**
129
+ * draw this Light2d (automatically called by melonJS)
130
+ * @name draw
131
+ * @memberof Light2d
132
+ * @protected
133
+ * @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance
134
+ * @param {Camera2d} [viewport] - the viewport to (re)draw
135
+ */
136
+ draw(renderer, viewport) { // eslint-disable-line no-unused-vars
137
+ renderer.drawImage(this.texture.canvas, this.getBounds().x, this.getBounds().y);
138
+ }
139
+
140
+ /**
141
+ * Destroy function<br>
142
+ * @ignore
143
+ */
144
+ destroy() {
145
+ pool.push(this.color);
146
+ this.color = undefined;
147
+ pool.push(this.texture);
148
+ this.texture = undefined;
149
+ pool.push(this.visibleArea);
150
+ this.visibleArea = undefined;
151
+ super.destroy();
152
+ }
153
+ }
154
+ var Light2d$1 = Light2d;
155
+
156
+ export { Light2d$1 as default };