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.
Files changed (219) 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 +238 -0
  11. package/dist/melonjs.mjs/audio/audio.js +536 -0
  12. package/dist/melonjs.mjs/camera/camera2d.js +731 -0
  13. package/dist/melonjs.mjs/entity/entity.js +247 -0
  14. package/dist/melonjs.mjs/game.js +29 -0
  15. package/dist/melonjs.mjs/geometries/ellipse.js +274 -0
  16. package/dist/melonjs.mjs/geometries/line.js +115 -0
  17. package/dist/melonjs.mjs/geometries/path2d.js +318 -0
  18. package/dist/melonjs.mjs/geometries/point.js +88 -0
  19. package/dist/melonjs.mjs/geometries/poly.js +498 -0
  20. package/dist/melonjs.mjs/geometries/rectangle.js +374 -0
  21. package/dist/melonjs.mjs/geometries/roundrect.js +167 -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 +446 -0
  32. package/dist/melonjs.mjs/level/tiled/TMXObject.js +355 -0
  33. package/dist/melonjs.mjs/level/tiled/TMXTile.js +193 -0
  34. package/dist/melonjs.mjs/level/tiled/TMXTileMap.js +636 -0
  35. package/dist/melonjs.mjs/level/tiled/TMXTileset.js +309 -0
  36. package/dist/melonjs.mjs/level/tiled/TMXTilesetGroup.js +81 -0
  37. package/dist/melonjs.mjs/level/tiled/TMXUtils.js +367 -0
  38. package/dist/melonjs.mjs/level/tiled/renderer/TMXHexagonalRenderer.js +504 -0
  39. package/dist/melonjs.mjs/level/tiled/renderer/TMXIsometricRenderer.js +218 -0
  40. package/dist/melonjs.mjs/level/tiled/renderer/TMXOrthogonalRenderer.js +155 -0
  41. package/dist/melonjs.mjs/level/tiled/renderer/TMXRenderer.js +124 -0
  42. package/dist/melonjs.mjs/level/tiled/renderer/TMXStaggeredRenderer.js +107 -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 +616 -0
  47. package/dist/melonjs.mjs/math/math.js +218 -0
  48. package/dist/melonjs.mjs/math/matrix2.js +501 -0
  49. package/dist/melonjs.mjs/math/matrix3.js +679 -0
  50. package/dist/melonjs.mjs/math/observable_vector2.js +469 -0
  51. package/dist/melonjs.mjs/math/observable_vector3.js +559 -0
  52. package/dist/melonjs.mjs/math/vector2.js +526 -0
  53. package/dist/melonjs.mjs/math/vector3.js +567 -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 +265 -0
  62. package/dist/melonjs.mjs/particles/particle.js +186 -0
  63. package/dist/melonjs.mjs/particles/settings.js +319 -0
  64. package/dist/melonjs.mjs/physics/body.js +702 -0
  65. package/dist/melonjs.mjs/physics/bounds.js +459 -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 +394 -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 +219 -0
  72. package/dist/melonjs.mjs/plugin/plugin.js +141 -0
  73. package/dist/melonjs.mjs/renderable/collectable.js +60 -0
  74. package/dist/melonjs.mjs/renderable/colorlayer.js +78 -0
  75. package/dist/melonjs.mjs/renderable/container.js +1016 -0
  76. package/dist/melonjs.mjs/renderable/dragndrop.js +224 -0
  77. package/dist/melonjs.mjs/renderable/imagelayer.js +305 -0
  78. package/dist/melonjs.mjs/renderable/light2d.js +155 -0
  79. package/dist/melonjs.mjs/renderable/nineslicesprite.js +246 -0
  80. package/dist/melonjs.mjs/renderable/renderable.js +781 -0
  81. package/dist/melonjs.mjs/renderable/sprite.js +653 -0
  82. package/dist/melonjs.mjs/renderable/trigger.js +156 -0
  83. package/dist/melonjs.mjs/renderable/ui/uibaseelement.js +212 -0
  84. package/dist/melonjs.mjs/renderable/ui/uispriteelement.js +225 -0
  85. package/dist/melonjs.mjs/renderable/ui/uitextbutton.js +127 -0
  86. package/dist/melonjs.mjs/state/stage.js +236 -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 +363 -0
  96. package/dist/melonjs.mjs/text/bitmaptextdata.js +198 -0
  97. package/dist/melonjs.mjs/text/glyph.js +65 -0
  98. package/dist/melonjs.mjs/text/text.js +452 -0
  99. package/dist/melonjs.mjs/text/textmetrics.js +175 -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 +479 -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 +806 -0
  111. package/dist/melonjs.mjs/video/renderer.js +410 -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 +142 -0
  117. package/dist/melonjs.mjs/video/webgl/glshader.js +167 -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 +494 -0
  128. package/dist/melonjs.mjs/video/webgl/webgl_renderer.js +1035 -0
  129. package/dist/melonjs.module.d.ts +1298 -1359
  130. package/dist/melonjs.module.js +2072 -3520
  131. package/package.json +21 -16
  132. package/src/application/application.js +4 -5
  133. package/src/audio/audio.js +32 -32
  134. package/src/camera/camera2d.js +32 -33
  135. package/src/entity/entity.js +18 -19
  136. package/src/geometries/ellipse.js +17 -18
  137. package/src/geometries/line.js +6 -7
  138. package/src/geometries/path2d.js +33 -34
  139. package/src/geometries/point.js +1 -2
  140. package/src/geometries/poly.js +16 -18
  141. package/src/geometries/rectangle.js +19 -20
  142. package/src/geometries/roundrect.js +9 -10
  143. package/src/input/gamepad.js +15 -15
  144. package/src/input/keyboard.js +12 -12
  145. package/src/input/pointer.js +6 -6
  146. package/src/input/pointerevent.js +12 -12
  147. package/src/lang/deprecated.js +12 -12
  148. package/src/level/level.js +25 -25
  149. package/src/level/tiled/TMXLayer.js +23 -24
  150. package/src/level/tiled/TMXTile.js +6 -7
  151. package/src/level/tiled/TMXTileMap.js +8 -10
  152. package/src/level/tiled/TMXTileset.js +3 -4
  153. package/src/level/tiled/TMXTilesetGroup.js +1 -2
  154. package/src/level/tiled/TMXUtils.js +5 -5
  155. package/src/level/tiled/renderer/TMXHexagonalRenderer.js +3 -4
  156. package/src/level/tiled/renderer/TMXIsometricRenderer.js +3 -4
  157. package/src/level/tiled/renderer/TMXOrthogonalRenderer.js +2 -3
  158. package/src/level/tiled/renderer/TMXRenderer.js +20 -21
  159. package/src/level/tiled/renderer/TMXStaggeredRenderer.js +1 -2
  160. package/src/loader/loader.js +20 -20
  161. package/src/math/color.js +21 -22
  162. package/src/math/math.js +16 -16
  163. package/src/math/matrix2.js +17 -18
  164. package/src/math/matrix3.js +26 -27
  165. package/src/math/observable_vector2.js +15 -16
  166. package/src/math/observable_vector3.js +17 -18
  167. package/src/math/vector2.js +10 -11
  168. package/src/math/vector3.js +11 -12
  169. package/src/particles/emitter.js +7 -8
  170. package/src/particles/particle.js +3 -4
  171. package/src/physics/body.js +29 -30
  172. package/src/physics/bounds.js +10 -10
  173. package/src/physics/collision.js +2 -2
  174. package/src/physics/detector.js +6 -6
  175. package/src/physics/quadtree.js +18 -23
  176. package/src/physics/sat.js +31 -31
  177. package/src/physics/world.js +6 -7
  178. package/src/plugin/plugin.js +5 -5
  179. package/src/renderable/collectable.js +4 -6
  180. package/src/renderable/colorlayer.js +6 -8
  181. package/src/renderable/container.js +25 -27
  182. package/src/renderable/dragndrop.js +14 -14
  183. package/src/renderable/imagelayer.js +14 -15
  184. package/src/renderable/light2d.js +4 -5
  185. package/src/renderable/nineslicesprite.js +17 -18
  186. package/src/renderable/renderable.js +26 -28
  187. package/src/renderable/sprite.js +29 -30
  188. package/src/renderable/trigger.js +16 -17
  189. package/src/renderable/ui/uibaseelement.js +8 -9
  190. package/src/renderable/ui/uispriteelement.js +8 -8
  191. package/src/renderable/ui/uitextbutton.js +15 -15
  192. package/src/state/stage.js +8 -9
  193. package/src/state/state.js +17 -17
  194. package/src/system/device.js +11 -11
  195. package/src/system/event.js +10 -10
  196. package/src/system/pooling.js +9 -9
  197. package/src/system/save.js +2 -2
  198. package/src/system/timer.js +10 -10
  199. package/src/text/bitmaptext.js +19 -20
  200. package/src/text/bitmaptextdata.js +3 -4
  201. package/src/text/glyph.js +1 -2
  202. package/src/text/text.js +24 -25
  203. package/src/text/textmetrics.js +9 -10
  204. package/src/tweens/tween.js +20 -21
  205. package/src/utils/agent.js +5 -5
  206. package/src/utils/array.js +4 -4
  207. package/src/utils/file.js +2 -2
  208. package/src/utils/function.js +6 -6
  209. package/src/utils/string.js +5 -5
  210. package/src/utils/utils.js +4 -4
  211. package/src/video/canvas/canvas_renderer.js +72 -73
  212. package/src/video/renderer.js +27 -28
  213. package/src/video/texture/atlas.js +22 -22
  214. package/src/video/texture/canvas_texture.js +9 -9
  215. package/src/video/video.js +17 -17
  216. package/src/video/webgl/buffer/vertex.js +1 -2
  217. package/src/video/webgl/glshader.js +12 -12
  218. package/src/video/webgl/webgl_compositor.js +42 -43
  219. package/src/video/webgl/webgl_renderer.js +76 -77
@@ -0,0 +1,636 @@
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 { off, on, VIEWPORT_ONRESIZE } from '../../system/event.js';
10
+ import game from '../../game.js';
11
+ import collision from '../../physics/collision.js';
12
+ import Body from '../../physics/body.js';
13
+ import TMXOrthogonalRenderer from './renderer/TMXOrthogonalRenderer.js';
14
+ import TMXIsometricRenderer from './renderer/TMXIsometricRenderer.js';
15
+ import TMXHexagonalRenderer from './renderer/TMXHexagonalRenderer.js';
16
+ import TMXStaggeredRenderer from './renderer/TMXStaggeredRenderer.js';
17
+ import TMXTileset from './TMXTileset.js';
18
+ import TMXTilesetGroup from './TMXTilesetGroup.js';
19
+ import TMXGroup from './TMXGroup.js';
20
+ import TMXLayer from './TMXLayer.js';
21
+ import { applyTMXProperties } from './TMXUtils.js';
22
+ import Container from '../../renderable/container.js';
23
+
24
+ // constant to identify the collision object layer
25
+ const COLLISION_GROUP = "collision";
26
+
27
+ /**
28
+ * set a compatible renderer object
29
+ * for the specified map
30
+ * @ignore
31
+ */
32
+ function getNewDefaultRenderer(map) {
33
+ switch (map.orientation) {
34
+ case "orthogonal":
35
+ return new TMXOrthogonalRenderer(map);
36
+
37
+ case "isometric":
38
+ return new TMXIsometricRenderer(map);
39
+
40
+ case "hexagonal":
41
+ return new TMXHexagonalRenderer(map);
42
+
43
+ case "staggered":
44
+ return new TMXStaggeredRenderer(map);
45
+
46
+ // if none found, throw an exception
47
+ default:
48
+ throw new Error(map.orientation + " type TMX Tile Map not supported!");
49
+ }
50
+ }
51
+
52
+ /**
53
+ * read the layer Data
54
+ * @ignore
55
+ */
56
+ function readLayer(map, data, z) {
57
+ return new TMXLayer(map, data, map.tilewidth, map.tileheight, map.orientation, map.tilesets, z);
58
+ }
59
+
60
+ /**
61
+ * read the Image Layer Data
62
+ * @ignore
63
+ */
64
+ function readImageLayer(map, data, z) {
65
+ // Normalize properties
66
+ applyTMXProperties(data.properties, data);
67
+
68
+ // create the layer
69
+ var imageLayer = pool.pull("ImageLayer",
70
+ // x/y is deprecated since 0.15 and replace by offsetx/y
71
+ +data.offsetx || +data.x || 0,
72
+ +data.offsety || +data.y || 0,
73
+ Object.assign({
74
+ name: data.name,
75
+ image: data.image,
76
+ ratio : pool.pull("Vector2d", +data.parallaxx || 1.0, +data.parallaxy || 1.0),
77
+ // convert to melonJS color format (note: this should be done earlier when parsing data)
78
+ tint : typeof (data.tintcolor) !== "undefined" ? (pool.pull("Color")).parseHex(data.tintcolor, true) : undefined,
79
+ z: z
80
+ }, data.properties)
81
+ );
82
+
83
+
84
+ // set some additional flags
85
+ var visible = typeof(data.visible) !== "undefined" ? data.visible : true;
86
+ imageLayer.setOpacity(visible ? +data.opacity : 0);
87
+
88
+ return imageLayer;
89
+ }
90
+
91
+ /**
92
+ * read the tileset Data
93
+ * @ignore
94
+ */
95
+ function readTileset(data) {
96
+ return (new TMXTileset(data));
97
+ }
98
+
99
+ /**
100
+ * read the object group Data
101
+ * @ignore
102
+ */
103
+ function readObjectGroup(map, data, z) {
104
+ return (new TMXGroup(map, data, z));
105
+ }
106
+
107
+ /**
108
+ * @classdesc
109
+ * a TMX Tile Map Object
110
+ * Tiled QT +0.7.x format
111
+ */
112
+ class TMXTileMap {
113
+ /**
114
+ * @param {string} levelId - name of TMX map
115
+ * @param {object} data - TMX map in JSON format
116
+ * @example
117
+ * // create a new level object based on the TMX JSON object
118
+ * var level = new me.TMXTileMap(levelId, me.loader.getTMX(levelId));
119
+ * // add the level to the game world container
120
+ * level.addTo(me.game.world, true);
121
+ */
122
+ constructor(levelId, data) {
123
+
124
+ /**
125
+ * the level data (JSON)
126
+ * @ignore
127
+ */
128
+ this.data = data;
129
+
130
+ /**
131
+ * name of the tilemap
132
+ * @public
133
+ * @type {string}
134
+ * @name TMXTileMap#name
135
+ */
136
+ this.name = levelId;
137
+
138
+ /**
139
+ * width of the tilemap in tiles
140
+ * @public
141
+ * @type {number}
142
+ * @name TMXTileMap#cols
143
+ */
144
+ this.cols = +data.width;
145
+ /**
146
+ * height of the tilemap in tiles
147
+ * @public
148
+ * @type {number}
149
+ * @name TMXTileMap#rows
150
+ */
151
+ this.rows = +data.height;
152
+
153
+ /**
154
+ * Tile width
155
+ * @public
156
+ * @type {number}
157
+ * @name TMXTileMap#tilewidth
158
+ */
159
+ this.tilewidth = +data.tilewidth;
160
+
161
+ /**
162
+ * Tile height
163
+ * @public
164
+ * @type {number}
165
+ * @name TMXTileMap#tileheight
166
+ */
167
+ this.tileheight = +data.tileheight;
168
+
169
+ /**
170
+ * is the map an infinite map
171
+ * @public
172
+ * @type {number}
173
+ * @default 0
174
+ * @name TMXTileMap#infinite
175
+ */
176
+ this.infinite = +data.infinite;
177
+
178
+ /**
179
+ * the map orientation type. melonJS supports “orthogonal”, “isometric”, “staggered” and “hexagonal”.
180
+ * @public
181
+ * @type {string}
182
+ * @default "orthogonal"
183
+ * @name TMXTileMap#orientation
184
+ */
185
+ this.orientation = data.orientation;
186
+
187
+ /**
188
+ * the order in which tiles on orthogonal tile layers are rendered.
189
+ * (valid values are "left-down", "left-up", "right-down", "right-up")
190
+ * @public
191
+ * @type {string}
192
+ * @default "right-down"
193
+ * @name TMXTileMap#renderorder
194
+ */
195
+ this.renderorder = data.renderorder || "right-down";
196
+
197
+ /**
198
+ * the TMX format version
199
+ * @public
200
+ * @type {string}
201
+ * @name TMXTileMap#version
202
+ */
203
+ this.version = data.version;
204
+
205
+ /**
206
+ * The Tiled version used to save the file (since Tiled 1.0.1).
207
+ * @public
208
+ * @type {string}
209
+ * @name TMXTileMap#tiledversion
210
+ */
211
+ this.tiledversion = data.tiledversion;
212
+
213
+
214
+ /**
215
+ * The map class.
216
+ * @public
217
+ * @type {string}
218
+ * @name TMXTileMap#class
219
+ */
220
+ this.class = data.class;
221
+
222
+
223
+ // tilesets for this map
224
+ this.tilesets = null;
225
+
226
+ // layers
227
+ if (typeof this.layers === "undefined") {
228
+ this.layers = [];
229
+ }
230
+ // group objects
231
+ if (typeof this.objectGroups === "undefined") {
232
+ this.objectGroups = [];
233
+ }
234
+
235
+ // Check if map is from melon editor
236
+ this.isEditor = data.editor === "melon-editor";
237
+
238
+
239
+ // object id
240
+ this.nextobjectid = +data.nextobjectid || undefined;
241
+
242
+ // hex/iso properties
243
+ this.hexsidelength = +data.hexsidelength;
244
+ this.staggeraxis = data.staggeraxis;
245
+ this.staggerindex = data.staggerindex;
246
+
247
+ // calculate the map bounding rect
248
+ this.bounds = this.getRenderer().getBounds().clone();
249
+
250
+ // map "real" size
251
+ this.width = this.bounds.width;
252
+ this.height = this.bounds.height;
253
+
254
+ // background color
255
+ this.backgroundcolor = data.backgroundcolor;
256
+
257
+ // set additional map properties (if any)
258
+ applyTMXProperties(this, data);
259
+
260
+ // internal flag
261
+ this.initialized = false;
262
+
263
+ if (this.infinite === 1) {
264
+ // #956 Support for Infinite map
265
+ // see as well in me.TMXUtils
266
+ throw new Error("Tiled Infinite Map not supported!");
267
+ }
268
+ }
269
+
270
+ /**
271
+ * Return the map default renderer
272
+ * @name getRenderer
273
+ * @memberof TMXTileMap
274
+ * @public
275
+ * @returns {TMXRenderer} a TMX renderer
276
+ */
277
+ getRenderer() {
278
+ if ((typeof(this.renderer) === "undefined") || (!this.renderer.canRender(this))) {
279
+ this.renderer = getNewDefaultRenderer(this);
280
+ }
281
+ return this.renderer;
282
+ }
283
+
284
+ /**
285
+ * return the map bounding rect
286
+ * @name TMXRenderer#getBounds
287
+ * @public
288
+ * @returns {Bounds}
289
+ */
290
+ getBounds() {
291
+ // calculated in the constructor
292
+ return this.bounds;
293
+ }
294
+
295
+ /**
296
+ * parse the map
297
+ * @ignore
298
+ */
299
+ readMapObjects(data) {
300
+
301
+ if (this.initialized === true) {
302
+ return;
303
+ }
304
+
305
+ // to automatically increment z index
306
+ var zOrder = 0;
307
+
308
+ // Tileset information
309
+ if (!this.tilesets) {
310
+ // make sure we have a TilesetGroup Object
311
+ this.tilesets = new TMXTilesetGroup();
312
+ }
313
+
314
+ // parse all tileset objects
315
+ if (typeof (data.tilesets) !== "undefined") {
316
+ var tilesets = data.tilesets;
317
+ tilesets.forEach((tileset) => {
318
+ // add the new tileset
319
+ this.tilesets.add(readTileset(tileset));
320
+ });
321
+ }
322
+
323
+ // check if a background image is defined
324
+ if (this.background_image) {
325
+ // add a new image layer
326
+ this.layers.push(
327
+ pool.pull("ImageLayer",
328
+ 0, 0, {
329
+ name : "background_image",
330
+ image : this.background_image,
331
+ z : zOrder++
332
+ }
333
+ ));
334
+ }
335
+
336
+ data.layers.forEach((layer) => {
337
+ switch (layer.type) {
338
+ case "imagelayer":
339
+ this.layers.push(readImageLayer(this, layer, zOrder++));
340
+ break;
341
+
342
+ case "tilelayer":
343
+ this.layers.push(readLayer(this, layer, zOrder++));
344
+ break;
345
+
346
+ // get the object groups information
347
+ case "objectgroup":
348
+ this.objectGroups.push(readObjectGroup(this, layer, zOrder++));
349
+ break;
350
+
351
+ // get the object groups information
352
+ case "group":
353
+ this.objectGroups.push(readObjectGroup(this, layer, zOrder++));
354
+ break;
355
+ }
356
+ });
357
+
358
+ this.initialized = true;
359
+ }
360
+
361
+
362
+ /**
363
+ * add all the map layers and objects to the given container.
364
+ * note : this will not automatically update the camera viewport
365
+ * @name TMXTileMap#addTo
366
+ * @public
367
+ * @param {Container} container - target container
368
+ * @param {boolean} [flatten=true] - if true, flatten all objects into the given container, else a `me.Container` object will be created for each corresponding groups
369
+ * @param {boolean} [setViewportBounds=false] - if true, set the viewport bounds to the map size, this should be set to true especially if adding a level to the game world container.
370
+ * @example
371
+ * // create a new level object based on the TMX JSON object
372
+ * var level = new me.TMXTileMap(levelId, me.loader.getTMX(levelId));
373
+ * // add the level to the game world container
374
+ * level.addTo(me.game.world, true, true);
375
+ */
376
+ addTo(container, flatten, setViewportBounds) {
377
+ var _sort = container.autoSort;
378
+ var _depth = container.autoDepth;
379
+
380
+ var levelBounds = this.getBounds();
381
+
382
+ // disable auto-sort and auto-depth
383
+ container.autoSort = false;
384
+ container.autoDepth = false;
385
+
386
+ if (this.backgroundcolor) {
387
+ container.backgroundColor.parseCSS(this.backgroundcolor);
388
+ }
389
+
390
+ // add all layers instances
391
+ this.getLayers().forEach((layer) => {
392
+ container.addChild(layer);
393
+ });
394
+
395
+ // add all Object instances
396
+ this.getObjects(flatten).forEach((object) => {
397
+ container.addChild(object);
398
+ });
399
+
400
+ // resize the container accordingly
401
+ container.resize(this.bounds.width, this.bounds.height);
402
+
403
+ // sort everything (recursively)
404
+ container.sort(true);
405
+
406
+ /**
407
+ * callback funtion for the viewport resize event
408
+ * @ignore
409
+ */
410
+ function _setBounds(width, height) {
411
+ // adjust the viewport bounds if level is smaller
412
+ game.viewport.setBounds(
413
+ 0, 0,
414
+ Math.max(levelBounds.width, width),
415
+ Math.max(levelBounds.height, height)
416
+ );
417
+ // center the map if smaller than the current viewport
418
+ container.pos.set(
419
+ Math.max(0, ~~((width - levelBounds.width) / 2)),
420
+ Math.max(0, ~~((height - levelBounds.height) / 2)),
421
+ // don't change the container z position if defined
422
+ container.pos.z
423
+ );
424
+ }
425
+
426
+ if (setViewportBounds === true) {
427
+ off(VIEWPORT_ONRESIZE, _setBounds);
428
+ // force viewport bounds update
429
+ _setBounds(game.viewport.width, game.viewport.height);
430
+ // Replace the resize handler
431
+ on(VIEWPORT_ONRESIZE, _setBounds, this);
432
+ }
433
+
434
+ // set back auto-sort and auto-depth
435
+ container.autoSort = _sort;
436
+ container.autoDepth = _depth;
437
+ }
438
+
439
+ /**
440
+ * return an Array of instantiated objects, based on the map object definition
441
+ * @name TMXTileMap#getObjects
442
+ * @public
443
+ * @param {boolean} [flatten=true] - if true, flatten all objects into the returned array.
444
+ * when false, a `me.Container` object will be created for each corresponding groups
445
+ * @returns {Renderable[]} Array of Objects
446
+ */
447
+ getObjects(flatten) {
448
+ var objects = [];
449
+ var isCollisionGroup = false;
450
+ var targetContainer;
451
+
452
+ // parse the map for objects
453
+ this.readMapObjects(this.data);
454
+
455
+ for (var g = 0; g < this.objectGroups.length; g++) {
456
+ var group = this.objectGroups[g];
457
+
458
+ // check if this is the collision shape group
459
+ isCollisionGroup = group.name.toLowerCase().includes(COLLISION_GROUP);
460
+
461
+ if (flatten === false) {
462
+ // create a new container
463
+ targetContainer = new Container(0, 0, this.width, this.height);
464
+
465
+ // tiled uses 0,0 by default
466
+ targetContainer.anchorPoint.set(0, 0);
467
+
468
+ // set additional properties
469
+ targetContainer.name = group.name;
470
+ targetContainer.pos.z = group.z;
471
+ targetContainer.setOpacity(group.opacity);
472
+
473
+ // disable auto-sort and auto-depth
474
+ targetContainer.autoSort = false;
475
+ targetContainer.autoDepth = false;
476
+ }
477
+
478
+ // iterate through the group and add all object into their
479
+ // corresponding target Container
480
+ for (var o = 0; o < group.objects.length; o++) {
481
+ // TMX object settings
482
+ var settings = group.objects[o];
483
+ // reference to the instantiated object
484
+ var obj;
485
+ // a reference to the default shape
486
+ var shape;
487
+
488
+ // Tiled uses 0,0 by default
489
+ if (typeof (settings.anchorPoint) === "undefined") {
490
+ settings.anchorPoint = {x : 0, y : 0};
491
+ }
492
+ // convert to melonJS renderable argument name
493
+ if (typeof (settings.tintcolor) !== "undefined") {
494
+ settings.tint = pool.pull("Color");
495
+ settings.tint.parseHex(settings.tintcolor, true);
496
+ }
497
+
498
+ /// XXX Clean/rewrite all this part to remove object
499
+ /// specific instantiation logic/details from here
500
+
501
+ // groups can contains either text, objects or layers
502
+ if (settings instanceof TMXLayer) {
503
+ // layers are already instantiated & initialized
504
+ obj = settings;
505
+ // z value set already
506
+ } else if (typeof settings.text === "object") {
507
+ // Tiled uses 0,0 by default
508
+ if (typeof (settings.text.anchorPoint) === "undefined") {
509
+ settings.text.anchorPoint = settings.anchorPoint;
510
+ }
511
+ if (settings.text.bitmap === true) {
512
+ obj = pool.pull("BitmapText", settings.x, settings.y, settings.text);
513
+ } else {
514
+ obj = pool.pull("Text", settings.x, settings.y, settings.text);
515
+ }
516
+ // set the obj z order
517
+ obj.pos.z = settings.z;
518
+ } else if (typeof settings.tile === "object") {
519
+ // create a default shape if none is specified
520
+ shape = settings.shapes;
521
+ if (typeof shape === "undefined") {
522
+ shape = pool.pull("Polygon", 0, 0, [
523
+ pool.pull("Vector2d", 0, 0),
524
+ pool.pull("Vector2d", this.width, 0),
525
+ pool.pull("Vector2d", this.width, this.height)
526
+ ]);
527
+ }
528
+ // check if a me.Tile object is embedded
529
+ obj = settings.tile.getRenderable(settings);
530
+ obj.body = new Body(obj, shape);
531
+ obj.body.setStatic(true);
532
+ // set the obj z order
533
+ obj.pos.setMuted(settings.x, settings.y, settings.z);
534
+ } else {
535
+ // pull the corresponding object from the object pool
536
+ if (typeof settings.name !== "undefined" && settings.name !== "") {
537
+ obj = pool.pull(
538
+ settings.name,
539
+ settings.x, settings.y,
540
+ settings
541
+ );
542
+ } else {
543
+ // unnamed shape object
544
+ obj = pool.pull(
545
+ "Renderable",
546
+ settings.x, settings.y,
547
+ settings.width, settings.height
548
+ );
549
+ // create a default shape if none is specified
550
+ shape = settings.shapes;
551
+ if (typeof shape === "undefined") {
552
+ shape = pool.pull("Polygon", 0, 0, [
553
+ pool.pull("Vector2d", 0, 0),
554
+ pool.pull("Vector2d", this.width, 0),
555
+ pool.pull("Vector2d", this.width, this.height)
556
+ ]);
557
+ }
558
+ obj.anchorPoint.set(0, 0);
559
+ obj.name = settings.name;
560
+ obj.type = settings.type;
561
+ // for backward compatibility
562
+ obj.class = settings.class || settings.type;
563
+ obj.id = settings.id;
564
+ obj.body = new Body(obj, shape);
565
+ obj.body.setStatic(true);
566
+ obj.resize(obj.body.getBounds().width, obj.body.getBounds().height);
567
+ }
568
+ // set the obj z order
569
+ obj.pos.z = settings.z;
570
+ }
571
+
572
+ if (isCollisionGroup && !settings.name && obj.body) {
573
+ // configure the body accordingly
574
+ obj.body.collisionType = collision.types.WORLD_SHAPE;
575
+ // mark collision shapes as static
576
+ obj.body.isStatic = true;
577
+ }
578
+
579
+ //apply group opacity value to the child objects if group are merged
580
+ if (flatten !== false) {
581
+ if (obj.isRenderable === true) {
582
+ obj.setOpacity(obj.getOpacity() * group.opacity);
583
+ // and to child renderables if any
584
+ if (typeof obj.renderable !== "undefined" && obj.renderable.isRenderable === true) {
585
+ obj.renderable.setOpacity(obj.renderable.getOpacity() * group.opacity);
586
+ }
587
+ }
588
+ // directly add the obj into the objects array
589
+ objects.push(obj);
590
+ } else /* false*/ {
591
+ // add it to the new container
592
+ targetContainer.addChild(obj);
593
+ }
594
+
595
+ }
596
+
597
+ // if we created a new container
598
+ if ((flatten === false) && (targetContainer.children.length > 0)) {
599
+
600
+ // re-enable auto-sort and auto-depth
601
+ targetContainer.autoSort = true;
602
+ targetContainer.autoDepth = true;
603
+
604
+ // add our container to the world
605
+ objects.push(targetContainer);
606
+ }
607
+ }
608
+ return objects;
609
+ }
610
+
611
+ /**
612
+ * return all the existing layers
613
+ * @name TMXTileMap#getLayers
614
+ * @public
615
+ * @returns {TMXLayer[]} Array of Layers
616
+ */
617
+ getLayers() {
618
+ // parse the map for objects
619
+ this.readMapObjects(this.data);
620
+ return this.layers;
621
+ }
622
+
623
+ /**
624
+ * destroy function, clean all allocated objects
625
+ * @name TMXTileMap#destroy
626
+ * @public
627
+ */
628
+ destroy() {
629
+ this.tilesets = undefined;
630
+ this.layers.length = 0;
631
+ this.objectGroups.length = 0;
632
+ this.initialized = false;
633
+ }
634
+ }
635
+
636
+ export { TMXTileMap as default };