@melonjs/debug-plugin 14.4.2

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.
@@ -0,0 +1,630 @@
1
+ /*!
2
+ * melonJS debug plugin - v14.4.2
3
+ * http://www.melonjs.org
4
+ * @melonjs/debug-plugin is licensed under the MIT License.
5
+ * http://www.opensource.org/licenses/mit-license
6
+ * @copyright (C) 2011 - 2023 Olivier Biot (AltByte Pte Ltd)
7
+ */
8
+ import { Renderable, video, utils, BitmapText, Rect, event, plugins, input, plugin, Container, Entity, Text, Camera2d, ImageLayer, game, timer, collision, Math, pool } from 'melonjs';
9
+
10
+ class Counters {
11
+ constructor() {
12
+ this.stats = [];
13
+ }
14
+ reset() {
15
+ Object.keys(this.stats).forEach((stat) => {
16
+ this.stats[stat] = 0;
17
+ });
18
+ }
19
+ inc(stat, value) {
20
+ this.stats[stat] += (value || 1);
21
+ }
22
+ get(stat) {
23
+ return this.stats[stat] || 0;
24
+ }
25
+ }
26
+
27
+ var img = "data:image/png;base64,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";
28
+
29
+ var fontDataSource = "info face=PressStart2P size=10 bold=0 italic=0 charset= unicode= stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=0,0 outline=0\ncommon lineHeight=10 base=10 scaleW=128 scaleH=128 pages=1 packed=0\npage id=0 file=\"PressStart2P.png\"\nchars count=95\nchar id=32 x=1 y=1 width=0 height=0 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15\nchar id=33 x=1 y=2 width=5 height=10 xoffset=3 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=34 x=1 y=13 width=8 height=5 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=35 x=7 y=1 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=36 x=1 y=19 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=37 x=1 y=30 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=38 x=1 y=41 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=39 x=10 y=12 width=4 height=5 xoffset=3 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=40 x=1 y=52 width=6 height=10 xoffset=3 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=41 x=1 y=63 width=6 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=42 x=1 y=74 width=10 height=8 xoffset=0 yoffset=1 xadvance=10 page=0 chnl=15\nchar id=43 x=8 y=52 width=9 height=8 xoffset=1 yoffset=1 xadvance=10 page=0 chnl=15\nchar id=44 x=8 y=61 width=5 height=5 xoffset=1 yoffset=6 xadvance=10 page=0 chnl=15\nchar id=45 x=8 y=67 width=9 height=2 xoffset=1 yoffset=4 xadvance=10 page=0 chnl=15\nchar id=46 x=14 y=61 width=4 height=4 xoffset=3 yoffset=6 xadvance=10 page=0 chnl=15\nchar id=47 x=12 y=18 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=48 x=18 y=1 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=49 x=12 y=29 width=9 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=50 x=12 y=40 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=51 x=22 y=29 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=52 x=23 y=12 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=53 x=29 y=1 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=54 x=1 y=83 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=55 x=1 y=94 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=56 x=1 y=105 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=57 x=1 y=116 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=58 x=18 y=51 width=4 height=8 xoffset=3 yoffset=1 xadvance=10 page=0 chnl=15\nchar id=59 x=12 y=70 width=5 height=9 xoffset=1 yoffset=1 xadvance=10 page=0 chnl=15\nchar id=60 x=12 y=80 width=8 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=61 x=23 y=23 width=10 height=5 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=62 x=18 y=66 width=8 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=63 x=23 y=40 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=64 x=33 y=29 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=65 x=23 y=51 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=66 x=34 y=12 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=67 x=40 y=1 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=68 x=12 y=91 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=69 x=21 y=77 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=70 x=27 y=62 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=71 x=34 y=40 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=72 x=34 y=51 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=73 x=44 y=23 width=9 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=74 x=45 y=12 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=75 x=51 y=1 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=76 x=12 y=102 width=9 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=77 x=12 y=113 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=78 x=22 y=102 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=79 x=23 y=88 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=80 x=32 y=73 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=81 x=38 y=62 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=82 x=23 y=113 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=83 x=33 y=99 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=84 x=34 y=84 width=9 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=85 x=43 y=73 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=86 x=34 y=110 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=87 x=44 y=84 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=88 x=44 y=95 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=89 x=45 y=106 width=9 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=90 x=45 y=117 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=91 x=45 y=34 width=6 height=10 xoffset=3 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=92 x=45 y=45 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=93 x=52 y=34 width=6 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=94 x=34 y=23 width=8 height=4 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=95 x=34 y=121 width=10 height=2 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=15\nchar id=96 x=15 y=12 width=4 height=4 xoffset=4 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=97 x=54 y=23 width=10 height=7 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=98 x=56 y=12 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=99 x=62 y=1 width=10 height=7 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=100 x=49 y=56 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=101 x=56 y=45 width=10 height=8 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=102 x=59 y=31 width=9 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=103 x=54 y=67 width=10 height=9 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=104 x=60 y=54 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=105 x=67 y=42 width=9 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=106 x=67 y=9 width=8 height=11 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=107 x=69 y=21 width=10 height=10 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=108 x=76 y=1 width=9 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=109 x=76 y=12 width=10 height=8 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=110 x=69 y=32 width=10 height=8 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=111 x=86 y=1 width=10 height=8 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=112 x=97 y=1 width=10 height=9 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=113 x=108 y=1 width=10 height=9 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=114 x=87 y=10 width=9 height=8 xoffset=1 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=115 x=97 y=11 width=10 height=7 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=116 x=108 y=11 width=9 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=117 x=87 y=19 width=10 height=7 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=118 x=98 y=19 width=9 height=8 xoffset=1 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=119 x=80 y=27 width=10 height=7 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=120 x=108 y=22 width=10 height=8 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=121 x=91 y=28 width=10 height=9 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=122 x=80 y=35 width=10 height=7 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=123 x=118 y=11 width=6 height=10 xoffset=3 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=124 x=102 y=28 width=4 height=10 xoffset=4 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=125 x=119 y=22 width=6 height=10 xoffset=1 yoffset=0 xadvance=10 page=0 chnl=15\nchar id=126 x=91 y=38 width=10 height=5 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\nchar id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=15\n";
30
+
31
+ const DEBUG_HEIGHT = 50;
32
+
33
+ class DebugPanel extends Renderable {
34
+ constructor(debugToggle = input.KEY.S) {
35
+ // call the super constructor
36
+ super(0, 0, video.renderer.getWidth(), DEBUG_HEIGHT );
37
+
38
+ // enable collision and event detection
39
+ this.isKinematic = false;
40
+
41
+ // to hold the debug CheckBox
42
+ // zone and status
43
+ this.checkbox = {};
44
+
45
+ // Useful counters
46
+ this.counters = new Counters([
47
+ "shapes",
48
+ "sprites",
49
+ "velocity",
50
+ "bounds",
51
+ "children"
52
+ ]);
53
+
54
+ // for z ordering
55
+ // make it ridiculously high
56
+ this.pos.z = Infinity;
57
+
58
+ // visibility flag
59
+ this.visible = false;
60
+
61
+ // frame update time in ms
62
+ this.frameUpdateTime = 0;
63
+
64
+ // frame draw time in ms
65
+ this.frameDrawTime = 0;
66
+
67
+ // set the object GUID value
68
+ this.GUID = "debug-" + utils.createGUID();
69
+
70
+ // set the object entity name
71
+ this.name = "debugPanel";
72
+
73
+ // the debug panel version
74
+ this.version = "14.4.2";
75
+
76
+ // persistent
77
+ this.isPersistent = true;
78
+
79
+ // a floating object
80
+ this.floating = true;
81
+
82
+ // renderable
83
+ this.isRenderable = true;
84
+
85
+ // always update, even when not visible
86
+ this.alwaysUpdate = true;
87
+
88
+ // WebGL/Canvas compatibility
89
+ this.canvas = video.createCanvas(this.width, this.height, true);
90
+
91
+ // create a default font, with fixed char width
92
+ this.font_size = 10;
93
+ this.mod = 2;
94
+ if (this.width < 500) {
95
+ this.font_size = 7;
96
+ this.mod = this.mod * (this.font_size / 10);
97
+ }
98
+
99
+ // create the bitmapfont
100
+ var fontImage = new Image();
101
+ fontImage.src = img;
102
+
103
+ this.font = new BitmapText(0, 0, {
104
+ fontData: fontDataSource,
105
+ font: fontImage
106
+ });
107
+ this.font.name = "debugPanelFont";
108
+
109
+ // clickable areas
110
+ var hash = utils.getUriFragment();
111
+ var size = 10 * this.mod;
112
+ this.checkbox.renderHitBox = new Rect(250, 2, size, size);
113
+ this.checkbox.renderHitBox.selected = hash.hitbox || false;
114
+ this.checkbox.renderVelocity = new Rect(250, 17, size, size);
115
+ this.checkbox.renderVelocity.selected = hash.velocity || false;
116
+ this.checkbox.renderQuadTree = new Rect(410, 2, size, size);
117
+ this.checkbox.renderVelocity.selected = hash.quadtree || false;
118
+
119
+ // add some keyboard shortcuts
120
+ this.debugToggle = debugToggle;
121
+ this.keyHandler = event.on(event.KEYDOWN, (action, keyCode) => {
122
+ if (keyCode === this.debugToggle) {
123
+ plugins.debugPanel.toggle();
124
+ }
125
+ });
126
+
127
+ // some internal string/length
128
+ this.help_str = "["+String.fromCharCode(32 + this.debugToggle)+"]show/hide";
129
+ this.help_str_len = this.font.measureText(this.help_str).width;
130
+ this.fps_str_len = this.font.measureText("00/00 fps").width;
131
+ this.memoryPositionX = 325 * this.mod;
132
+
133
+ // resize the panel if the browser is resized
134
+ event.on(event.CANVAS_ONRESIZE, (w) => {
135
+ this.resize(w, DEBUG_HEIGHT);
136
+ });
137
+
138
+ // few variables to keep track of time
139
+ this.frameUpdateStartTime = 0;
140
+ this.frameDrawStartTime = 0;
141
+ this.frameUpdateTime = 0;
142
+ this.frameDrawTime = 0;
143
+
144
+ event.on(event.GAME_BEFORE_UPDATE, (time) => {
145
+ this.frameUpdateStartTime = time;
146
+ });
147
+ event.on(event.GAME_AFTER_UPDATE, (time) => {
148
+ this.frameUpdateTime = time - this.frameUpdateStartTime;
149
+ });
150
+
151
+ event.on(event.GAME_BEFORE_DRAW, (time) => {
152
+ this.frameDrawStartTime = time;
153
+ this.counters.reset();
154
+ });
155
+ event.on(event.GAME_AFTER_DRAW, (time) => {
156
+ this.frameDrawTime = time - this.frameDrawStartTime;
157
+ });
158
+
159
+
160
+ this.anchorPoint.set(0, 0);
161
+
162
+ //patch patch patch !
163
+ this.patchSystemFn();
164
+ }
165
+
166
+ /**
167
+ * patch system fn to draw debug information
168
+ */
169
+ patchSystemFn() {
170
+ var _this = this;
171
+
172
+ // patch renderable.js
173
+ plugin.patch(Renderable, "postDraw", function (renderer) {
174
+
175
+ // call the original Renderable.postDraw function
176
+ this._patched.apply(this, arguments);
177
+
178
+ // increment the sprites counter
179
+ if (typeof this.image !== "undefined") {
180
+ _this.counters.inc("sprites");
181
+ }
182
+
183
+ // increment the bound counter
184
+ _this.counters.inc("bounds");
185
+
186
+ // increment the children counter
187
+ if (this instanceof Container) {
188
+ _this.counters.inc("children");
189
+ }
190
+
191
+ // don't do anything else if the panel is hidden
192
+ if (_this.visible) {
193
+
194
+ // omit following object as they are patched later through different methods
195
+ // XXX TODO: make this patched method more generic at Renderable level
196
+ if (!(this instanceof Entity) && !(this.ancestor instanceof Entity) && !(this instanceof Text) &&
197
+ !(this instanceof BitmapText) && !(this instanceof Camera2d)
198
+ && !(this instanceof ImageLayer)) {
199
+
200
+ // draw the renderable bounding box
201
+ if (_this.checkbox.renderHitBox.selected && this.getBounds().isFinite()) {
202
+
203
+ if (typeof this.ancestor !== "undefined") {
204
+ var absolutePosition = this.ancestor.getAbsolutePosition();
205
+
206
+ renderer.save();
207
+
208
+ // if this object of this renderable parent is not the root container
209
+ if (!this.root && !this.ancestor.root && this.ancestor.floating) {
210
+ renderer.translate(
211
+ -absolutePosition.x,
212
+ -absolutePosition.y
213
+ );
214
+ }
215
+ }
216
+
217
+ renderer.setColor("green");
218
+ renderer.stroke(this.getBounds());
219
+
220
+ // the sprite mask if defined
221
+ if (typeof this.mask !== "undefined") {
222
+ renderer.setColor("orange");
223
+ renderer.stroke(this.mask);
224
+ }
225
+
226
+ if (typeof this.body !== "undefined") {
227
+ var bounds = this.getBounds();
228
+ renderer.translate(bounds.x, bounds.y);
229
+
230
+ renderer.setColor("orange");
231
+ renderer.stroke(this.body.getBounds());
232
+
233
+ // draw all defined shapes
234
+ renderer.setColor("red");
235
+ for (var i = this.body.shapes.length, shape; i--, (shape = this.body.shapes[i]);) {
236
+ renderer.stroke(shape);
237
+ _this.counters.inc("shapes");
238
+ }
239
+ renderer.translate(-bounds.x, -bounds.y);
240
+ }
241
+
242
+ if (typeof this.ancestor !== "undefined") {
243
+ renderer.restore();
244
+ }
245
+ }
246
+ }
247
+ }
248
+ });
249
+
250
+ plugin.patch(BitmapText, "draw", function (renderer) {
251
+ // call the original Sprite.draw function
252
+ this._patched.apply(this, arguments);
253
+
254
+ // draw the font rectangle
255
+ if (_this.visible && _this.checkbox.renderHitBox.selected && this.name !== "debugPanelFont") {
256
+ var bounds = this.getBounds();
257
+
258
+ if (typeof this.ancestor !== "undefined") {
259
+ var ax = this.anchorPoint.x * bounds.width,
260
+ ay = this.anchorPoint.y * bounds.height;
261
+ // translate back as the bounds position
262
+ // is already adjusted to the anchor Point
263
+ renderer.save();
264
+ renderer.translate(ax, ay);
265
+ }
266
+
267
+ renderer.setColor("green");
268
+ renderer.stroke(bounds);
269
+
270
+ if (typeof this.ancestor !== "undefined") {
271
+ renderer.restore();
272
+ }
273
+ }
274
+ });
275
+
276
+ // patch text.js
277
+ plugin.patch(Text, "draw", function (renderer) {
278
+ // call the original Text.draw function
279
+ this._patched.apply(this, arguments);
280
+
281
+ if (_this.visible && _this.checkbox.renderHitBox.selected) {
282
+ var bounds = this.getBounds();
283
+
284
+ if (typeof this.ancestor !== "undefined") {
285
+ var absolutePosition = this.ancestor.getAbsolutePosition();
286
+
287
+ renderer.save();
288
+
289
+ // if this object of this renderable parent is not the root container
290
+ if (!this.root && !this.ancestor.root && this.ancestor.floating) {
291
+ renderer.translate(
292
+ -absolutePosition.x,
293
+ -absolutePosition.y
294
+ );
295
+ }
296
+ }
297
+
298
+ renderer.setColor("green");
299
+ renderer.stroke(bounds);
300
+ }
301
+ });
302
+
303
+ // patch entities.js
304
+ plugin.patch(Entity, "postDraw", function (renderer) {
305
+ // don't do anything else if the panel is hidden
306
+ if (_this.visible) {
307
+
308
+ // check if debug mode is enabled
309
+ if (_this.checkbox.renderHitBox.selected) {
310
+
311
+ renderer.save();
312
+
313
+
314
+ if (typeof this.ancestor !== "undefined") {
315
+ var absolutePosition = this.ancestor.getAbsolutePosition();
316
+
317
+ // if this object of this renderable parent is not the root container
318
+ if (!this.root && !this.ancestor.root && this.ancestor.floating) {
319
+ renderer.translate(
320
+ -absolutePosition.x,
321
+ -absolutePosition.y
322
+ );
323
+ }
324
+ }
325
+
326
+ if (this.renderable instanceof Renderable) {
327
+ renderer.setColor("green");
328
+ renderer.stroke(this.renderable.getBounds());
329
+ }
330
+
331
+ renderer.translate(
332
+ this.body.getBounds().x,
333
+ this.body.getBounds().y
334
+ );
335
+
336
+ renderer.translate(
337
+ -this.anchorPoint.x * this.body.getBounds().width,
338
+ -this.anchorPoint.y * this.body.getBounds().height
339
+ );
340
+
341
+ // draw the bounding rect shape
342
+ renderer.setColor("orange");
343
+ renderer.stroke(this.body.getBounds());
344
+
345
+ // draw all defined shapes
346
+ renderer.setColor("red");
347
+ for (var i = this.body.shapes.length, shape; i--, (shape = this.body.shapes[i]);) {
348
+ renderer.stroke(shape);
349
+ _this.counters.inc("shapes");
350
+ }
351
+
352
+ renderer.restore();
353
+
354
+ }
355
+
356
+ if (_this.checkbox.renderVelocity.selected && (this.body.vel.x || this.body.vel.y)) {
357
+ var bounds = this.body.getBounds();
358
+ var hWidth = bounds.width / 2;
359
+ var hHeight = bounds.height / 2;
360
+
361
+ renderer.save();
362
+ renderer.setLineWidth(1);
363
+
364
+ renderer.setColor("blue");
365
+ renderer.translate(0, -hHeight);
366
+ renderer.strokeLine(0, 0, ~~(this.body.vel.x * hWidth), ~~(this.body.vel.y * hHeight));
367
+ _this.counters.inc("velocity");
368
+
369
+ renderer.restore();
370
+ }
371
+ }
372
+ // call the original Entity.postDraw function
373
+ this._patched.apply(this, arguments);
374
+ });
375
+ }
376
+
377
+ /**
378
+ * show the debug panel
379
+ */
380
+ show() {
381
+ if (!this.visible) {
382
+ // add the debug panel to the game world
383
+ game.world.addChild(this, Infinity);
384
+ // register a mouse event for the checkboxes
385
+ input.registerPointerEvent("pointerdown", this, this.onClick.bind(this));
386
+ // mark it as visible
387
+ this.visible = true;
388
+ // force repaint
389
+ game.repaint();
390
+ }
391
+ }
392
+
393
+ /**
394
+ * hide the debug panel
395
+ */
396
+ hide() {
397
+ if (this.visible) {
398
+ // release the mouse event for the checkboxes
399
+ input.releasePointerEvent("pointerdown", this);
400
+ // remove the debug panel from the game world
401
+ game.world.removeChild(this, true);
402
+ // mark it as invisible
403
+ this.visible = false;
404
+ // force repaint
405
+ game.repaint();
406
+ }
407
+ }
408
+
409
+ update() {
410
+ // update the FPS counter
411
+ timer.countFPS();
412
+
413
+ return this.visible;
414
+ }
415
+
416
+ onClick(e) {
417
+ // check the clickable areas
418
+ if (this.checkbox.renderHitBox.contains(e.gameX, e.gameY)) {
419
+ this.checkbox.renderHitBox.selected = !this.checkbox.renderHitBox.selected;
420
+ } else if (this.checkbox.renderVelocity.contains(e.gameX, e.gameY)) {
421
+ // does nothing for now, since velocity is
422
+ // rendered together with hitboxes (is a global debug flag required?)
423
+ this.checkbox.renderVelocity.selected = !this.checkbox.renderVelocity.selected;
424
+ } else if (this.checkbox.renderQuadTree.contains(e.gameX, e.gameY)) {
425
+ this.checkbox.renderQuadTree.selected = !this.checkbox.renderQuadTree.selected;
426
+ }
427
+ // force repaint
428
+ game.repaint();
429
+ }
430
+
431
+ drawQuadTreeNode(renderer, node) {
432
+ var bounds = node.bounds;
433
+
434
+ // draw the current bounds
435
+ if (node.nodes.length === 0) {
436
+ // cap the alpha value to 0.4 maximum
437
+ var _alpha = (node.objects.length * 0.4) / collision.maxChildren;
438
+ if (_alpha > 0.0) {
439
+ renderer.save();
440
+ renderer.setColor("rgba(255,0,0," + _alpha + ")");
441
+ renderer.fillRect(bounds.left, bounds.top, bounds.width, bounds.height);
442
+ renderer.restore();
443
+ }
444
+ } else {
445
+ //has subnodes? drawQuadtree them!
446
+ for (var i = 0; i < node.nodes.length; i++) {
447
+ this.drawQuadTreeNode(renderer, node.nodes[i]);
448
+ }
449
+ }
450
+ }
451
+
452
+ drawQuadTree(renderer) {
453
+ var x = game.viewport.pos.x;
454
+ var y = game.viewport.pos.y;
455
+
456
+ renderer.translate(-x, -y);
457
+
458
+ this.drawQuadTreeNode(renderer, game.world.broadphase);
459
+
460
+ renderer.translate(x, y);
461
+ }
462
+
463
+ /** @private */
464
+ drawMemoryGraph(renderer, endX) {
465
+ if (window && window.performance && window.performance.memory) {
466
+ var usedHeap = Math.round(window.performance.memory.usedJSHeapSize / 1048576, 2);
467
+ var totalHeap = Math.round(window.performance.memory.totalJSHeapSize / 1048576, 2);
468
+ var maxLen = ~~(endX - this.memoryPositionX - 5);
469
+ var len = maxLen * (usedHeap / totalHeap);
470
+
471
+ renderer.setColor("#0065AD");
472
+ renderer.fillRect(this.memoryPositionX, 0, maxLen, 20);
473
+ renderer.setColor("#3AA4F0");
474
+ renderer.fillRect(this.memoryPositionX + 1, 1, len - 1, 17);
475
+
476
+ this.font.draw(renderer, "Heap : " + usedHeap + "/" + totalHeap + " MB", this.memoryPositionX + 5, 2 * this.mod);
477
+ } else {
478
+ // Heap Memory information not available
479
+ this.font.draw(renderer, "Heap : ??/?? MB", this.memoryPositionX, 2 * this.mod);
480
+ }
481
+ this.font.draw(renderer, "Pool : " + pool.getInstanceCount(), this.memoryPositionX, 10 * this.mod);
482
+ }
483
+
484
+ draw(renderer) {
485
+ renderer.save();
486
+
487
+ // draw the QuadTree (before the panel)
488
+ if (this.checkbox.renderQuadTree.selected === true) {
489
+ this.drawQuadTree(renderer);
490
+ }
491
+
492
+ // draw the panel
493
+ renderer.setGlobalAlpha(0.5);
494
+ renderer.setColor("black");
495
+ renderer.fillRect(
496
+ this.left, this.top,
497
+ this.width, this.height
498
+ );
499
+ renderer.setGlobalAlpha(1.0);
500
+ renderer.setColor("white");
501
+
502
+ this.font.textAlign = "left";
503
+
504
+ this.font.draw(renderer, "#objects : " + game.world.children.length, 5 * this.mod, 2 * this.mod);
505
+ this.font.draw(renderer, "#draws : " + game.world.drawCount, 5 * this.mod, 10 * this.mod);
506
+
507
+ // debug checkboxes
508
+ this.font.draw(renderer, "?hitbox [" + (this.checkbox.renderHitBox.selected ? "x" : " ") + "]", 75 * this.mod, 2 * this.mod);
509
+ this.font.draw(renderer, "?velocity [" + (this.checkbox.renderVelocity.selected ? "x" : " ") + "]", 75 * this.mod, 10 * this.mod);
510
+
511
+ this.font.draw(renderer, "?QuadTree [" + (this.checkbox.renderQuadTree.selected ? "x" : " ") + "]", 150 * this.mod, 2 * this.mod);
512
+
513
+ // draw the update duration
514
+ this.font.draw(renderer, "Update : " + this.frameUpdateTime.toFixed(2) + " ms", 225 * this.mod, 2 * this.mod);
515
+ // draw the draw duration
516
+ this.font.draw(renderer, "Draw : " + this.frameDrawTime.toFixed(2) + " ms", 225 * this.mod, 10 * this.mod);
517
+
518
+
519
+ // Draw color code hints (not supported with bitmapfont)
520
+ //this.font.fillStyle.copy("red");
521
+ this.font.draw(renderer, "Shapes : " + this.counters.get("shapes"), 5 * this.mod, 17 * this.mod);
522
+
523
+ //this.font.fillStyle.copy("green");
524
+ this.font.draw(renderer, "Sprites : " + this.counters.get("sprites"), 75 * this.mod, 17 * this.mod);
525
+
526
+ //this.font.fillStyle.copy("blue");
527
+ this.font.draw(renderer, "Velocity : " + this.counters.get("velocity"), 150 * this.mod, 17 * this.mod);
528
+
529
+ //this.font.fillStyle.copy("orange");
530
+ this.font.draw(renderer, "Bounds : " + this.counters.get("bounds"), 225 * this.mod, 17 * this.mod);
531
+
532
+ //this.font.fillStyle.copy("purple");
533
+ this.font.draw(renderer, "Children : " + this.counters.get("children"), 325 * this.mod, 17 * this.mod);
534
+
535
+ // Reset font style
536
+ //this.font.setFont("courier", this.font_size, "white");
537
+
538
+ // draw the memory heap usage
539
+ var endX = this.width - 5;
540
+ this.drawMemoryGraph(renderer, endX - this.help_str_len);
541
+
542
+ this.font.textAlign = "right";
543
+
544
+ // some help string
545
+ this.font.draw(renderer, this.help_str, endX, 17 * this.mod);
546
+
547
+ //fps counter
548
+ var fps_str = timer.fps + "/" + timer.maxfps + " fps";
549
+ this.font.draw(renderer, fps_str, endX, 2 * this.mod);
550
+
551
+ renderer.restore();
552
+ }
553
+
554
+ onDestroyEvent() {
555
+ // hide the panel
556
+ this.hide();
557
+ // unbind keys event
558
+ input.unbindKey(this.toggleKey);
559
+ }
560
+ }
561
+
562
+ /**
563
+ * @classdesc
564
+ * a simple debug panel plugin <br>
565
+ * <img src="images/debugPanel.png"/> <br>
566
+ * <b>usage : </b><br>
567
+ * &bull; upon loading the debug panel, it will be automatically registered under me.plugins.debugPanel <br>
568
+ * &bull; you can then press the default "s" key to show or hide the panel, or use me.plugins.debugPanel.show() and me.plugins.debugPanel.show(), or add #debug as a parameter to your URL e.g. http://myURL/index.html#debug <br>
569
+ * &bull; default key can be configured using the following parameters in the url : e.g. http://myURL/index.html#debugToggleKey=d <br>
570
+ * <b>the debug panel provides the following information : </b><br>
571
+ * &bull; amount of total objects currently active in the current stage <br>
572
+ * &bull; amount of draws operation <br>
573
+ * &bull; amount of body shape (for collision) <br>
574
+ * &bull; amount of bounding box <br>
575
+ * &bull; amount of sprites objects <br>
576
+ * &bull; amount of objects currently inactive in the the object pool <br>
577
+ * &bull; memory usage (Heap Memory information is only available under Chrome) <br>
578
+ * &bull; frame update time (in ms) <br>
579
+ * &bull; frame draw time (in ms) <br>
580
+ * &bull; current fps rate vs target fps <br>
581
+ * additionally, using the checkbox in the panel it is also possible to display : <br>
582
+ * &bull; the hitbox or bounding box for all objects <br>
583
+ * &bull; current velocity vector <br>
584
+ * &bull; quadtree spatial visualization <br>
585
+ * @augments plugin.Base
586
+ */
587
+ class DebugPanelPlugin extends plugin.Base {
588
+
589
+ constructor(debugToggle) {
590
+ // call the super constructor
591
+ super();
592
+
593
+ // minimum melonJS version expected
594
+ this.version = "14.5.0";
595
+
596
+ this.panel = new DebugPanel(debugToggle);
597
+
598
+ // if "#debug" is present in the URL
599
+ if (utils.getUriFragment().debug === true) {
600
+ this.show();
601
+ } // else keep it hidden
602
+ }
603
+
604
+ /**
605
+ * show the debug panel
606
+ */
607
+ show() {
608
+ this.panel.show();
609
+ }
610
+
611
+ /**
612
+ * hide the debug panel
613
+ */
614
+ hide() {
615
+ this.panel.hide();
616
+ }
617
+
618
+ /**
619
+ * toggle the debug panel visibility state
620
+ */
621
+ toggle() {
622
+ if (this.panel.visible) {
623
+ this.panel.hide();
624
+ } else {
625
+ this.panel.show();
626
+ }
627
+ }
628
+ }
629
+
630
+ export { DebugPanelPlugin };