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