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,504 @@
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 Vector2d from '../../../math/vector2.js';
9
+ import pool from '../../../system/pooling.js';
10
+ import TMXRenderer from './TMXRenderer.js';
11
+ import TMXLayer from '../TMXLayer.js';
12
+
13
+ // scope global var & constants
14
+ const offsetsStaggerX = [
15
+ {x: 0, y: 0},
16
+ {x: + 1, y: - 1},
17
+ {x: + 1, y: 0},
18
+ {x: + 2, y: 0}
19
+ ];
20
+ const offsetsStaggerY = [
21
+ {x: 0, y: 0},
22
+ {x: - 1, y: + 1},
23
+ {x: 0, y: + 1},
24
+ {x: 0, y: + 2}
25
+ ];
26
+
27
+ /**
28
+ * @classdesc
29
+ * an Hexagonal Map Renderder
30
+ * @augments TMXRenderer
31
+ */
32
+ class TMXHexagonalRenderer extends TMXRenderer {
33
+ /**
34
+ * @param {TMXTileMap} map - the TMX map
35
+ */
36
+ constructor(map) {
37
+ super(
38
+ map.cols,
39
+ map.rows,
40
+ map.tilewidth & ~1,
41
+ map.tileheight & ~1
42
+ );
43
+
44
+ this.hexsidelength = map.hexsidelength || 0;
45
+ this.staggerX = map.staggeraxis === "x";
46
+ this.staggerEven = map.staggerindex === "even";
47
+
48
+ this.sidelengthx = 0;
49
+ this.sidelengthy = 0;
50
+
51
+ if (map.orientation === "hexagonal") {
52
+ if (this.staggerX) {
53
+ this.sidelengthx = this.hexsidelength;
54
+ }
55
+ else {
56
+ this.sidelengthy = this.hexsidelength;
57
+ }
58
+ }
59
+
60
+ this.sideoffsetx = (this.tilewidth - this.sidelengthx) / 2;
61
+ this.sideoffsety = (this.tileheight - this.sidelengthy) / 2;
62
+
63
+ this.columnwidth = this.sideoffsetx + this.sidelengthx;
64
+ this.rowheight = this.sideoffsety + this.sidelengthy;
65
+
66
+ this.centers = [
67
+ new Vector2d(),
68
+ new Vector2d(),
69
+ new Vector2d(),
70
+ new Vector2d()
71
+ ];
72
+ }
73
+
74
+ /**
75
+ * return true if the renderer can render the specified layer
76
+ * @ignore
77
+ */
78
+ canRender(layer) {
79
+ return (
80
+ (layer.orientation === "hexagonal") &&
81
+ super.canRender(layer)
82
+ );
83
+ }
84
+
85
+ /**
86
+ * return the bounding rect for this map renderer
87
+ * @name TMXHexagonalRenderer#getBounds
88
+ * @public
89
+ * @param {TMXLayer} [layer] - calculate the bounding rect for a specific layer (will return a new bounds object)
90
+ * @returns {Bounds}
91
+ */
92
+ getBounds(layer) {
93
+ var bounds = layer instanceof TMXLayer ? pool.pull("Bounds") : this.bounds;
94
+
95
+ // The map size is the same regardless of which indexes are shifted.
96
+ if (this.staggerX) {
97
+ bounds.setMinMax(
98
+ 0, 0,
99
+ this.cols * this.columnwidth + this.sideoffsetx,
100
+ this.rows * (this.tileheight + this.sidelengthy)
101
+ );
102
+ if (bounds.width > 1) {
103
+ bounds.height += this.rowheight;
104
+ }
105
+ } else {
106
+ bounds.setMinMax(
107
+ 0, 0,
108
+ this.cols * (this.tilewidth + this.sidelengthx),
109
+ this.rows * this.rowheight + this.sideoffsety
110
+ );
111
+ if (bounds.height > 1) {
112
+ bounds.width += this.columnwidth;
113
+ }
114
+ }
115
+ return bounds;
116
+ }
117
+
118
+ /**
119
+ * @ignore
120
+ */
121
+ doStaggerX (x) {
122
+ return this.staggerX && (x & 1) ^ this.staggerEven;
123
+ }
124
+
125
+ /**
126
+ * @ignore
127
+ */
128
+ doStaggerY(y) {
129
+ return !this.staggerX && (y & 1) ^ this.staggerEven;
130
+ }
131
+
132
+ /**
133
+ * @ignore
134
+ */
135
+ topLeft(x, y, v) {
136
+ var ret = v || new Vector2d();
137
+
138
+ if (!this.staggerX) {
139
+ if ((y & 1) ^ this.staggerEven) {
140
+ ret.set(x, y - 1);
141
+ }
142
+ else {
143
+ ret.set(x - 1, y - 1);
144
+ }
145
+ } else {
146
+ if ((x & 1) ^ this.staggerEven) {
147
+ ret.set(x - 1, y);
148
+ }
149
+ else {
150
+ ret.set(x - 1, y - 1);
151
+ }
152
+ }
153
+ return ret;
154
+ }
155
+
156
+ /**
157
+ * @ignore
158
+ */
159
+ topRight(x, y, v) {
160
+ var ret = v || new Vector2d();
161
+
162
+ if (!this.staggerX) {
163
+ if ((y & 1) ^ this.staggerEven) {
164
+ ret.set(x + 1, y - 1);
165
+ }
166
+ else {
167
+ ret.set(x, y - 1);
168
+ }
169
+ } else {
170
+ if ((x & 1) ^ this.staggerEven) {
171
+ ret.set(x + 1, y);
172
+ }
173
+ else {
174
+ ret.set(x + 1, y - 1);
175
+ }
176
+ }
177
+ return ret;
178
+ }
179
+
180
+
181
+ /**
182
+ * @ignore
183
+ */
184
+ bottomLeft(x, y, v) {
185
+ var ret = v || new Vector2d();
186
+
187
+ if (!this.staggerX) {
188
+ if ((y & 1) ^ this.staggerEven) {
189
+ ret.set(x, y + 1);
190
+ }
191
+ else {
192
+ ret.set(x - 1, y + 1);
193
+ }
194
+ } else {
195
+ if ((x & 1) ^ this.staggerEven) {
196
+ ret.set(x -1, y + 1);
197
+ }
198
+ else {
199
+ ret.set(x -1, y);
200
+ }
201
+ }
202
+ return ret;
203
+ }
204
+
205
+ /**
206
+ * @ignore
207
+ */
208
+ bottomRight(x, y, v) {
209
+ var ret = v || new Vector2d();
210
+
211
+ if (!this.staggerX) {
212
+ if ((y & 1) ^ this.staggerEven) {
213
+ ret.set(x + 1, y + 1);
214
+ }
215
+ else {
216
+ ret.set(x, y + 1);
217
+ }
218
+ } else {
219
+ if ((x & 1) ^ this.staggerEven) {
220
+ ret.set(x + 1, y + 1);
221
+ }
222
+ else {
223
+ ret.set(x + 1, y);
224
+ }
225
+ }
226
+ return ret;
227
+ }
228
+
229
+ /**
230
+ * return the tile position corresponding to the specified pixel
231
+ * @ignore
232
+ */
233
+ pixelToTileCoords(x, y, v) {
234
+ var ret = v || new Vector2d();
235
+
236
+ if (this.staggerX) { //flat top
237
+ x -= this.staggerEven ? this.tilewidth : this.sideoffsetx;
238
+ }
239
+ else { //pointy top
240
+ y -= this.staggerEven ? this.tileheight : this.sideoffsety;
241
+ }
242
+
243
+ // Start with the coordinates of a grid-aligned tile
244
+ var referencePoint = pool.pull("Vector2d",
245
+ Math.floor(x / (this.columnwidth * 2)),
246
+ Math.floor((y / (this.rowheight * 2)))
247
+ );
248
+
249
+ // Relative x and y position on the base square of the grid-aligned tile
250
+ var rel = pool.pull("Vector2d",
251
+ x - referencePoint.x * (this.columnwidth * 2),
252
+ y - referencePoint.y * (this.rowheight * 2)
253
+ );
254
+
255
+ // Adjust the reference point to the correct tile coordinates
256
+ if (this.staggerX) {
257
+ referencePoint.x = referencePoint.x * 2;
258
+ if (this.staggerEven) {
259
+ ++referencePoint.x;
260
+ }
261
+ }
262
+ else {
263
+ referencePoint.y = referencePoint.y * 2;
264
+ if (this.staggerEven) {
265
+ ++referencePoint.y;
266
+ }
267
+ }
268
+
269
+ // Determine the nearest hexagon tile by the distance to the center
270
+ var left, top, centerX, centerY;
271
+ if (this.staggerX) {
272
+ left = this.sidelengthx / 2;
273
+ centerX = left + this.columnwidth;
274
+ centerY = this.tileheight / 2;
275
+
276
+ this.centers[0].set(left, centerY);
277
+ this.centers[1].set(centerX, centerY - this.rowheight);
278
+ this.centers[2].set(centerX, centerY + this.rowheight);
279
+ this.centers[3].set(centerX + this.columnwidth, centerY);
280
+ }
281
+ else {
282
+ top = this.sidelengthy / 2;
283
+ centerX = this.tilewidth / 2;
284
+ centerY = top + this.rowheight;
285
+
286
+ this.centers[0].set(centerX, top);
287
+ this.centers[1].set(centerX - this.columnwidth, centerY);
288
+ this.centers[2].set(centerX + this.columnwidth, centerY);
289
+ this.centers[3].set(centerX, centerY + this.rowheight);
290
+ }
291
+
292
+ var nearest = 0;
293
+ var minDist = Number.MAX_VALUE;
294
+ for (var i = 0; i < 4; ++i) {
295
+ var dc = this.centers[i].sub(rel).length2();
296
+ if (dc < minDist) {
297
+ minDist = dc;
298
+ nearest = i;
299
+ }
300
+ }
301
+
302
+ var offsets = (this.staggerX) ? offsetsStaggerX : offsetsStaggerY;
303
+
304
+ ret.set(
305
+ referencePoint.x + offsets[nearest].x,
306
+ referencePoint.y + offsets[nearest].y
307
+ );
308
+
309
+ pool.push(referencePoint);
310
+ pool.push(rel);
311
+
312
+ return ret;
313
+ }
314
+
315
+ /**
316
+ * return the pixel position corresponding of the specified tile
317
+ * @ignore
318
+ */
319
+ tileToPixelCoords(x, y, v) {
320
+ var tileX = Math.floor(x),
321
+ tileY = Math.floor(y);
322
+ var ret = v || new Vector2d();
323
+
324
+ if (this.staggerX) {
325
+ ret.y = tileY * (this.tileheight + this.sidelengthy);
326
+ if (this.doStaggerX(tileX)) {
327
+ ret.y += this.rowheight;
328
+ }
329
+ ret.x = tileX * this.columnwidth;
330
+ } else {
331
+ ret.x = tileX * (this.tilewidth + this.sidelengthx);
332
+ if (this.doStaggerY(tileY)) {
333
+ ret.x += this.columnwidth;
334
+ }
335
+ ret.y = tileY * this.rowheight;
336
+ }
337
+
338
+ return ret;
339
+ }
340
+
341
+ /**
342
+ * fix the position of Objects to match
343
+ * the way Tiled places them
344
+ * @ignore
345
+ */
346
+ adjustPosition(obj) {
347
+ // only adjust position if obj.gid is defined
348
+ if (typeof(obj.gid) === "number") {
349
+ // Tiled objects origin point is "bottom-left" in Tiled,
350
+ // "top-left" in melonJS)
351
+ obj.y -= obj.height;
352
+ }
353
+ }
354
+
355
+ /**
356
+ * draw the tile map
357
+ * @ignore
358
+ */
359
+ drawTile(renderer, x, y, tmxTile) {
360
+ var tileset = tmxTile.tileset;
361
+ var point = this.tileToPixelCoords(x, y, pool.pull("Vector2d"));
362
+
363
+ // draw the tile
364
+ tileset.drawTile(
365
+ renderer,
366
+ tileset.tileoffset.x + point.x,
367
+ tileset.tileoffset.y + point.y + (this.tileheight - tileset.tileheight),
368
+ tmxTile
369
+ );
370
+
371
+ pool.push(point);
372
+ }
373
+
374
+ /**
375
+ * draw the tile map
376
+ * @ignore
377
+ */
378
+ drawTileLayer(renderer, layer, rect) {
379
+ var tile;
380
+
381
+ // get top-left and bottom-right tile position
382
+ var startTile = this.pixelToTileCoords(
383
+ rect.pos.x,
384
+ rect.pos.y,
385
+ pool.pull("Vector2d")
386
+ );
387
+
388
+ // Compensate for the layer position
389
+ startTile.sub(layer.pos);
390
+
391
+ // get top-left and bottom-right tile position
392
+ var startPos = this.tileToPixelCoords(
393
+ startTile.x + layer.pos.x,
394
+ startTile.y + layer.pos.y,
395
+ pool.pull("Vector2d")
396
+ );
397
+
398
+ var rowTile = startTile.clone();
399
+ var rowPos = startPos.clone();
400
+
401
+ /* Determine in which half of the tile the top-left corner of the area we
402
+ * need to draw is. If we're in the upper half, we need to start one row
403
+ * up due to those tiles being visible as well. How we go up one row
404
+ * depends on whether we're in the left or right half of the tile.
405
+ */
406
+ var inUpperHalf = rect.pos.y - startPos.y < this.sideoffsety;
407
+ var inLeftHalf = rect.pos.x - startPos.x < this.sideoffsetx;
408
+
409
+ if (inUpperHalf) {
410
+ startTile.y--;
411
+ }
412
+ if (inLeftHalf) {
413
+ startTile.x--;
414
+ }
415
+
416
+ var endX = layer.cols;
417
+ var endY = layer.rows;
418
+
419
+ if (this.staggerX) {
420
+ //ensure we are in the valid tile range
421
+ startTile.x = Math.max(0, startTile.x);
422
+ startTile.y = Math.max(0, startTile.y);
423
+
424
+ startPos = this.tileToPixelCoords(
425
+ startTile.x + layer.pos.x,
426
+ startTile.y + layer.pos.y
427
+ );
428
+
429
+ var staggeredRow = this.doStaggerX(startTile.x + layer.pos.x);
430
+
431
+ // main drawing loop
432
+ for (; startPos.y < rect.bottom && startTile.y < endY; ) {
433
+ rowTile.setV(startTile);
434
+ rowPos.setV(startPos);
435
+
436
+ for (; rowPos.x < rect.right && rowTile.x < endX; rowTile.x+=2) {
437
+ tile = layer.cellAt(rowTile.x, rowTile.y, false);
438
+ if (tile) {
439
+ // draw the tile
440
+ tile.tileset.drawTile(renderer, rowPos.x, rowPos.y, tile);
441
+ }
442
+ rowPos.x += this.tilewidth + this.sidelengthx;
443
+ }
444
+
445
+ if (staggeredRow) {
446
+ startTile.x -= 1;
447
+ startTile.y += 1;
448
+ startPos.x -= this.columnwidth;
449
+ staggeredRow = false;
450
+ } else {
451
+ startTile.x += 1;
452
+ startPos.x += this.columnwidth;
453
+ staggeredRow = true;
454
+ }
455
+
456
+ startPos.y += this.rowheight;
457
+ }
458
+ pool.push(rowTile);
459
+ pool.push(rowPos);
460
+
461
+ } else {
462
+ //ensure we are in the valid tile range
463
+ startTile.x = Math.max(0, startTile.x);
464
+ startTile.y = Math.max(0, startTile.y);
465
+
466
+ startPos = this.tileToPixelCoords(
467
+ startTile.x + layer.pos.x,
468
+ startTile.y + layer.pos.y
469
+ );
470
+
471
+ // Odd row shifting is applied in the rendering loop, so un-apply it here
472
+ if (this.doStaggerY(startTile.y)) {
473
+ startPos.x -= this.columnwidth;
474
+ }
475
+
476
+ // main drawing loop
477
+ for (; startPos.y < rect.bottom && startTile.y < endY; startTile.y++) {
478
+ rowTile.setV(startTile);
479
+ rowPos.setV(startPos);
480
+
481
+ if (this.doStaggerY(startTile.y)) {
482
+ rowPos.x += this.columnwidth;
483
+ }
484
+
485
+ for (; rowPos.x < rect.right && rowTile.x < endX; rowTile.x++) {
486
+ tile = layer.cellAt(rowTile.x, rowTile.y, false);
487
+ if (tile) {
488
+ // draw the tile
489
+ tile.tileset.drawTile(renderer, rowPos.x, rowPos.y, tile);
490
+ }
491
+ rowPos.x += this.tilewidth + this.sidelengthx;
492
+ }
493
+ startPos.y += this.rowheight;
494
+ }
495
+ pool.push(rowTile);
496
+ pool.push(rowPos);
497
+ }
498
+
499
+ pool.push(startTile);
500
+ pool.push(startPos);
501
+ }
502
+ }
503
+
504
+ export { TMXHexagonalRenderer as default };
@@ -0,0 +1,218 @@
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 Vector2d from '../../../math/vector2.js';
9
+ import pool from '../../../system/pooling.js';
10
+ import TMXRenderer from './TMXRenderer.js';
11
+ import TMXLayer from '../TMXLayer.js';
12
+
13
+ /**
14
+ * @classdesc
15
+ * an Isometric Map Renderder
16
+ * @augments TMXRenderer
17
+ */
18
+ class TMXIsometricRenderer extends TMXRenderer {
19
+ /**
20
+ * @param {TMXTileMap} map - the TMX map
21
+ */
22
+ constructor(map) {
23
+ super(
24
+ map.cols,
25
+ map.rows,
26
+ map.tilewidth,
27
+ map.tileheight
28
+ );
29
+
30
+ this.hTilewidth = this.tilewidth / 2;
31
+ this.hTileheight = this.tileheight / 2;
32
+ this.originX = this.rows * this.hTilewidth;
33
+ }
34
+
35
+ /**
36
+ * return true if the renderer can render the specified layer
37
+ * @ignore
38
+ */
39
+ canRender(layer) {
40
+ return (
41
+ (layer.orientation === "isometric") &&
42
+ super.canRender(layer)
43
+ );
44
+ }
45
+
46
+ /**
47
+ * return the bounding rect for this map renderer
48
+ * @name TMXIsometricRenderer#getBounds
49
+ * @public
50
+ * @param {TMXLayer} [layer] - calculate the bounding rect for a specific layer (will return a new bounds object)
51
+ * @returns {Bounds}
52
+ */
53
+ getBounds(layer) {
54
+ var bounds = layer instanceof TMXLayer ? pool.pull("Bounds") : this.bounds;
55
+ bounds.setMinMax(
56
+ 0, 0,
57
+ (this.cols + this.rows) * (this.tilewidth / 2),
58
+ (this.cols + this.rows) * (this.tileheight / 2)
59
+ );
60
+ return bounds;
61
+ }
62
+
63
+ /**
64
+ * return the tile position corresponding to the specified pixel
65
+ * @ignore
66
+ */
67
+ pixelToTileCoords(x, y, v) {
68
+ var ret = v || new Vector2d();
69
+ return ret.set(
70
+ (y / this.tileheight) + ((x - this.originX) / this.tilewidth),
71
+ (y / this.tileheight) - ((x - this.originX) / this.tilewidth)
72
+ );
73
+ }
74
+
75
+ /**
76
+ * return the pixel position corresponding of the specified tile
77
+ * @ignore
78
+ */
79
+ tileToPixelCoords(x, y, v) {
80
+ var ret = v || new Vector2d();
81
+ return ret.set(
82
+ (x - y) * this.hTilewidth + this.originX,
83
+ (x + y) * this.hTileheight
84
+ );
85
+ }
86
+
87
+ /**
88
+ * fix the position of Objects to match
89
+ * the way Tiled places them
90
+ * @ignore
91
+ */
92
+ adjustPosition(obj) {
93
+ var tileX = obj.x / this.hTilewidth;
94
+ var tileY = obj.y / this.tileheight;
95
+ var isoPos = pool.pull("Vector2d");
96
+
97
+ this.tileToPixelCoords(tileX, tileY, isoPos);
98
+
99
+ obj.x = isoPos.x;
100
+ obj.y = isoPos.y;
101
+
102
+ pool.push(isoPos);
103
+ }
104
+
105
+ /**
106
+ * draw the tile map
107
+ * @ignore
108
+ */
109
+ drawTile(renderer, x, y, tmxTile) {
110
+ var tileset = tmxTile.tileset;
111
+ // draw the tile
112
+ tileset.drawTile(
113
+ renderer,
114
+ ((this.cols - 1) * tileset.tilewidth + (x - y) * tileset.tilewidth >> 1),
115
+ (-tileset.tilewidth + (x + y) * tileset.tileheight >> 2),
116
+ tmxTile
117
+ );
118
+ }
119
+
120
+ /**
121
+ * draw the tile map
122
+ * @ignore
123
+ */
124
+ drawTileLayer(renderer, layer, rect) {
125
+ // cache a couple of useful references
126
+ var tileset = layer.tileset;
127
+
128
+ // get top-left and bottom-right tile position
129
+ var rowItr = this.pixelToTileCoords(
130
+ rect.pos.x - tileset.tilewidth,
131
+ rect.pos.y - tileset.tileheight,
132
+ pool.pull("Vector2d")
133
+ ).floorSelf();
134
+ var tileEnd = this.pixelToTileCoords(
135
+ rect.pos.x + rect.width + tileset.tilewidth,
136
+ rect.pos.y + rect.height + tileset.tileheight,
137
+ pool.pull("Vector2d")
138
+ ).ceilSelf();
139
+
140
+ var rectEnd = this.tileToPixelCoords(tileEnd.x, tileEnd.y, pool.pull("Vector2d"));
141
+
142
+ // Determine the tile and pixel coordinates to start at
143
+ var startPos = this.tileToPixelCoords(rowItr.x, rowItr.y, pool.pull("Vector2d"));
144
+ startPos.x -= this.hTilewidth;
145
+ startPos.y += this.tileheight;
146
+
147
+ /* Determine in which half of the tile the top-left corner of the area we
148
+ * need to draw is. If we're in the upper half, we need to start one row
149
+ * up due to those tiles being visible as well. How we go up one row
150
+ * depends on whether we're in the left or right half of the tile.
151
+ */
152
+ var inUpperHalf = startPos.y - rect.pos.y > this.hTileheight;
153
+ var inLeftHalf = rect.pos.x - startPos.x < this.hTilewidth;
154
+
155
+ if (inUpperHalf) {
156
+ if (inLeftHalf) {
157
+ rowItr.x--;
158
+ startPos.x -= this.hTilewidth;
159
+ }
160
+ else {
161
+ rowItr.y--;
162
+ startPos.x += this.hTilewidth;
163
+ }
164
+ startPos.y -= this.hTileheight;
165
+ }
166
+
167
+ // Determine whether the current row is shifted half a tile to the right
168
+ var shifted = inUpperHalf ^ inLeftHalf;
169
+
170
+ // initialize the columItr vector
171
+ var columnItr = rowItr.clone();
172
+
173
+ // main drawing loop
174
+ for (var y = startPos.y * 2; y - this.tileheight * 2 < rectEnd.y * 2; y += this.tileheight) {
175
+ columnItr.setV(rowItr);
176
+ for (var x = startPos.x; x < rectEnd.x; x += this.tilewidth) {
177
+ var tmxTile = layer.cellAt(columnItr.x, columnItr.y);
178
+ // render if a valid tile position
179
+ if (tmxTile) {
180
+ tileset = tmxTile.tileset;
181
+ // offset could be different per tileset
182
+ var offset = tileset.tileoffset;
183
+ // draw our tile
184
+ tileset.drawTile(
185
+ renderer,
186
+ offset.x + x,
187
+ offset.y + y / 2 - tileset.tileheight,
188
+ tmxTile
189
+ );
190
+ }
191
+
192
+ // Advance to the next column
193
+ columnItr.x++;
194
+ columnItr.y--;
195
+ }
196
+
197
+ // Advance to the next row
198
+ if (!shifted) {
199
+ rowItr.x++;
200
+ startPos.x += this.hTilewidth;
201
+ shifted = true;
202
+ }
203
+ else {
204
+ rowItr.y++;
205
+ startPos.x -= this.hTilewidth;
206
+ shifted = false;
207
+ }
208
+ }
209
+
210
+ pool.push(columnItr);
211
+ pool.push(rowItr);
212
+ pool.push(tileEnd);
213
+ pool.push(rectEnd);
214
+ pool.push(startPos);
215
+ }
216
+ }
217
+
218
+ export { TMXIsometricRenderer as default };