melonjs 10.9.0 → 10.10.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/LICENSE.md +1 -1
- package/README.md +29 -23
- package/dist/melonjs.js +812 -485
- package/dist/melonjs.min.js +4 -4
- package/dist/melonjs.module.d.ts +413 -230
- package/dist/melonjs.module.js +751 -437
- package/package.json +13 -10
- package/src/game.js +2 -2
- package/src/geometries/ellipse.js +16 -16
- package/src/geometries/line.js +4 -4
- package/src/geometries/path2d.js +10 -10
- package/src/geometries/poly.js +23 -23
- package/src/geometries/rectangle.js +22 -22
- package/src/geometries/roundrect.js +6 -6
- package/src/index.js +7 -1
- package/src/lang/deprecated.js +7 -5
- package/src/level/tiled/TMXUtils.js +1 -1
- package/src/loader/loadingscreen.js +16 -5
- package/src/math/color.js +5 -4
- package/src/particles/emitter.js +11 -12
- package/src/renderable/GUI.js +5 -5
- package/src/renderable/container.js +26 -26
- package/src/renderable/imagelayer.js +2 -2
- package/src/renderable/light2d.js +115 -0
- package/src/renderable/renderable.js +21 -20
- package/src/renderable/sprite.js +13 -13
- package/src/state/stage.js +72 -2
- package/src/text/text.js +13 -17
- package/src/video/canvas/canvas_renderer.js +69 -51
- package/src/video/renderer.js +33 -26
- package/src/video/{texture.js → texture/atlas.js} +8 -8
- package/src/video/{texture_cache.js → texture/cache.js} +4 -4
- package/src/video/texture/canvas_texture.js +87 -0
- package/src/video/webgl/webgl_renderer.js +73 -55
package/src/state/stage.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { renderer } from "./../video/video.js";
|
|
2
2
|
import * as game from "./../game.js";
|
|
3
3
|
import Camera2d from "./../camera/camera2d.js";
|
|
4
|
+
import Color from "./../math/color.js";
|
|
4
5
|
|
|
5
6
|
// a default camera instance to use across all stages
|
|
6
7
|
var default_camera;
|
|
@@ -37,6 +38,40 @@ class Stage {
|
|
|
37
38
|
*/
|
|
38
39
|
this.cameras = new Map();
|
|
39
40
|
|
|
41
|
+
/**
|
|
42
|
+
* The list of active lights in this stage.
|
|
43
|
+
* (Note: Canvas Renderering mode will only properly support one light per stage)
|
|
44
|
+
* @public
|
|
45
|
+
* @type {Map<Light2d>}
|
|
46
|
+
* @name lights
|
|
47
|
+
* @memberof Stage
|
|
48
|
+
* @see Light2d
|
|
49
|
+
* @see Stage.ambientLight
|
|
50
|
+
* @example
|
|
51
|
+
* // create a white spot light
|
|
52
|
+
* var whiteLight = new me.Light2d(0, 0, 140, "#fff", 0.7);
|
|
53
|
+
* // and add the light to this current stage
|
|
54
|
+
* this.lights.set("whiteLight", whiteLight);
|
|
55
|
+
* // set a dark ambient light
|
|
56
|
+
* this.ambientLight.parseCSS("#1117");
|
|
57
|
+
* // make the light follow the mouse
|
|
58
|
+
* me.input.registerPointerEvent("pointermove", me.game.viewport, (event) => {
|
|
59
|
+
* whiteLight.centerOn(event.gameX, event.gameY);
|
|
60
|
+
* });
|
|
61
|
+
*/
|
|
62
|
+
this.lights = new Map();
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* an ambient light that will be added to the stage rendering
|
|
66
|
+
* @public
|
|
67
|
+
* @type {Color}
|
|
68
|
+
* @name ambientLight
|
|
69
|
+
* @memberof Stage
|
|
70
|
+
* @default "#000000"
|
|
71
|
+
* @see Light2d
|
|
72
|
+
*/
|
|
73
|
+
this.ambientLight = new Color(0, 0, 0, 0);
|
|
74
|
+
|
|
40
75
|
/**
|
|
41
76
|
* The given constructor options
|
|
42
77
|
* @public
|
|
@@ -92,7 +127,14 @@ class Stage {
|
|
|
92
127
|
// update the camera/viewport
|
|
93
128
|
// iterate through all cameras
|
|
94
129
|
this.cameras.forEach(function(camera) {
|
|
95
|
-
if (camera.update(dt)) {
|
|
130
|
+
if (camera.update(dt) === true) {
|
|
131
|
+
isDirty = true;
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// update all lights
|
|
136
|
+
this.lights.forEach((light) => {
|
|
137
|
+
if (light.update(dt) === true) {
|
|
96
138
|
isDirty = true;
|
|
97
139
|
};
|
|
98
140
|
});
|
|
@@ -110,9 +152,32 @@ class Stage {
|
|
|
110
152
|
*/
|
|
111
153
|
draw(renderer) {
|
|
112
154
|
// iterate through all cameras
|
|
113
|
-
this.cameras.forEach(
|
|
155
|
+
this.cameras.forEach((camera) => {
|
|
114
156
|
// render the root container
|
|
115
157
|
camera.draw(renderer, game.world);
|
|
158
|
+
|
|
159
|
+
// render the ambient light
|
|
160
|
+
if (this.ambientLight.alpha !== 0) {
|
|
161
|
+
renderer.save();
|
|
162
|
+
// iterate through all lights
|
|
163
|
+
this.lights.forEach((light) => {
|
|
164
|
+
// cut out all lights visible areas
|
|
165
|
+
renderer.setMask(light.getVisibleArea(), true);
|
|
166
|
+
});
|
|
167
|
+
// fill the screen with the ambient color
|
|
168
|
+
renderer.setColor(this.ambientLight);
|
|
169
|
+
renderer.fillRect(0, 0, camera.width, camera.height);
|
|
170
|
+
// clear all masks
|
|
171
|
+
renderer.clearMask();
|
|
172
|
+
renderer.restore();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// render all lights
|
|
176
|
+
this.lights.forEach((light) => {
|
|
177
|
+
light.preDraw(renderer, game.world);
|
|
178
|
+
light.draw(renderer, game.world);
|
|
179
|
+
light.postDraw(renderer, game.world);
|
|
180
|
+
});
|
|
116
181
|
});
|
|
117
182
|
}
|
|
118
183
|
|
|
@@ -123,6 +188,11 @@ class Stage {
|
|
|
123
188
|
destroy() {
|
|
124
189
|
// clear all cameras
|
|
125
190
|
this.cameras.clear();
|
|
191
|
+
// clear all lights
|
|
192
|
+
this.lights.forEach((light) => {
|
|
193
|
+
light.destroy();
|
|
194
|
+
});
|
|
195
|
+
this.lights.clear();
|
|
126
196
|
// notify the object
|
|
127
197
|
this.onDestroyEvent.apply(this, arguments);
|
|
128
198
|
}
|
package/src/text/text.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Color from "./../math/color.js";
|
|
2
2
|
import WebGLRenderer from "./../video/webgl/webgl_renderer.js";
|
|
3
|
-
import { renderer as globalRenderer
|
|
3
|
+
import { renderer as globalRenderer } from "./../video/video.js";
|
|
4
4
|
import { trimRight } from "./../utils/string.js";
|
|
5
5
|
import pool from "./../system/pooling.js";
|
|
6
6
|
import Renderable from "./../renderable/renderable.js";
|
|
@@ -23,7 +23,7 @@ var toPX = [12, 24, 0.75, 1];
|
|
|
23
23
|
// return a valid 2d context for Text rendering/styling
|
|
24
24
|
var getContext2d = function (renderer, text) {
|
|
25
25
|
if (text.offScreenCanvas === true) {
|
|
26
|
-
return text.context;
|
|
26
|
+
return text.canvasTexture.context;
|
|
27
27
|
} else {
|
|
28
28
|
return renderer.getFontContext();
|
|
29
29
|
}
|
|
@@ -190,8 +190,7 @@ class Text extends Renderable {
|
|
|
190
190
|
|
|
191
191
|
if (settings.offScreenCanvas === true) {
|
|
192
192
|
this.offScreenCanvas = true;
|
|
193
|
-
this.
|
|
194
|
-
this.context = this.canvas.getContext("2d");
|
|
193
|
+
this.canvasTexture = pool.pull("CanvasTexture", 2, 2, true);
|
|
195
194
|
}
|
|
196
195
|
|
|
197
196
|
// instance to text metrics functions
|
|
@@ -206,10 +205,9 @@ class Text extends Renderable {
|
|
|
206
205
|
// free the canvas and potential corresponding texture when deactivated
|
|
207
206
|
if (this.offScreenCanvas === true) {
|
|
208
207
|
globalRenderer.currentCompositor.deleteTexture2D(globalRenderer.currentCompositor.getTexture2D(this.glTextureUnit));
|
|
209
|
-
globalRenderer.cache.delete(this.canvas);
|
|
210
|
-
|
|
211
|
-
this.
|
|
212
|
-
this.canvas = undefined;
|
|
208
|
+
globalRenderer.cache.delete(this.canvasTexture.canvas);
|
|
209
|
+
pool.push(this.canvasTexture);
|
|
210
|
+
this.canvasTexture = undefined;
|
|
213
211
|
this.glTextureUnit = undefined;
|
|
214
212
|
}
|
|
215
213
|
}
|
|
@@ -307,7 +305,7 @@ class Text extends Renderable {
|
|
|
307
305
|
|
|
308
306
|
if (globalRenderer instanceof WebGLRenderer) {
|
|
309
307
|
// invalidate the previous corresponding texture so that it can reuploaded once changed
|
|
310
|
-
this.glTextureUnit = globalRenderer.cache.getUnit(globalRenderer.cache.get(this.canvas));
|
|
308
|
+
this.glTextureUnit = globalRenderer.cache.getUnit(globalRenderer.cache.get(this.canvasTexture.canvas));
|
|
311
309
|
globalRenderer.currentCompositor.unbindTexture2D(null, this.glTextureUnit);
|
|
312
310
|
|
|
313
311
|
if (globalRenderer.WebGLVersion === 1) {
|
|
@@ -318,14 +316,12 @@ class Text extends Renderable {
|
|
|
318
316
|
}
|
|
319
317
|
|
|
320
318
|
// resize the cache canvas if necessary
|
|
321
|
-
if (this.
|
|
322
|
-
this.
|
|
323
|
-
this.canvas.height = height;
|
|
324
|
-
// resizing the canvas will automatically clear its content
|
|
325
|
-
} else {
|
|
326
|
-
this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
|
319
|
+
if (this.canvasTexture.width < width || this.canvasTexture.height < height) {
|
|
320
|
+
this.canvasTexture.resize(width, height);
|
|
327
321
|
}
|
|
328
|
-
|
|
322
|
+
|
|
323
|
+
this.canvasTexture.clear();
|
|
324
|
+
this._drawFont(this.canvasTexture.context, this._text, this.pos.x - this.metrics.x, this.pos.y - this.metrics.y, false);
|
|
329
325
|
}
|
|
330
326
|
|
|
331
327
|
this.isDirty = true;
|
|
@@ -389,7 +385,7 @@ class Text extends Renderable {
|
|
|
389
385
|
|
|
390
386
|
// draw the text
|
|
391
387
|
if (this.offScreenCanvas === true) {
|
|
392
|
-
renderer.drawImage(this.canvas, x, y);
|
|
388
|
+
renderer.drawImage(this.canvasTexture.canvas, x, y);
|
|
393
389
|
} else {
|
|
394
390
|
renderer.drawFont(this._drawFont(renderer.getFontContext(), this._text, x, y, stroke));
|
|
395
391
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import Color from "./../../math/color.js";
|
|
2
2
|
import Renderer from "./../renderer.js";
|
|
3
|
-
import TextureCache from "./../
|
|
3
|
+
import TextureCache from "./../texture/cache.js";
|
|
4
4
|
import Ellipse from "./../../geometries/ellipse.js";
|
|
5
5
|
import RoundRect from "./../../geometries/roundrect.js";
|
|
6
|
+
import Bounds from "./../../physics/bounds.js";
|
|
6
7
|
import { createCanvas } from "./../video.js";
|
|
7
8
|
|
|
8
9
|
|
|
@@ -72,7 +73,7 @@ class CanvasRenderer extends Renderer {
|
|
|
72
73
|
/**
|
|
73
74
|
* Reset context state
|
|
74
75
|
* @name reset
|
|
75
|
-
* @memberof CanvasRenderer
|
|
76
|
+
* @memberof CanvasRenderer
|
|
76
77
|
* @function
|
|
77
78
|
*/
|
|
78
79
|
reset() {
|
|
@@ -83,7 +84,7 @@ class CanvasRenderer extends Renderer {
|
|
|
83
84
|
/**
|
|
84
85
|
* Reset the canvas transform to identity
|
|
85
86
|
* @name resetTransform
|
|
86
|
-
* @memberof CanvasRenderer
|
|
87
|
+
* @memberof CanvasRenderer
|
|
87
88
|
* @function
|
|
88
89
|
*/
|
|
89
90
|
resetTransform() {
|
|
@@ -103,7 +104,7 @@ class CanvasRenderer extends Renderer {
|
|
|
103
104
|
* <img src="images/screen-blendmode.png" width="510"/> <br>
|
|
104
105
|
* @name setBlendMode
|
|
105
106
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
|
|
106
|
-
* @memberof CanvasRenderer
|
|
107
|
+
* @memberof CanvasRenderer
|
|
107
108
|
* @function
|
|
108
109
|
* @param {string} [mode="normal"] blend mode : "normal", "multiply", "lighter, "additive", "screen"
|
|
109
110
|
* @param {CanvasRenderingContext2D} [context]
|
|
@@ -141,7 +142,7 @@ class CanvasRenderer extends Renderer {
|
|
|
141
142
|
/**
|
|
142
143
|
* prepare the framebuffer for drawing a new frame
|
|
143
144
|
* @name clear
|
|
144
|
-
* @memberof CanvasRenderer
|
|
145
|
+
* @memberof CanvasRenderer
|
|
145
146
|
* @function
|
|
146
147
|
*/
|
|
147
148
|
clear() {
|
|
@@ -153,7 +154,7 @@ class CanvasRenderer extends Renderer {
|
|
|
153
154
|
/**
|
|
154
155
|
* render the main framebuffer on screen
|
|
155
156
|
* @name flush
|
|
156
|
-
* @memberof CanvasRenderer
|
|
157
|
+
* @memberof CanvasRenderer
|
|
157
158
|
* @function
|
|
158
159
|
*/
|
|
159
160
|
flush() {
|
|
@@ -165,7 +166,7 @@ class CanvasRenderer extends Renderer {
|
|
|
165
166
|
/**
|
|
166
167
|
* Clears the main framebuffer with the given color
|
|
167
168
|
* @name clearColor
|
|
168
|
-
* @memberof CanvasRenderer
|
|
169
|
+
* @memberof CanvasRenderer
|
|
169
170
|
* @function
|
|
170
171
|
* @param {Color|string} [color="#000000"] CSS color.
|
|
171
172
|
* @param {boolean} [opaque=false] Allow transparency [default] or clear the surface completely [true]
|
|
@@ -182,7 +183,7 @@ class CanvasRenderer extends Renderer {
|
|
|
182
183
|
/**
|
|
183
184
|
* Erase the pixels in the given rectangular area by setting them to transparent black (rgba(0,0,0,0)).
|
|
184
185
|
* @name clearRect
|
|
185
|
-
* @memberof CanvasRenderer
|
|
186
|
+
* @memberof CanvasRenderer
|
|
186
187
|
* @function
|
|
187
188
|
* @param {number} x x axis of the coordinate for the rectangle starting point.
|
|
188
189
|
* @param {number} y y axis of the coordinate for the rectangle starting point.
|
|
@@ -196,7 +197,7 @@ class CanvasRenderer extends Renderer {
|
|
|
196
197
|
/**
|
|
197
198
|
* Create a pattern with the specified repetition
|
|
198
199
|
* @name createPattern
|
|
199
|
-
* @memberof CanvasRenderer
|
|
200
|
+
* @memberof CanvasRenderer
|
|
200
201
|
* @function
|
|
201
202
|
* @param {Image} image Source image
|
|
202
203
|
* @param {string} repeat Define how the pattern should be repeated
|
|
@@ -215,7 +216,7 @@ class CanvasRenderer extends Renderer {
|
|
|
215
216
|
/**
|
|
216
217
|
* Draw an image onto the main using the canvas api
|
|
217
218
|
* @name drawImage
|
|
218
|
-
* @memberof CanvasRenderer
|
|
219
|
+
* @memberof CanvasRenderer
|
|
219
220
|
* @function
|
|
220
221
|
* @param {Image} image An element to draw into the context. The specification permits any canvas image source (CanvasImageSource), specifically, a CSSImageValue, an HTMLImageElement, an SVGImageElement, an HTMLVideoElement, an HTMLCanvasElement, an ImageBitmap, or an OffscreenCanvas.
|
|
221
222
|
* @param {number} sx The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.
|
|
@@ -279,7 +280,7 @@ class CanvasRenderer extends Renderer {
|
|
|
279
280
|
/**
|
|
280
281
|
* Draw a pattern within the given rectangle.
|
|
281
282
|
* @name drawPattern
|
|
282
|
-
* @memberof CanvasRenderer
|
|
283
|
+
* @memberof CanvasRenderer
|
|
283
284
|
* @function
|
|
284
285
|
* @param {CanvasPattern} pattern Pattern object
|
|
285
286
|
* @param {number} x
|
|
@@ -303,7 +304,7 @@ class CanvasRenderer extends Renderer {
|
|
|
303
304
|
/**
|
|
304
305
|
* Stroke an arc at the specified coordinates with given radius, start and end points
|
|
305
306
|
* @name strokeArc
|
|
306
|
-
* @memberof CanvasRenderer
|
|
307
|
+
* @memberof CanvasRenderer
|
|
307
308
|
* @function
|
|
308
309
|
* @param {number} x arc center point x-axis
|
|
309
310
|
* @param {number} y arc center point y-axis
|
|
@@ -330,7 +331,7 @@ class CanvasRenderer extends Renderer {
|
|
|
330
331
|
/**
|
|
331
332
|
* Fill an arc at the specified coordinates with given radius, start and end points
|
|
332
333
|
* @name fillArc
|
|
333
|
-
* @memberof CanvasRenderer
|
|
334
|
+
* @memberof CanvasRenderer
|
|
334
335
|
* @function
|
|
335
336
|
* @param {number} x arc center point x-axis
|
|
336
337
|
* @param {number} y arc center point y-axis
|
|
@@ -346,7 +347,7 @@ class CanvasRenderer extends Renderer {
|
|
|
346
347
|
/**
|
|
347
348
|
* Stroke an ellipse at the specified coordinates with given radius
|
|
348
349
|
* @name strokeEllipse
|
|
349
|
-
* @memberof CanvasRenderer
|
|
350
|
+
* @memberof CanvasRenderer
|
|
350
351
|
* @function
|
|
351
352
|
* @param {number} x ellipse center point x-axis
|
|
352
353
|
* @param {number} y ellipse center point y-axis
|
|
@@ -388,7 +389,7 @@ class CanvasRenderer extends Renderer {
|
|
|
388
389
|
/**
|
|
389
390
|
* Fill an ellipse at the specified coordinates with given radius
|
|
390
391
|
* @name fillEllipse
|
|
391
|
-
* @memberof CanvasRenderer
|
|
392
|
+
* @memberof CanvasRenderer
|
|
392
393
|
* @function
|
|
393
394
|
* @param {number} x ellipse center point x-axis
|
|
394
395
|
* @param {number} y ellipse center point y-axis
|
|
@@ -402,7 +403,7 @@ class CanvasRenderer extends Renderer {
|
|
|
402
403
|
/**
|
|
403
404
|
* Stroke a line of the given two points
|
|
404
405
|
* @name strokeLine
|
|
405
|
-
* @memberof CanvasRenderer
|
|
406
|
+
* @memberof CanvasRenderer
|
|
406
407
|
* @function
|
|
407
408
|
* @param {number} startX the start x coordinate
|
|
408
409
|
* @param {number} startY the start y coordinate
|
|
@@ -424,7 +425,7 @@ class CanvasRenderer extends Renderer {
|
|
|
424
425
|
/**
|
|
425
426
|
* Fill a line of the given two points
|
|
426
427
|
* @name fillLine
|
|
427
|
-
* @memberof CanvasRenderer
|
|
428
|
+
* @memberof CanvasRenderer
|
|
428
429
|
* @function
|
|
429
430
|
* @param {number} startX the start x coordinate
|
|
430
431
|
* @param {number} startY the start y coordinate
|
|
@@ -438,7 +439,7 @@ class CanvasRenderer extends Renderer {
|
|
|
438
439
|
/**
|
|
439
440
|
* Stroke the given me.Polygon on the screen
|
|
440
441
|
* @name strokePolygon
|
|
441
|
-
* @memberof CanvasRenderer
|
|
442
|
+
* @memberof CanvasRenderer
|
|
442
443
|
* @function
|
|
443
444
|
* @param {Polygon} poly the shape to draw
|
|
444
445
|
* @param {boolean} [fill=false] also fill the shape with the current color if true
|
|
@@ -467,7 +468,7 @@ class CanvasRenderer extends Renderer {
|
|
|
467
468
|
/**
|
|
468
469
|
* Fill the given me.Polygon on the screen
|
|
469
470
|
* @name fillPolygon
|
|
470
|
-
* @memberof CanvasRenderer
|
|
471
|
+
* @memberof CanvasRenderer
|
|
471
472
|
* @function
|
|
472
473
|
* @param {Polygon} poly the shape to draw
|
|
473
474
|
*/
|
|
@@ -478,7 +479,7 @@ class CanvasRenderer extends Renderer {
|
|
|
478
479
|
/**
|
|
479
480
|
* Stroke a rectangle at the specified coordinates
|
|
480
481
|
* @name strokeRect
|
|
481
|
-
* @memberof CanvasRenderer
|
|
482
|
+
* @memberof CanvasRenderer
|
|
482
483
|
* @function
|
|
483
484
|
* @param {number} x
|
|
484
485
|
* @param {number} y
|
|
@@ -499,7 +500,7 @@ class CanvasRenderer extends Renderer {
|
|
|
499
500
|
/**
|
|
500
501
|
* Draw a filled rectangle at the specified coordinates
|
|
501
502
|
* @name fillRect
|
|
502
|
-
* @memberof CanvasRenderer
|
|
503
|
+
* @memberof CanvasRenderer
|
|
503
504
|
* @function
|
|
504
505
|
* @param {number} x
|
|
505
506
|
* @param {number} y
|
|
@@ -513,7 +514,7 @@ class CanvasRenderer extends Renderer {
|
|
|
513
514
|
/**
|
|
514
515
|
* Stroke a rounded rectangle at the specified coordinates
|
|
515
516
|
* @name strokeRoundRect
|
|
516
|
-
* @memberof CanvasRenderer
|
|
517
|
+
* @memberof CanvasRenderer
|
|
517
518
|
* @function
|
|
518
519
|
* @param {number} x
|
|
519
520
|
* @param {number} y
|
|
@@ -537,7 +538,7 @@ class CanvasRenderer extends Renderer {
|
|
|
537
538
|
/**
|
|
538
539
|
* Draw a rounded filled rectangle at the specified coordinates
|
|
539
540
|
* @name fillRoundRect
|
|
540
|
-
* @memberof CanvasRenderer
|
|
541
|
+
* @memberof CanvasRenderer
|
|
541
542
|
* @function
|
|
542
543
|
* @param {number} x
|
|
543
544
|
* @param {number} y
|
|
@@ -553,7 +554,7 @@ class CanvasRenderer extends Renderer {
|
|
|
553
554
|
/**
|
|
554
555
|
* return a reference to the system 2d Context
|
|
555
556
|
* @name getContext
|
|
556
|
-
* @memberof CanvasRenderer
|
|
557
|
+
* @memberof CanvasRenderer
|
|
557
558
|
* @function
|
|
558
559
|
* @returns {CanvasRenderingContext2D}
|
|
559
560
|
*/
|
|
@@ -573,7 +574,7 @@ class CanvasRenderer extends Renderer {
|
|
|
573
574
|
/**
|
|
574
575
|
* save the canvas context
|
|
575
576
|
* @name save
|
|
576
|
-
* @memberof CanvasRenderer
|
|
577
|
+
* @memberof CanvasRenderer
|
|
577
578
|
* @function
|
|
578
579
|
*/
|
|
579
580
|
save() {
|
|
@@ -583,7 +584,7 @@ class CanvasRenderer extends Renderer {
|
|
|
583
584
|
/**
|
|
584
585
|
* restores the canvas context
|
|
585
586
|
* @name restore
|
|
586
|
-
* @memberof CanvasRenderer
|
|
587
|
+
* @memberof CanvasRenderer
|
|
587
588
|
* @function
|
|
588
589
|
*/
|
|
589
590
|
restore() {
|
|
@@ -598,7 +599,7 @@ class CanvasRenderer extends Renderer {
|
|
|
598
599
|
/**
|
|
599
600
|
* rotates the canvas context
|
|
600
601
|
* @name rotate
|
|
601
|
-
* @memberof CanvasRenderer
|
|
602
|
+
* @memberof CanvasRenderer
|
|
602
603
|
* @function
|
|
603
604
|
* @param {number} angle in radians
|
|
604
605
|
*/
|
|
@@ -609,7 +610,7 @@ class CanvasRenderer extends Renderer {
|
|
|
609
610
|
/**
|
|
610
611
|
* scales the canvas context
|
|
611
612
|
* @name scale
|
|
612
|
-
* @memberof CanvasRenderer
|
|
613
|
+
* @memberof CanvasRenderer
|
|
613
614
|
* @function
|
|
614
615
|
* @param {number} x
|
|
615
616
|
* @param {number} y
|
|
@@ -622,7 +623,7 @@ class CanvasRenderer extends Renderer {
|
|
|
622
623
|
* Set the current fill & stroke style color.
|
|
623
624
|
* By default, or upon reset, the value is set to #000000.
|
|
624
625
|
* @name setColor
|
|
625
|
-
* @memberof CanvasRenderer
|
|
626
|
+
* @memberof CanvasRenderer
|
|
626
627
|
* @function
|
|
627
628
|
* @param {Color|string} color css color value
|
|
628
629
|
*/
|
|
@@ -638,7 +639,7 @@ class CanvasRenderer extends Renderer {
|
|
|
638
639
|
/**
|
|
639
640
|
* Set the global alpha
|
|
640
641
|
* @name setGlobalAlpha
|
|
641
|
-
* @memberof CanvasRenderer
|
|
642
|
+
* @memberof CanvasRenderer
|
|
642
643
|
* @function
|
|
643
644
|
* @param {number} alpha 0.0 to 1.0 values accepted.
|
|
644
645
|
*/
|
|
@@ -649,7 +650,7 @@ class CanvasRenderer extends Renderer {
|
|
|
649
650
|
/**
|
|
650
651
|
* Return the global alpha
|
|
651
652
|
* @name getGlobalAlpha
|
|
652
|
-
* @memberof CanvasRenderer
|
|
653
|
+
* @memberof CanvasRenderer
|
|
653
654
|
* @function
|
|
654
655
|
* @returns {number} global alpha value
|
|
655
656
|
*/
|
|
@@ -660,7 +661,7 @@ class CanvasRenderer extends Renderer {
|
|
|
660
661
|
/**
|
|
661
662
|
* Set the line width on the context
|
|
662
663
|
* @name setLineWidth
|
|
663
|
-
* @memberof CanvasRenderer
|
|
664
|
+
* @memberof CanvasRenderer
|
|
664
665
|
* @function
|
|
665
666
|
* @param {number} width Line width
|
|
666
667
|
*/
|
|
@@ -672,7 +673,7 @@ class CanvasRenderer extends Renderer {
|
|
|
672
673
|
* Reset (overrides) the renderer transformation matrix to the
|
|
673
674
|
* identity one, and then apply the given transformation matrix.
|
|
674
675
|
* @name setTransform
|
|
675
|
-
* @memberof CanvasRenderer
|
|
676
|
+
* @memberof CanvasRenderer
|
|
676
677
|
* @function
|
|
677
678
|
* @param {Matrix2d} mat2d Matrix to transform by
|
|
678
679
|
*/
|
|
@@ -684,7 +685,7 @@ class CanvasRenderer extends Renderer {
|
|
|
684
685
|
/**
|
|
685
686
|
* Multiply given matrix into the renderer tranformation matrix
|
|
686
687
|
* @name transform
|
|
687
|
-
* @memberof CanvasRenderer
|
|
688
|
+
* @memberof CanvasRenderer
|
|
688
689
|
* @function
|
|
689
690
|
* @param {Matrix2d} mat2d Matrix to transform by
|
|
690
691
|
*/
|
|
@@ -708,7 +709,7 @@ class CanvasRenderer extends Renderer {
|
|
|
708
709
|
/**
|
|
709
710
|
* Translates the context to the given position
|
|
710
711
|
* @name translate
|
|
711
|
-
* @memberof CanvasRenderer
|
|
712
|
+
* @memberof CanvasRenderer
|
|
712
713
|
* @function
|
|
713
714
|
* @param {number} x
|
|
714
715
|
* @param {number} y
|
|
@@ -728,7 +729,7 @@ class CanvasRenderer extends Renderer {
|
|
|
728
729
|
* and restore it (with the restore() method) any time in the future.
|
|
729
730
|
* (<u>this is an experimental feature !</u>)
|
|
730
731
|
* @name clipRect
|
|
731
|
-
* @memberof CanvasRenderer
|
|
732
|
+
* @memberof CanvasRenderer
|
|
732
733
|
* @function
|
|
733
734
|
* @param {number} x
|
|
734
735
|
* @param {number} y
|
|
@@ -761,21 +762,28 @@ class CanvasRenderer extends Renderer {
|
|
|
761
762
|
* So, if the renderable is larger than the mask, only the intersecting part of the renderable will be visible.
|
|
762
763
|
* Mask are not preserved through renderer context save and restore.
|
|
763
764
|
* @name setMask
|
|
764
|
-
* @memberof CanvasRenderer
|
|
765
|
+
* @memberof CanvasRenderer
|
|
765
766
|
* @function
|
|
766
767
|
* @param {Rect|RoundRect|Polygon|Line|Ellipse} [mask] the shape defining the mask to be applied
|
|
768
|
+
* @param {boolean} [invert=false] either the given shape should define what is visible (default) or the opposite
|
|
767
769
|
*/
|
|
768
|
-
setMask(mask) {
|
|
770
|
+
setMask(mask, invert = false) {
|
|
769
771
|
var context = this.getContext();
|
|
770
|
-
var _x = mask.pos.x, _y = mask.pos.y;
|
|
771
772
|
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
773
|
+
if (this.maskLevel === 0) {
|
|
774
|
+
// only save context on the first mask
|
|
775
|
+
context.save();
|
|
776
|
+
context.beginPath();
|
|
777
|
+
}
|
|
775
778
|
|
|
776
779
|
// https://github.com/melonjs/melonJS/issues/648
|
|
777
|
-
if (mask instanceof
|
|
778
|
-
|
|
780
|
+
else if (mask instanceof RoundRect) {
|
|
781
|
+
context.roundRect(mask.top, mask.left, mask.width, mask.height, mask.radius);
|
|
782
|
+
} else if (mask instanceof Rect || mask instanceof Bounds) {
|
|
783
|
+
context.rect(mask.top, mask.left, mask.width, mask.height);
|
|
784
|
+
} else if (mask instanceof Ellipse) {
|
|
785
|
+
const _x = mask.pos.x, _y = mask.pos.y,
|
|
786
|
+
hw = mask.radiusV.x,
|
|
779
787
|
hh = mask.radiusV.y,
|
|
780
788
|
lx = _x - hw,
|
|
781
789
|
rx = _x + hw,
|
|
@@ -794,31 +802,41 @@ class CanvasRenderer extends Renderer {
|
|
|
794
802
|
context.bezierCurveTo(rx, ymax, xmax, by, _x, by);
|
|
795
803
|
context.bezierCurveTo(xmin, by, lx, ymax, lx, _y);
|
|
796
804
|
context.bezierCurveTo(lx, ymin, xmin, ty, _x, ty);
|
|
797
|
-
} else if (mask instanceof RoundRect) {
|
|
798
|
-
context.roundRect(_x, _y, mask.width, mask.height, mask.radius);
|
|
799
805
|
} else {
|
|
800
|
-
|
|
806
|
+
const _x = mask.pos.x, _y = mask.pos.y;
|
|
801
807
|
var point;
|
|
808
|
+
|
|
809
|
+
context.moveTo(_x + mask.points[0].x, _y + mask.points[0].y);
|
|
802
810
|
for (var i = 1; i < mask.points.length; i++) {
|
|
803
811
|
point = mask.points[i];
|
|
804
812
|
context.lineTo(_x + point.x, _y + point.y);
|
|
805
813
|
}
|
|
806
814
|
}
|
|
807
815
|
|
|
808
|
-
|
|
816
|
+
this.maskLevel++;
|
|
817
|
+
|
|
818
|
+
if (invert === true) {
|
|
819
|
+
context.closePath();
|
|
820
|
+
context.globalCompositeOperation = "destination-atop";
|
|
821
|
+
context.fill();
|
|
822
|
+
} else {
|
|
823
|
+
context.clip();
|
|
824
|
+
}
|
|
809
825
|
}
|
|
810
826
|
|
|
811
827
|
/**
|
|
812
828
|
* disable (remove) the rendering mask set through setMask.
|
|
813
829
|
* @name clearMask
|
|
814
830
|
* @see CanvasRenderer#setMask
|
|
815
|
-
* @memberof CanvasRenderer
|
|
831
|
+
* @memberof CanvasRenderer
|
|
816
832
|
* @function
|
|
817
833
|
*/
|
|
818
834
|
clearMask() {
|
|
819
|
-
this.
|
|
835
|
+
if (this.maskLevel > 0) {
|
|
836
|
+
this.maskLevel = 0;
|
|
837
|
+
this.getContext().restore();
|
|
838
|
+
}
|
|
820
839
|
}
|
|
821
|
-
|
|
822
840
|
};
|
|
823
841
|
|
|
824
842
|
export default CanvasRenderer;
|