littlejsengine 1.15.8 → 1.16.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.
- package/dist/littlejs.d.ts +87 -85
- package/dist/littlejs.esm.js +578 -532
- package/dist/littlejs.esm.min.js +1 -1
- package/dist/littlejs.js +562 -521
- package/dist/littlejs.min.js +1 -1
- package/dist/littlejs.release.js +485 -444
- package/examples/box2d/game.js +2 -2
- package/examples/breakout/game.js +3 -3
- package/examples/electron/game.js +1 -2
- package/examples/electron/index.html +2 -2
- package/examples/htmlMenu/game.js +0 -1
- package/examples/index.html +1 -1
- package/examples/module/game.js +1 -2
- package/examples/particles/index.html +1 -1
- package/examples/platformer/game.js +11 -4
- package/examples/puzzle/game.js +2 -2
- package/examples/shorts/base.html +3 -4
- package/examples/shorts/box2dPool.js +2 -2
- package/examples/shorts/empty.js +1 -1
- package/examples/shorts/{systemFont.js → fontImage.js} +3 -3
- package/examples/shorts/fps.js +1 -1
- package/examples/shorts/helloWorld.js +2 -2
- package/examples/shorts/nineSlice.js +2 -2
- package/examples/shorts/slidingPuzzle.js +1 -1
- package/examples/shorts/uiSystem.js +1 -1
- package/examples/starter/game.js +1 -2
- package/examples/starter/index.html +2 -3
- package/examples/stress/index.html +1 -1
- package/examples/typescript/game.js +1 -2
- package/examples/typescript/game.ts +1 -2
- package/examples/uiSystem/game.js +4 -7
- package/package.json +1 -1
- package/plugins/box2d.js +8 -8
- package/plugins/drawUtilities.js +6 -6
- package/plugins/postProcess.js +13 -20
- package/plugins/uiSystem.js +15 -3
- package/reference.md +4 -6
- package/src/engine.js +240 -53
- package/src/engineAudio.js +3 -3
- package/src/engineBuild.js +0 -1
- package/src/engineDebug.js +78 -78
- package/src/engineDraw.js +107 -109
- package/src/engineExport.js +16 -11
- package/src/engineInput.js +14 -2
- package/src/engineMedals.js +3 -3
- package/src/engineObject.js +4 -2
- package/src/engineParticles.js +8 -6
- package/src/engineRelease.js +1 -1
- package/src/engineSettings.js +44 -30
- package/src/engineTileLayer.js +6 -6
- package/src/engineUtilities.js +2 -10
- package/src/engineWebGL.js +6 -5
- package/src/engineSplash.js +0 -173
package/reference.md
CHANGED
|
@@ -145,7 +145,6 @@ drawCanvas2D(pos, size, angle=0, mirror, drawFunction, screenSpace, context)
|
|
|
145
145
|
|
|
146
146
|
// Text functions
|
|
147
147
|
drawText(text, pos, size=1, color=WHITE, lineWidth=0, lineColor=BLACK)
|
|
148
|
-
drawTextOverlay(text, pos, size=1, color=WHITE, lineWidth=0, lineColor=BLACK)
|
|
149
148
|
drawTextScreen(text, pos, size=1, color=WHITE, lineWidth=0, lineColor=BLACK)
|
|
150
149
|
|
|
151
150
|
// Utility drawing functions
|
|
@@ -173,7 +172,6 @@ TextureInfo.glTexture // WebGL texture
|
|
|
173
172
|
FontImage(image, tileSize=(8,8), paddingSize=(0,1)) // Create an image font
|
|
174
173
|
FontImage.drawText(text, pos, scale, center) // Draw text in world space
|
|
175
174
|
FontImage.drawTextScreen(text, pos, scale, center) // Draw text in screen space
|
|
176
|
-
FontImage.drawTextOverlay(text, pos, scale, center) // Draw text to overlay canvas
|
|
177
175
|
|
|
178
176
|
// Camera settings
|
|
179
177
|
cameraPos = (0,0) // Position of camera in world space
|
|
@@ -193,8 +191,8 @@ showSplashScreen = false // Show the LittleJS splash screen on startup
|
|
|
193
191
|
glEnable = true // Enable fast WebGL rendering
|
|
194
192
|
|
|
195
193
|
// Tile sheet settings
|
|
196
|
-
|
|
197
|
-
|
|
194
|
+
tileDefaultSize = (16,16) // Default size of tiles in pixels
|
|
195
|
+
tileDefaultBleed = .3 // How much smaller to draw tiles to prevent bleeding
|
|
198
196
|
```
|
|
199
197
|
|
|
200
198
|
## LittleJS Audio System
|
|
@@ -440,8 +438,8 @@ debugSaveDataURL(dataURL, filename) // Save url to a file
|
|
|
440
438
|
debug // Is debug enabled?
|
|
441
439
|
debugPointSize = .5 // Size to render debug points by default
|
|
442
440
|
debugKey = 'Escape' // Key code used to toggle debug mode
|
|
443
|
-
debugOverlay //
|
|
444
|
-
|
|
441
|
+
debugOverlay // Is the debug overlay is active?
|
|
442
|
+
debugWatermark // Should watermark with FPS appear in debug mode?
|
|
445
443
|
```
|
|
446
444
|
|
|
447
445
|
[LittleJS Engine](https://github.com/KilledByAPixel/LittleJS) Copyright 2021 Frank Force
|
package/src/engine.js
CHANGED
|
@@ -30,7 +30,7 @@ const engineName = 'LittleJS';
|
|
|
30
30
|
* @type {string}
|
|
31
31
|
* @default
|
|
32
32
|
* @memberof Engine */
|
|
33
|
-
const engineVersion = '1.
|
|
33
|
+
const engineVersion = '1.16.1';
|
|
34
34
|
|
|
35
35
|
/** Frames per second to update
|
|
36
36
|
* @type {number}
|
|
@@ -177,8 +177,7 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
|
|
|
177
177
|
mainCanvasSize = vec2(mainCanvas.width, mainCanvas.height);
|
|
178
178
|
|
|
179
179
|
// disable smoothing for pixel art
|
|
180
|
-
|
|
181
|
-
mainContext.imageSmoothingEnabled = !tilesPixelated;
|
|
180
|
+
mainContext.imageSmoothingEnabled = !tilesPixelated;
|
|
182
181
|
|
|
183
182
|
// setup gl rendering if enabled
|
|
184
183
|
glPreRender();
|
|
@@ -190,7 +189,7 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
|
|
|
190
189
|
// update time keeping
|
|
191
190
|
let frameTimeDeltaMS = frameTimeMS - frameTimeLastMS;
|
|
192
191
|
frameTimeLastMS = frameTimeMS;
|
|
193
|
-
if (debug ||
|
|
192
|
+
if (debug || debugWatermark)
|
|
194
193
|
averageFPS = lerp(averageFPS, 1e3/(frameTimeDeltaMS||1), .05);
|
|
195
194
|
const debugSpeedUp = debug && keyIsDown('Equal'); // +
|
|
196
195
|
const debugSpeedDown = debug && keyIsDown('Minus'); // -
|
|
@@ -218,6 +217,8 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
|
|
|
218
217
|
debugUpdate();
|
|
219
218
|
gameUpdatePost();
|
|
220
219
|
inputUpdatePost();
|
|
220
|
+
if (debugVideoCaptureIsActive())
|
|
221
|
+
renderFrame();
|
|
221
222
|
}
|
|
222
223
|
else
|
|
223
224
|
{
|
|
@@ -281,19 +282,19 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
|
|
|
281
282
|
glFlush();
|
|
282
283
|
debugVideoCaptureUpdate();
|
|
283
284
|
|
|
284
|
-
if (
|
|
285
|
+
if (debugWatermark && !debugVideoCaptureIsActive())
|
|
285
286
|
{
|
|
286
287
|
// update fps display
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
288
|
+
mainContext.textAlign = 'right';
|
|
289
|
+
mainContext.textBaseline = 'top';
|
|
290
|
+
mainContext.font = '1em monospace';
|
|
291
|
+
mainContext.fillStyle = '#000';
|
|
291
292
|
const text = engineName + ' ' + 'v' + engineVersion + ' / '
|
|
292
293
|
+ drawCount + ' / ' + engineObjects.length + ' / ' + averageFPS.toFixed(1)
|
|
293
294
|
+ (glEnable ? ' GL' : ' 2D') ;
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
295
|
+
mainContext.fillText(text, mainCanvas.width-3, 3);
|
|
296
|
+
mainContext.fillStyle = '#fff';
|
|
297
|
+
mainContext.fillText(text, mainCanvas.width-2, 2);
|
|
297
298
|
}
|
|
298
299
|
drawCount = 0;
|
|
299
300
|
}
|
|
@@ -305,42 +306,60 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
|
|
|
305
306
|
|
|
306
307
|
if (canvasFixedSize.x)
|
|
307
308
|
{
|
|
308
|
-
//
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
const
|
|
314
|
-
const
|
|
315
|
-
|
|
316
|
-
|
|
309
|
+
// set canvas fixed size
|
|
310
|
+
mainCanvasSize = canvasFixedSize.copy();
|
|
311
|
+
|
|
312
|
+
// fit to window using css width and height
|
|
313
|
+
const innerAspect = innerWidth / innerHeight;
|
|
314
|
+
const fixedAspect = canvasFixedSize.x / canvasFixedSize.y;
|
|
315
|
+
const w = innerAspect < fixedAspect ? '100%' : '';
|
|
316
|
+
const h = innerAspect < fixedAspect ? '' : '100%';
|
|
317
|
+
mainCanvas.style.width = w;
|
|
318
|
+
mainCanvas.style.height = h;
|
|
319
|
+
if (glCanvas)
|
|
320
|
+
{
|
|
321
|
+
glCanvas.style.width = w;
|
|
322
|
+
glCanvas.style.height = h;
|
|
323
|
+
}
|
|
317
324
|
}
|
|
318
325
|
else
|
|
319
326
|
{
|
|
320
|
-
//
|
|
321
|
-
|
|
322
|
-
|
|
327
|
+
// get main canvas size based on window size
|
|
328
|
+
mainCanvasSize.x = min(innerWidth, canvasMaxSize.x);
|
|
329
|
+
mainCanvasSize.y = min(innerHeight, canvasMaxSize.y);
|
|
330
|
+
|
|
331
|
+
// responsive aspect ratio with native resolution
|
|
332
|
+
const innerAspect = innerWidth / innerHeight;
|
|
333
|
+
ASSERT(canvasMinAspect <= canvasMaxAspect);
|
|
334
|
+
if (canvasMaxAspect && innerAspect > canvasMaxAspect)
|
|
335
|
+
{
|
|
336
|
+
// full height
|
|
337
|
+
const w = mainCanvasSize.y * canvasMaxAspect | 0;
|
|
338
|
+
mainCanvasSize.x = min(w, canvasMaxSize.x);
|
|
339
|
+
}
|
|
340
|
+
else if (innerAspect < canvasMinAspect)
|
|
341
|
+
{
|
|
342
|
+
// full width
|
|
343
|
+
const h = mainCanvasSize.x / canvasMinAspect | 0;
|
|
344
|
+
mainCanvasSize.y = min(h, canvasMaxSize.y);
|
|
345
|
+
}
|
|
323
346
|
}
|
|
324
347
|
|
|
348
|
+
// clear main canvas and set size
|
|
349
|
+
mainCanvas.width = mainCanvasSize.x;
|
|
350
|
+
mainCanvas.height = mainCanvasSize.y;
|
|
351
|
+
|
|
325
352
|
// apply the clear color to main canvas
|
|
326
|
-
if (canvasClearColor.a > 0)
|
|
353
|
+
if (canvasClearColor.a > 0 && !glEnable)
|
|
327
354
|
{
|
|
328
355
|
mainContext.fillStyle = canvasClearColor.toString();
|
|
329
356
|
mainContext.fillRect(0, 0, mainCanvasSize.x, mainCanvasSize.y);
|
|
330
357
|
mainContext.fillStyle = BLACK.toString();
|
|
331
358
|
}
|
|
332
359
|
|
|
333
|
-
// clear overlay canvas and set size
|
|
334
|
-
overlayCanvas.width = mainCanvas.width;
|
|
335
|
-
overlayCanvas.height = mainCanvas.height;
|
|
336
|
-
|
|
337
|
-
// save canvas size
|
|
338
|
-
mainCanvasSize = vec2(mainCanvas.width, mainCanvas.height);
|
|
339
|
-
|
|
340
360
|
// set default line join and cap
|
|
341
|
-
|
|
342
|
-
mainContext.
|
|
343
|
-
mainContext.lineCap = overlayContext.lineCap = lineCap;
|
|
361
|
+
mainContext.lineJoin = 'round';
|
|
362
|
+
mainContext.lineCap = 'round';
|
|
344
363
|
}
|
|
345
364
|
|
|
346
365
|
// wait for gameInit to load
|
|
@@ -352,6 +371,9 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
|
|
|
352
371
|
if (headlessMode)
|
|
353
372
|
return startEngine();
|
|
354
373
|
|
|
374
|
+
// setup webgl
|
|
375
|
+
glInit(rootElement);
|
|
376
|
+
|
|
355
377
|
// setup html
|
|
356
378
|
const styleRoot =
|
|
357
379
|
'margin:0;' + // fill the window
|
|
@@ -360,37 +382,32 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
|
|
|
360
382
|
'user-select:none;' + // prevent hold to select
|
|
361
383
|
'-webkit-user-select:none;' + // compatibility for ios
|
|
362
384
|
'touch-action:none;' + // prevent mobile pinch to resize
|
|
363
|
-
'-webkit-touch-callout:none'
|
|
385
|
+
'-webkit-touch-callout:none'; // compatibility for ios
|
|
364
386
|
rootElement.style.cssText = styleRoot;
|
|
365
|
-
drawCanvas = mainCanvas = document.createElement('canvas');
|
|
366
|
-
rootElement.appendChild(mainCanvas);
|
|
387
|
+
drawCanvas = mainCanvas = rootElement.appendChild(document.createElement('canvas'));
|
|
367
388
|
drawContext = mainContext = mainCanvas.getContext('2d');
|
|
368
389
|
|
|
369
390
|
// init stuff and start engine
|
|
370
391
|
inputInit();
|
|
371
392
|
audioInit();
|
|
372
393
|
debugInit();
|
|
373
|
-
glInit();
|
|
374
394
|
|
|
375
|
-
//
|
|
376
|
-
|
|
377
|
-
rootElement.appendChild(overlayCanvas);
|
|
378
|
-
overlayContext = overlayCanvas.getContext('2d');
|
|
379
|
-
|
|
380
|
-
// set canvases
|
|
395
|
+
// setup canvases
|
|
396
|
+
// transform way is still more reliable then flexbox or grid
|
|
381
397
|
const styleCanvas = 'position:absolute;'+ // allow canvases to overlap
|
|
382
398
|
'top:50%;left:50%;transform:translate(-50%,-50%)'; // center on screen
|
|
383
|
-
mainCanvas.style.cssText =
|
|
399
|
+
mainCanvas.style.cssText = styleCanvas;
|
|
384
400
|
if (glCanvas)
|
|
385
401
|
glCanvas.style.cssText = styleCanvas;
|
|
386
402
|
setCanvasPixelated(canvasPixelated);
|
|
387
|
-
setOverlayCanvasPixelated(overlayCanvasPixelated);
|
|
388
403
|
updateCanvas();
|
|
389
404
|
glPreRender();
|
|
390
405
|
|
|
391
|
-
// create offscreen
|
|
392
|
-
workCanvas = new OffscreenCanvas(
|
|
393
|
-
workContext = workCanvas.getContext('2d'
|
|
406
|
+
// create offscreen canvases for image processing
|
|
407
|
+
workCanvas = new OffscreenCanvas(64, 64);
|
|
408
|
+
workContext = workCanvas.getContext('2d');
|
|
409
|
+
workReadCanvas = new OffscreenCanvas(64, 64);
|
|
410
|
+
workReadContext = workReadCanvas.getContext('2d', { willReadFrequently: true });
|
|
394
411
|
|
|
395
412
|
// create promises for loading images
|
|
396
413
|
const promises = imageSources.map((src, textureIndex)=>
|
|
@@ -441,9 +458,176 @@ async function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, game
|
|
|
441
458
|
// wait for all the promises to finish
|
|
442
459
|
await Promise.all(promises);
|
|
443
460
|
return startEngine();
|
|
461
|
+
|
|
462
|
+
///////////////////////////////////////////////////////////////////////////
|
|
463
|
+
// LittleJS Splash Screen
|
|
464
|
+
function drawEngineSplashScreen(t)
|
|
465
|
+
{
|
|
466
|
+
const x = mainContext;
|
|
467
|
+
const w = mainCanvas.width = innerWidth;
|
|
468
|
+
const h = mainCanvas.height = innerHeight;
|
|
469
|
+
|
|
470
|
+
{
|
|
471
|
+
// background
|
|
472
|
+
const p3 = percent(t, 1, .8);
|
|
473
|
+
const p4 = percent(t, 0, .5);
|
|
474
|
+
const g = x.createRadialGradient(w/2,h/2,0,w/2,h/2,hypot(w,h)*.7);
|
|
475
|
+
g.addColorStop(0,hsl(0,0,lerp(0,p3/2,p4),p3).toString());
|
|
476
|
+
g.addColorStop(1,hsl(0,0,0,p3).toString());
|
|
477
|
+
x.save();
|
|
478
|
+
x.fillStyle = g;
|
|
479
|
+
x.fillRect(0,0,w,h);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// draw LittleJS logo...
|
|
483
|
+
const rect = (X, Y, W, H, C)=>
|
|
484
|
+
{
|
|
485
|
+
x.beginPath();
|
|
486
|
+
x.rect(X,Y,W,C?H*p:H);
|
|
487
|
+
x.fillStyle = C;
|
|
488
|
+
C ? x.fill() : x.stroke();
|
|
489
|
+
};
|
|
490
|
+
const line = (X, Y, Z, W)=>
|
|
491
|
+
{
|
|
492
|
+
x.beginPath();
|
|
493
|
+
x.lineTo(X,Y);
|
|
494
|
+
x.lineTo(Z,W);
|
|
495
|
+
x.stroke();
|
|
496
|
+
};
|
|
497
|
+
const circle = (X, Y, R, A=0, B=2*PI, C, F)=>
|
|
498
|
+
{
|
|
499
|
+
const D = (A+B)/2, E = p*(B-A)/2;
|
|
500
|
+
x.beginPath();
|
|
501
|
+
F && x.lineTo(X,Y);
|
|
502
|
+
x.arc(X,Y,R,D-E,D+E);
|
|
503
|
+
x.fillStyle = C;
|
|
504
|
+
C ? x.fill() : x.stroke();
|
|
505
|
+
};
|
|
506
|
+
const color = (c=0, l=0) =>
|
|
507
|
+
hsl([.98,.3,.57,.14][c%4],.8,[0,.3,.5,.8,.9][l]).toString();
|
|
508
|
+
const alpha = wave(1,1,t);
|
|
509
|
+
const p = percent(alpha, .1, .5);
|
|
510
|
+
|
|
511
|
+
// setup
|
|
512
|
+
x.translate(w/2,h/2);
|
|
513
|
+
const size = min(6, min(w,h)/99); // fit to screen
|
|
514
|
+
x.scale(size,size);
|
|
515
|
+
x.translate(-40,-35);
|
|
516
|
+
x.lineJoin = x.lineCap = 'round';
|
|
517
|
+
x.lineWidth = .1 + p*1.9;
|
|
518
|
+
|
|
519
|
+
// drawing effect
|
|
520
|
+
const p2 = percent(alpha,.1,1);
|
|
521
|
+
x.setLineDash([99*p2,99]);
|
|
522
|
+
|
|
523
|
+
// cab top
|
|
524
|
+
rect(7,16,18,-8,color(2,2));
|
|
525
|
+
rect(7,8,18,4,color(2,3));
|
|
526
|
+
rect(25,8,8,8,color(2,1));
|
|
527
|
+
rect(25,8,-18,8);
|
|
528
|
+
rect(25,8,8,8);
|
|
529
|
+
|
|
530
|
+
// cab
|
|
531
|
+
rect(25,16,7,23,color());
|
|
532
|
+
rect(11,39,14,-23,color(1,1));
|
|
533
|
+
rect(11,16,14,18,color(1,2));
|
|
534
|
+
rect(11,16,14,8,color(1,3));
|
|
535
|
+
rect(25,16,-14,24);
|
|
536
|
+
|
|
537
|
+
// cab window
|
|
538
|
+
rect(15,29,6,-9,color(2,2));
|
|
539
|
+
circle(15,21,5,0,PI/2,color(2,4),1);
|
|
540
|
+
rect(21,21,-6,9);
|
|
541
|
+
|
|
542
|
+
// little stack
|
|
543
|
+
rect(37,14,9,6,color(3,2));
|
|
544
|
+
rect(37,14,4.5,6,color(3,3));
|
|
545
|
+
rect(37,14,9,6);
|
|
546
|
+
|
|
547
|
+
// big stack
|
|
548
|
+
rect(50,20,10,-8,color(0,1));
|
|
549
|
+
rect(50,20,6.5,-8,color(0,2));
|
|
550
|
+
rect(50,20,3.5,-8,color(0,3));
|
|
551
|
+
rect(50,20,10,-8);
|
|
552
|
+
circle(55,2,11.4,.5,PI-.5,color(3,3));
|
|
553
|
+
circle(55,2,11.4,.5,PI/2,color(3,2),1);
|
|
554
|
+
circle(55,2,11.4,.5,PI-.5);
|
|
555
|
+
rect(45,7,20,-7,color(0,2));
|
|
556
|
+
rect(45,-1,20,4,color(0,3));
|
|
557
|
+
rect(45,-1,20,8);
|
|
558
|
+
|
|
559
|
+
// engine
|
|
560
|
+
for (let i=5; i--;)
|
|
561
|
+
{
|
|
562
|
+
// stagger radius to fix slight seam
|
|
563
|
+
circle(60-i*6,30, 9.9,0,2*PI,color(i+2,3));
|
|
564
|
+
circle(60-i*6,30,10.0,-.5,PI+.5,color(i+2,2));
|
|
565
|
+
circle(60-i*6,30,10.1,.5,PI-.5,color(i+2,1));
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// engine outline
|
|
569
|
+
circle(36,30,10,PI/2,PI*3/2);
|
|
570
|
+
circle(48,30,10,PI/2,PI*3/2);
|
|
571
|
+
circle(60,30,10);
|
|
572
|
+
line(36,20,60,20);
|
|
573
|
+
|
|
574
|
+
// engine front light
|
|
575
|
+
circle(60,30,4,PI,3*PI,color(3,2));
|
|
576
|
+
circle(60,30,4,PI,2*PI,color(3,3));
|
|
577
|
+
circle(60,30,4,PI,3*PI);
|
|
578
|
+
|
|
579
|
+
// front brush
|
|
580
|
+
for (let i=6; i--;)
|
|
581
|
+
{
|
|
582
|
+
x.beginPath();
|
|
583
|
+
x.lineTo(53,54);
|
|
584
|
+
x.lineTo(53,40);
|
|
585
|
+
x.lineTo(53+(1+i*2.9)*p,40);
|
|
586
|
+
x.lineTo(53+(4+i*3.5)*p,54);
|
|
587
|
+
x.fillStyle = color(0,i%2+2);
|
|
588
|
+
x.fill();
|
|
589
|
+
i%2 && x.stroke();
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// wheels
|
|
593
|
+
rect(6,40,5,5);
|
|
594
|
+
rect(6,40,5,5,color());
|
|
595
|
+
rect(15,54,38,-14,color());
|
|
596
|
+
for (let i=3; i--;)
|
|
597
|
+
for (let j=2; j--;)
|
|
598
|
+
{
|
|
599
|
+
circle(15*i+15,47,j?7:1,PI,3*PI,color(i,3));
|
|
600
|
+
x.stroke();
|
|
601
|
+
circle(15*i+15,47,j?7:1,0,PI,color(i,2));
|
|
602
|
+
x.stroke();
|
|
603
|
+
}
|
|
604
|
+
line(6,40,68,40); // center
|
|
605
|
+
line(77,54,4,54); // bottom
|
|
606
|
+
|
|
607
|
+
// draw engine name
|
|
608
|
+
const s = engineName;
|
|
609
|
+
x.font = '900 16px arial';
|
|
610
|
+
x.textAlign = 'center';
|
|
611
|
+
x.textBaseline = 'top';
|
|
612
|
+
x.lineWidth = .1+p*3.9;
|
|
613
|
+
let w2 = 0;
|
|
614
|
+
for (let i=0; i<s.length; ++i)
|
|
615
|
+
w2 += x.measureText(s[i]).width;
|
|
616
|
+
for (let j=2; j--;)
|
|
617
|
+
for (let i=0, X=41-w2/2; i<s.length; ++i)
|
|
618
|
+
{
|
|
619
|
+
x.fillStyle = color(i,2);
|
|
620
|
+
const w = x.measureText(s[i]).width;
|
|
621
|
+
x[j?'strokeText':'fillText'](s[i],X+w/2,55.5,17*p);
|
|
622
|
+
X += w;
|
|
623
|
+
}
|
|
624
|
+
x.restore();
|
|
625
|
+
}
|
|
626
|
+
///////////////////////////////////////////////////////////////////////////
|
|
444
627
|
}
|
|
445
628
|
|
|
446
629
|
/** Update each engine object, remove destroyed objects, and update time
|
|
630
|
+
* can be called manually if objects need to be updated outside of main loop
|
|
447
631
|
* @memberof Engine */
|
|
448
632
|
function engineObjectsUpdate()
|
|
449
633
|
{
|
|
@@ -495,18 +679,21 @@ function engineObjectsDestroy()
|
|
|
495
679
|
function engineObjectsCollect(pos, size, objects=engineObjects)
|
|
496
680
|
{
|
|
497
681
|
const collectedObjects = [];
|
|
498
|
-
if (!pos)
|
|
682
|
+
if (!pos)
|
|
499
683
|
{
|
|
684
|
+
// all objects
|
|
500
685
|
for (const o of objects)
|
|
501
686
|
collectedObjects.push(o);
|
|
502
687
|
}
|
|
503
|
-
else if (size instanceof Vector2)
|
|
688
|
+
else if (size instanceof Vector2)
|
|
504
689
|
{
|
|
690
|
+
// bounding box test
|
|
505
691
|
for (const o of objects)
|
|
506
692
|
o.isOverlapping(pos, size) && collectedObjects.push(o);
|
|
507
693
|
}
|
|
508
|
-
else
|
|
694
|
+
else
|
|
509
695
|
{
|
|
696
|
+
// circle test
|
|
510
697
|
const sizeSquared = size*size;
|
|
511
698
|
for (const o of objects)
|
|
512
699
|
pos.distanceSquared(o.pos) < sizeSquared && collectedObjects.push(o);
|
package/src/engineAudio.js
CHANGED
|
@@ -178,12 +178,12 @@ class Sound
|
|
|
178
178
|
///////////////////////////////////////////////////////////////////////////////
|
|
179
179
|
|
|
180
180
|
/**
|
|
181
|
-
* Sound Wave Object -
|
|
182
|
-
* - this can be used to play wave, mp3, and ogg files
|
|
181
|
+
* Sound Wave Object - Loads and stores an audio file for later use
|
|
182
|
+
* - this can be used to load and play wave, mp3, and ogg files
|
|
183
183
|
* @extends Sound
|
|
184
184
|
* @memberof Audio
|
|
185
185
|
* @example
|
|
186
|
-
* //
|
|
186
|
+
* // load an audio asset file
|
|
187
187
|
* const sound_example = new SoundWave('sound.mp3');
|
|
188
188
|
*
|
|
189
189
|
* // play the sound
|