litecanvas 0.42.3 → 0.44.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/dist/dist.js +43 -54
- package/dist/dist.min.js +1 -1
- package/dist/dist.min.js.map +3 -3
- package/package.json +11 -2
- package/src/index.js +45 -64
- package/src/types.js +2 -1
- package/src/zzfx.js +9 -9
- package/types/types.d.ts +5 -0
package/dist/dist.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
// src/zzfx.js
|
|
3
|
-
zzfxX = new AudioContext();
|
|
4
|
-
zzfxV = 0.3;
|
|
5
|
-
zzfx = (p = 1, k = 0.05, b = 220, e = 0, r = 0, t = 0.1, q = 0, D = 1, u = 0, y = 0, v = 0, z = 0, l = 0, E = 0, A = 0, F = 0, c = 0, w = 1, m = 0, B = 0, N = 0) => {
|
|
3
|
+
globalThis.zzfxX = new AudioContext();
|
|
4
|
+
globalThis.zzfxV = 0.3;
|
|
5
|
+
globalThis.zzfx = (p = 1, k = 0.05, b = 220, e = 0, r = 0, t = 0.1, q = 0, D = 1, u = 0, y = 0, v = 0, z = 0, l = 0, E = 0, A = 0, F = 0, c = 0, w = 1, m = 0, B = 0, N = 0) => {
|
|
6
6
|
let M = Math, d = 2 * M.PI, R = 44100, G = u *= 500 * d / R / R, C = b *= (1 - k + 2 * k * M.random(k = [])) * d / R, g = 0, H = 0, a = 0, n = 1, I = 0, J = 0, f = 0, h = N < 0 ? -1 : 1, x = d * h * N * 2 / R, L = M.cos(x), Z = M.sin, K = Z(x) / 4, O = 1 + K, X = -2 * L / O, Y = (1 - K) / O, P = (1 + h * L) / 2 / O, Q = -(h + L) / O, S = P, T = 0, U = 0, V = 0, W = 0;
|
|
7
7
|
e = R * e + 9;
|
|
8
8
|
m *= R;
|
|
@@ -61,25 +61,26 @@
|
|
|
61
61
|
fullscreen: true,
|
|
62
62
|
width: null,
|
|
63
63
|
height: null,
|
|
64
|
-
pauseOnBlur: true,
|
|
65
64
|
autoscale: true,
|
|
66
65
|
pixelart: false,
|
|
67
66
|
antialias: true,
|
|
68
67
|
canvas: null,
|
|
69
68
|
global: true,
|
|
69
|
+
loop: null,
|
|
70
70
|
tapEvents: true,
|
|
71
|
-
|
|
71
|
+
pauseOnBlur: true,
|
|
72
|
+
defaultTextSize: 32
|
|
72
73
|
};
|
|
73
74
|
settings = Object.assign(defaults, settings);
|
|
74
|
-
let _initialized = false, _plugins = [], _canvas = settings.canvas || document.createElement("canvas"), _fullscreen = settings.fullscreen, _autoscale = settings.autoscale, _scale = 1, _mouseX, _mouseY, _ctx, _timeScale = 1, _lastFrame, _step = 1 / settings.fps, _stepMs = _step * 1e3, _accumulated = 0, _rafid, _drawCount = 0, _drawTime = 0, _fontFamily = "sans-serif", _fontStyle = "", _fontSize =
|
|
75
|
-
init:
|
|
76
|
-
update:
|
|
77
|
-
draw:
|
|
78
|
-
resized:
|
|
79
|
-
tap:
|
|
80
|
-
untap:
|
|
81
|
-
tapping:
|
|
82
|
-
tapped:
|
|
75
|
+
let _initialized = false, _plugins = [], _canvas = settings.canvas || document.createElement("canvas"), _fullscreen = settings.fullscreen, _autoscale = settings.autoscale, _scale = 1, _mouseX, _mouseY, _ctx, _timeScale = 1, _lastFrame, _step = 1 / settings.fps, _stepMs = _step * 1e3, _accumulated = 0, _rafid, _drawCount = 0, _drawTime = 0, _fontFamily = "sans-serif", _fontStyle = "", _fontSize = settings.defaultTextSize, _events = {
|
|
76
|
+
init: false,
|
|
77
|
+
update: false,
|
|
78
|
+
draw: false,
|
|
79
|
+
resized: false,
|
|
80
|
+
tap: false,
|
|
81
|
+
untap: false,
|
|
82
|
+
tapping: false,
|
|
83
|
+
tapped: false
|
|
83
84
|
}, _helpers = {
|
|
84
85
|
settings: Object.assign({}, settings),
|
|
85
86
|
colors,
|
|
@@ -233,13 +234,7 @@
|
|
|
233
234
|
*/
|
|
234
235
|
rect(x, y, width, height, color = 0, radii = null) {
|
|
235
236
|
_ctx.beginPath();
|
|
236
|
-
_ctx[radii ? "roundRect" : "rect"](
|
|
237
|
-
~~x,
|
|
238
|
-
~~y,
|
|
239
|
-
~~width,
|
|
240
|
-
~~height,
|
|
241
|
-
radii
|
|
242
|
-
);
|
|
237
|
+
_ctx[radii ? "roundRect" : "rect"](~~x, ~~y, width, height, radii);
|
|
243
238
|
instance.stroke(color);
|
|
244
239
|
},
|
|
245
240
|
/**
|
|
@@ -254,13 +249,7 @@
|
|
|
254
249
|
*/
|
|
255
250
|
rectfill(x, y, width, height, color = 0, radii = null) {
|
|
256
251
|
_ctx.beginPath();
|
|
257
|
-
_ctx[radii ? "roundRect" : "rect"](
|
|
258
|
-
~~x,
|
|
259
|
-
~~y,
|
|
260
|
-
~~width,
|
|
261
|
-
~~height,
|
|
262
|
-
radii
|
|
263
|
-
);
|
|
252
|
+
_ctx[radii ? "roundRect" : "rect"](~~x, ~~y, width, height, radii);
|
|
264
253
|
instance.fill(color);
|
|
265
254
|
},
|
|
266
255
|
/**
|
|
@@ -273,7 +262,7 @@
|
|
|
273
262
|
*/
|
|
274
263
|
circ(x, y, radius, color = 0) {
|
|
275
264
|
_ctx.beginPath();
|
|
276
|
-
_ctx.arc(~~x, ~~y,
|
|
265
|
+
_ctx.arc(~~x, ~~y, radius, 0, TWO_PI);
|
|
277
266
|
_ctx.closePath();
|
|
278
267
|
instance.stroke(color);
|
|
279
268
|
},
|
|
@@ -287,7 +276,7 @@
|
|
|
287
276
|
*/
|
|
288
277
|
circfill(x, y, radius, color = 0) {
|
|
289
278
|
_ctx.beginPath();
|
|
290
|
-
_ctx.arc(~~x, ~~y,
|
|
279
|
+
_ctx.arc(~~x, ~~y, radius, 0, TWO_PI);
|
|
291
280
|
_ctx.closePath();
|
|
292
281
|
instance.fill(color);
|
|
293
282
|
},
|
|
@@ -337,7 +326,7 @@
|
|
|
337
326
|
* @param {number} [color=3] the color index (generally from 0 to 7)
|
|
338
327
|
*/
|
|
339
328
|
text(x, y, text, color = 3) {
|
|
340
|
-
_ctx.font = `${_fontStyle || ""} ${
|
|
329
|
+
_ctx.font = `${_fontStyle || ""} ${_fontSize}px ${_fontFamily}`;
|
|
341
330
|
_ctx.fillStyle = instance.getcolor(color);
|
|
342
331
|
_ctx.fillText(text, ~~x, ~~y);
|
|
343
332
|
},
|
|
@@ -374,8 +363,10 @@
|
|
|
374
363
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/textAlign
|
|
375
364
|
*/
|
|
376
365
|
textalign(align, baseline) {
|
|
377
|
-
|
|
378
|
-
|
|
366
|
+
if (align)
|
|
367
|
+
_ctx.textAlign = align;
|
|
368
|
+
if (baseline)
|
|
369
|
+
_ctx.textBaseline = baseline;
|
|
379
370
|
},
|
|
380
371
|
/**
|
|
381
372
|
* Returns a TextMetrics object that contains information about the measured text (such as its width, for example)
|
|
@@ -386,7 +377,7 @@
|
|
|
386
377
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics
|
|
387
378
|
*/
|
|
388
379
|
textmetrics(text, size) {
|
|
389
|
-
_ctx.font = `${_fontStyle || ""} ${
|
|
380
|
+
_ctx.font = `${_fontStyle || ""} ${size || _fontSize}px ${_fontFamily}`;
|
|
390
381
|
metrics = _ctx.measureText(text);
|
|
391
382
|
metrics.height = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;
|
|
392
383
|
return metrics;
|
|
@@ -586,7 +577,7 @@
|
|
|
586
577
|
if (navigator.userActivation && !navigator.userActivation.hasBeenActive) {
|
|
587
578
|
return;
|
|
588
579
|
}
|
|
589
|
-
let z = Array.isArray(sound) ? sound : sounds[
|
|
580
|
+
let z = Array.isArray(sound) ? sound : sounds[sound % sounds.length];
|
|
590
581
|
if (volume !== 1 || pitch || randomness) {
|
|
591
582
|
z = [...z];
|
|
592
583
|
z[0] = (Number(volume) || 1) * (z[0] || 1);
|
|
@@ -656,12 +647,10 @@
|
|
|
656
647
|
* @returns {function} a function to remove the listener
|
|
657
648
|
*/
|
|
658
649
|
listen(event, callback, highPriority = false) {
|
|
659
|
-
_events[event] = _events[event] || [];
|
|
660
|
-
_events[event][highPriority ?
|
|
650
|
+
_events[event] = _events[event] || [[], []];
|
|
651
|
+
const size = _events[event][highPriority ? 0 : 1].push(callback);
|
|
661
652
|
return () => {
|
|
662
|
-
_events[event]
|
|
663
|
-
(item) => item !== callback
|
|
664
|
-
);
|
|
653
|
+
_events[event][highPriority ? 0 : 1].splice(size - 1, 1);
|
|
665
654
|
};
|
|
666
655
|
},
|
|
667
656
|
/**
|
|
@@ -673,8 +662,10 @@
|
|
|
673
662
|
emit(event, ...args) {
|
|
674
663
|
if (!_events[event])
|
|
675
664
|
return;
|
|
676
|
-
for (
|
|
677
|
-
|
|
665
|
+
for (const list of _events[event]) {
|
|
666
|
+
for (const callback of list) {
|
|
667
|
+
callback(...args);
|
|
668
|
+
}
|
|
678
669
|
}
|
|
679
670
|
},
|
|
680
671
|
/**
|
|
@@ -703,8 +694,8 @@
|
|
|
703
694
|
* @param {number} height
|
|
704
695
|
*/
|
|
705
696
|
resize(width, height) {
|
|
706
|
-
instance.setvar("WIDTH", _canvas.width =
|
|
707
|
-
instance.setvar("HEIGHT", _canvas.height =
|
|
697
|
+
instance.setvar("WIDTH", _canvas.width = width);
|
|
698
|
+
instance.setvar("HEIGHT", _canvas.height = height || width);
|
|
708
699
|
pageResized();
|
|
709
700
|
}
|
|
710
701
|
};
|
|
@@ -732,12 +723,12 @@
|
|
|
732
723
|
_initialized = true;
|
|
733
724
|
setupCanvas();
|
|
734
725
|
const source = settings.loop ? settings.loop : root;
|
|
735
|
-
for (const event
|
|
726
|
+
for (const event of Object.keys(_events)) {
|
|
736
727
|
if (source[event])
|
|
737
728
|
instance.listen(event, source[event]);
|
|
738
729
|
}
|
|
739
|
-
for (
|
|
740
|
-
loadPlugin(
|
|
730
|
+
for (const plugin of _plugins) {
|
|
731
|
+
loadPlugin(plugin);
|
|
741
732
|
}
|
|
742
733
|
on(root, "resize", pageResized);
|
|
743
734
|
pageResized();
|
|
@@ -791,8 +782,7 @@
|
|
|
791
782
|
on(_canvas, "touchstart", (ev) => {
|
|
792
783
|
ev.preventDefault();
|
|
793
784
|
const touches = ev.changedTouches;
|
|
794
|
-
for (
|
|
795
|
-
const touch = touches[i];
|
|
785
|
+
for (const touch of touches) {
|
|
796
786
|
const [x, y] = _getXY(touch.pageX, touch.pageY);
|
|
797
787
|
instance.emit("tap", x, y, touch.identifier + 1);
|
|
798
788
|
_registerTap(touch.identifier + 1, x, y);
|
|
@@ -801,8 +791,7 @@
|
|
|
801
791
|
on(_canvas, "touchmove", (ev) => {
|
|
802
792
|
ev.preventDefault();
|
|
803
793
|
const touches = ev.changedTouches;
|
|
804
|
-
for (
|
|
805
|
-
const touch = touches[i];
|
|
794
|
+
for (const touch of touches) {
|
|
806
795
|
const [x, y] = _getXY(touch.pageX, touch.pageY);
|
|
807
796
|
instance.emit("tapping", x, y, touch.identifier + 1);
|
|
808
797
|
_updateTap(touch.identifier + 1, x, y);
|
|
@@ -864,6 +853,7 @@
|
|
|
864
853
|
ticks++;
|
|
865
854
|
}
|
|
866
855
|
if (ticks) {
|
|
856
|
+
instance.textalign("start", "top");
|
|
867
857
|
instance.emit("draw");
|
|
868
858
|
_drawCount++;
|
|
869
859
|
_drawTime += _stepMs * ticks;
|
|
@@ -915,14 +905,13 @@
|
|
|
915
905
|
_ctx.imageSmoothingEnabled = false;
|
|
916
906
|
_canvas.style.imageRendering = "pixelated";
|
|
917
907
|
}
|
|
918
|
-
instance.textalign(_textAlign, _textBaseline);
|
|
919
908
|
instance.emit("resized", _scale);
|
|
920
909
|
}
|
|
921
910
|
function loadPlugin(callback) {
|
|
922
911
|
const pluginData = callback(instance, _helpers, callback.__conf);
|
|
923
912
|
if ("object" === typeof pluginData) {
|
|
924
|
-
for (const key
|
|
925
|
-
instance.setvar(key,
|
|
913
|
+
for (const [key, value] of Object.entries(pluginData)) {
|
|
914
|
+
instance.setvar(key, value);
|
|
926
915
|
}
|
|
927
916
|
}
|
|
928
917
|
}
|
package/dist/dist.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(()=>{zzfxX=new AudioContext;zzfxV=.3;zzfx=(u=1,
|
|
1
|
+
(()=>{globalThis.zzfxX=new AudioContext;globalThis.zzfxV=.3;globalThis.zzfx=(u=1,I=.05,H=220,h=0,$=0,G=.1,X=0,f=1,M=0,F=0,y=0,L=0,P=0,n=0,R=0,B=0,E=0,O=1,D=0,S=0,Y=0)=>{let T=Math,_=2*T.PI,g=44100,j=M*=500*_/g/g,v=H*=(1-I+2*I*T.random(I=[]))*_/g,A=0,o=0,m=0,C=1,q=0,N=0,z=0,e=Y<0?-1:1,t=_*e*Y*2/g,a=T.cos(t),r=T.sin,l=r(t)/4,p=1+l,x=-2*a/p,w=(1-l)/p,i=(1+e*a)/2/p,c=-(e+a)/p,s=i,d=0,W=0,J=0,K=0;for(h=g*h+9,D*=g,$*=g,G*=g,E*=g,F*=500*_/g**3,R*=_/g,y*=_/g,L*=g,P=g*P|0,u*=zzfxV,e=h+D+$+G+E|0;m<e;I[m++]=z*u)++N%(100*B|0)||(z=X?1<X?2<X?3<X?r(A*A):T.max(T.min(T.tan(A),1),-1):1-(2*A/_%2+2)%2:1-4*T.abs(T.round(A/_)-A/_):r(A),z=(P?1-S+S*r(_*m/P):1)*(z<0?-1:1)*T.abs(z)**f*(m<h?m/h:m<h+D?1-(m-h)/D*(1-O):m<h+D+$?O:m<e-E?(e-m-E)/G*O:0),z=E?z/2+(E>m?0:(m<e-E?1:(e-m)/E)*I[m-E|0]/2/u):z,Y&&(z=K=s*d+c*(d=W)+i*(W=z)-w*J-x*(J=K))),t=(H+=M+=F)*T.cos(R*o++),A+=t+t*n*r(m**5),C&&++C>L&&(H+=y,v+=y,C=0),!P||++q%P||(H=v,M=j,C=C||1);u=zzfxX.createBuffer(1,e,g),u.getChannelData(0).set(I),H=zzfxX.createBufferSource(),H.buffer=u,H.connect(zzfxX.destination),H.start()};var k=["#18161c","#6a7799","#aec2c2","#f3eade","#f04f78","#fcf660","#2f328f","#4b80ca","#327345","#63c64d","#703075","#a56243"];var V=[[.8,0,2e3,.01,.05,,1,2,,,-600,.05,,,,,,.5,.05],[.5,0,375,.02,.01,.2,1,,,,,,,.4,,.1,,.6,.1],[,0,360,.01,,.08,1,1.7,12,32,,,,,,,,.63,.02,,99],[1.2,0,240,.02,.15,.15,1,4,,,,,.05,,,,,.6,.15]];var b=globalThis;function Q(u={}){let I=Math.PI,H=I*2,h=(e,t,a)=>e.addEventListener(t,a);u=Object.assign({fps:60,fullscreen:!0,width:null,height:null,autoscale:!0,pixelart:!1,antialias:!0,canvas:null,global:!0,loop:null,tapEvents:!0,pauseOnBlur:!0,defaultTextSize:32},u);let G=!1,X=[],f=u.canvas||document.createElement("canvas"),M=u.fullscreen,F=u.autoscale,y=1,L,P,n,R=1,B,E=1/u.fps,O=E*1e3,D=0,S,Y=0,T=0,_="sans-serif",g="",j=u.defaultTextSize,v={init:!1,update:!1,draw:!1,resized:!1,tap:!1,untap:!1,tapping:!1,tapped:!1},A={settings:Object.assign({},u),colors:k,sounds:V},o={WIDTH:u.width,HEIGHT:u.height||u.width,CANVAS:null,ELAPSED:0,FPS:u.fps,CENTERX:null,CENTERY:null,PI:I,TWO_PI:H,HALF_PI:I*.5,lerp:(e,t,a)=>e+a*(t-e),deg2rad:e=>I/180*e,rad2deg:e=>180/I*e,clamp:(e,t,a)=>Math.min(Math.max(e,t),a),wrap:(e,t,a)=>e-(a-t)*Math.floor((e-t)/(a-t)),map(e,t,a,r,l,p=!1){let x=(e-t)/(a-t)*(l-r)+r;return p?o.clamp(x,r,l):x},norm:(e,t,a)=>o.map(e,t,a,0,1),rand:(e=0,t=1)=>Math.random()*(t-e)+e,randi:(e=0,t=1)=>o.floor(o.rand()*(t-e+1)+e),cls(e){e==null?n.clearRect(0,0,o.WIDTH,o.HEIGHT):o.rectfill(0,0,o.WIDTH,o.HEIGHT,e)},rect(e,t,a,r,l=0,p=null){n.beginPath(),n[p?"roundRect":"rect"](~~e,~~t,a,r,p),o.stroke(l)},rectfill(e,t,a,r,l=0,p=null){n.beginPath(),n[p?"roundRect":"rect"](~~e,~~t,a,r,p),o.fill(l)},circ(e,t,a,r=0){n.beginPath(),n.arc(~~e,~~t,a,0,H),n.closePath(),o.stroke(r)},circfill(e,t,a,r=0){n.beginPath(),n.arc(~~e,~~t,a,0,H),n.closePath(),o.fill(r)},line(e,t,a,r,l=0){n.beginPath(),n.moveTo(~~e,~~t),n.lineTo(~~a,~~r),o.stroke(l)},linewidth(e){n.lineWidth=e},linedash(e,t=0){n.setLineDash(Array.isArray(e)?e:[e]),n.lineDashOffset=t},text(e,t,a,r=3){n.font=`${g||""} ${j}px ${_}`,n.fillStyle=o.getcolor(r),n.fillText(a,~~e,~~t)},textfont(e){_=e},textsize(e){j=e},textstyle(e){g=e},textalign(e,t){e&&(n.textAlign=e),t&&(n.textBaseline=t)},textmetrics(e,t){return n.font=`${g||""} ${t||j}px ${_}`,metrics=n.measureText(e),metrics.height=metrics.actualBoundingBoxAscent+metrics.actualBoundingBoxDescent,metrics},image(e,t,a){n.drawImage(a,~~e,~~t)},paint(e,t,a,r={}){let l=new OffscreenCanvas(e,t),p=n,x=r.scale||1;if(l.width=e*x,l.height=t*x,n=l.getContext("2d"),n.scale(x,x),Array.isArray(a)){let w=0,i=0;n.imageSmoothingEnabled=!1;for(let c of a){for(let s of c)s!==" "&&s!=="."&&o.rectfill(w,i,1,1,parseInt(s,16)),w++;i++,w=0}}else a(l,n);return n=p,l},ctx:()=>n,push:()=>n.save(),pop:()=>n.restore(),translate:(e,t)=>n.translate(e,t),scale:(e,t)=>n.scale(e,t||e),rotate:e=>n.rotate(e),transform:(e,t,a,r,l,p,x=!0)=>n[x?"setTransform":"transform"](e,t,a,r,l,p),alpha(e){n.globalAlpha=e},path:e=>new Path2D(e),fill(e,t){n.fillStyle=o.getcolor(e),n.fill(t)},stroke(e,t){n.strokeStyle=o.getcolor(e),t?n.stroke(t):n.stroke()},cliprect(e,t,a,r){n.beginPath(),n.rect(e,t,a,r),n.clip()},clipcirc(e,t,a){n.beginPath(),n.arc(e,t,a,0,H),n.clip()},blendmode(e){n.globalCompositeOperation=e},sfx(e=0,t=1,a=0,r=0){if(navigator.userActivation&&!navigator.userActivation.hasBeenActive)return;let l=Array.isArray(e)?e:V[e%V.length];return(t!==1||a||r)&&(l=[...l],l[0]=(Number(t)||1)*(l[0]||1),l[1]=r>0?r:0,l[10]=~~l[10]+~~a),zzfx(...l)},colrect:(e,t,a,r,l,p,x,w)=>e<l+x&&e+a>l&&t<p+w&&t+r>p,colcirc:(e,t,a,r,l,p)=>(r-e)**2+(l-t)**2<=(a+p)**2,mousepos:()=>[L,P],timescale(e){R=e},use(e,t={}){e.__conf=t,G?z(e):X.push(e)},listen(e,t,a=!1){v[e]=v[e]||[[],[]];let r=v[e][a?0:1].push(t);return()=>{v[e][a?0:1].splice(r-1,1)}},emit(e,...t){if(v[e])for(let a of v[e])for(let r of a)r(...t)},getcolor:e=>k[~~e%k.length],setvar(e,t){o[e]=t,u.global&&(b[e]=t)},resize(e,t){o.setvar("WIDTH",f.width=e),o.setvar("HEIGHT",f.height=t||e),N()}};for(let e of["sin","cos","atan2","hypot","tan","abs","ceil","round","floor","trunc","min","max","pow","sqrt","sign","exp"])o[e]=Math[e];function m(){G=!0,q();let e=u.loop?u.loop:b;for(let t of Object.keys(v))e[t]&&o.listen(t,e[t]);for(let t of X)z(t);if(h(b,"resize",N),N(),u.tapEvents){let t=(i,c)=>[(i-f.offsetLeft)/y,(c-f.offsetTop)/y],a=new Map,r=(i,c,s)=>{let d={x:c,y:s,startX:c,startY:s,ts:performance.now()};return a.set(i,d),d},l=(i,c,s)=>{let d=a.get(i)||r(i);d.x=c,d.y=s},p=i=>i&&performance.now()-i.ts<=200,x=!1;h(f,"mousedown",i=>{i.preventDefault();let[c,s]=t(i.pageX,i.pageY);o.emit("tap",c,s,0),r(0,c,s),x=!0}),h(f,"mousemove",i=>{i.preventDefault();let[c,s]=[L,P]=t(i.pageX,i.pageY);x&&(o.emit("tapping",c,s,0),l(0,c,s))}),h(f,"mouseup",i=>{i.preventDefault();let c=a.get(0),[s,d]=t(i.pageX,i.pageY);p(c)&&o.emit("tapped",c.startX,c.startY,0),o.emit("untap",s,d,0),a.delete(0),x=!1}),h(f,"touchstart",i=>{i.preventDefault();let c=i.changedTouches;for(let s of c){let[d,W]=t(s.pageX,s.pageY);o.emit("tap",d,W,s.identifier+1),r(s.identifier+1,d,W)}}),h(f,"touchmove",i=>{i.preventDefault();let c=i.changedTouches;for(let s of c){let[d,W]=t(s.pageX,s.pageY);o.emit("tapping",d,W,s.identifier+1),l(s.identifier+1,d,W)}});let w=i=>{i.preventDefault();let c=[];if(i.targetTouches.length>0)for(let s of i.targetTouches)c.push(s.identifier+1);for(let[s,d]of a)c.includes(s)||(p(d)&&o.emit("tapped",d.startX,d.startY,s),o.emit("untap",d.x,d.y,s),a.delete(s))};h(f,"touchend",w),h(f,"touchcancel",w),h(b,"blur",()=>{if(x=!1,a.size!==0)for(let[i,c]of a)o.emit("untap",c.x,c.y,i),a.delete(i)})}u.pauseOnBlur&&(h(b,"blur",()=>{S=null}),h(b,"focus",()=>{S||(B=performance.now(),S=requestAnimationFrame(C))})),o.emit("init"),B=performance.now(),S=requestAnimationFrame(C)}function C(e){let t=0,a=e-B;for(B=e,D+=a;D>=O;)o.emit("update",E*R),o.setvar("ELAPSED",o.ELAPSED+E*R),D-=O,t++;t&&(o.textalign("start","top"),o.emit("draw"),Y++,T+=O*t,T+D>=1e3&&(o.setvar("FPS",Y),Y=0,T-=1e3)),S&&(S=requestAnimationFrame(C))}function q(){f=typeof f=="string"?document.querySelector(f):f,o.setvar("CANVAS",f),n=f.getContext("2d"),o.WIDTH>0&&(M=!1),f.width=o.WIDTH,f.height=o.HEIGHT||o.WIDTH,f.parentNode||document.body.appendChild(f),f.style.display="block",M?(f.style.position="absolute",f.style.inset=0):F&&(f.style.margin="auto")}function N(){M?(f.width=innerWidth,f.height=innerHeight,o.setvar("WIDTH",innerWidth),o.setvar("HEIGHT",innerHeight)):F&&(y=Math.min(innerWidth/o.WIDTH,innerHeight/o.HEIGHT),y=u.pixelart?Math.floor(y):y,f.style.width=o.WIDTH*y+"px",f.style.height=o.HEIGHT*y+"px"),o.setvar("CENTERX",o.WIDTH/2),o.setvar("CENTERY",o.HEIGHT/2),(!u.antialias||u.pixelart)&&(n.imageSmoothingEnabled=!1,f.style.imageRendering="pixelated"),o.emit("resized",y)}function z(e){let t=e(o,A,e.__conf);if(typeof t=="object")for(let[a,r]of Object.entries(t))o.setvar(a,r)}if(u.global){if(b.__litecanvas)throw"Cannot instantiate litecanvas globally twice";Object.assign(b,o),b.__litecanvas=!0}return document.readyState==="loading"?h(b,"DOMContentLoaded",m):m(),o}b.litecanvas=Q;})();
|
|
2
2
|
//# sourceMappingURL=dist.min.js.map
|
package/dist/dist.min.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/zzfx.js", "../src/palette.js", "../src/sounds.js", "../src/index.js"],
|
|
4
|
-
"sourcesContent": ["// ZzFXMicro - Zuper Zmall Zound Zynth - v1.3.0 by Frank Force | https://github.com/KilledByAPixel/ZzFX\nzzfxX = new AudioContext() // audio context\nzzfxV = 0.3 // global volume\nzzfx = (\n p = 1,\n k = 0.05,\n b = 220,\n e = 0,\n r = 0,\n t = 0.1,\n q = 0,\n D = 1,\n u = 0,\n y = 0,\n v = 0,\n z = 0,\n l = 0,\n E = 0,\n A = 0,\n F = 0,\n c = 0,\n w = 1,\n m = 0,\n B = 0,\n N = 0\n) => {\n let M = Math,\n d = 2 * M.PI,\n R = 44100,\n G = (u *= (500 * d) / R / R),\n C = (b *= ((1 - k + 2 * k * M.random((k = []))) * d) / R),\n g = 0,\n H = 0,\n a = 0,\n n = 1,\n I = 0,\n J = 0,\n f = 0,\n h = N < 0 ? -1 : 1,\n x = (d * h * N * 2) / R,\n L = M.cos(x),\n Z = M.sin,\n K = Z(x) / 4,\n O = 1 + K,\n X = (-2 * L) / O,\n Y = (1 - K) / O,\n P = (1 + h * L) / 2 / O,\n Q = -(h + L) / O,\n S = P,\n T = 0,\n U = 0,\n V = 0,\n W = 0\n e = R * e + 9\n m *= R\n r *= R\n t *= R\n c *= R\n y *= (500 * d) / R ** 3\n A *= d / R\n v *= d / R\n z *= R\n l = (R * l) | 0\n p *= zzfxV\n for (h = (e + m + r + t + c) | 0; a < h; k[a++] = f * p)\n ++J % ((100 * F) | 0) ||\n ((f = q\n ? 1 < q\n ? 2 < q\n ? 3 < q\n ? Z(g * g)\n : M.max(M.min(M.tan(g), 1), -1)\n : 1 - (((((2 * g) / d) % 2) + 2) % 2)\n : 1 - 4 * M.abs(M.round(g / d) - g / d)\n : Z(g)),\n (f =\n (l ? 1 - B + B * Z((d * a) / l) : 1) *\n (f < 0 ? -1 : 1) *\n M.abs(f) ** D *\n (a < e\n ? a / e\n : a < e + m\n ? 1 - ((a - e) / m) * (1 - w)\n : a < e + m + r\n ? w\n : a < h - c\n ? ((h - a - c) / t) * w\n : 0)),\n (f = c\n ? f / 2 +\n (c > a\n ? 0\n : ((a < h - c ? 1 : (h - a) / c) * k[(a - c) | 0]) /\n 2 /\n p)\n : f),\n N\n ? (f = W =\n S * T + Q * (T = U) + P * (U = f) - Y * V - X * (V = W))\n : 0),\n (x = (b += u += y) * M.cos(A * H++)),\n (g += x + x * E * Z(a ** 5)),\n n && ++n > z && ((b += v), (C += v), (n = 0)),\n !l || ++I % l || ((b = C), (u = G), (n = n || 1))\n p = zzfxX.createBuffer(1, h, R)\n p.getChannelData(0).set(k)\n b = zzfxX.createBufferSource()\n b.buffer = p\n b.connect(zzfxX.destination)\n b.start()\n}\n", "// Default colors inspired by https://lospec.com/palette-list/trirampo\nexport const colors = [\n '#18161c',\n '#6a7799',\n '#aec2c2',\n '#f3eade',\n\n '#f04f78',\n '#fcf660',\n '#2f328f',\n '#4b80ca',\n\n '#327345',\n '#63c64d',\n '#703075',\n '#a56243',\n]\n", "// prettier-ignore\nexport const sounds = [\n // 0 - pickup\n [0.8, 0, 2e3, 0.01, 0.05, , 1, 2, , , -600, 0.05, , , , , , 0.5, 0.05],\n // 1 - hit\n [0.5, 0, 375, 0.02, 0.01, 0.2, 1, , , , , , , 0.4, , 0.1, , 0.6, 0.1],\n // 2 - jump\n [, 0, 360, 0.01, , 0.08, 1, 1.7, 12, 32, , , , , , , , 0.63, 0.02, , 99],\n // 3 - warning\n [1.2, 0, 240, 0.02, 0.15, 0.15, 1, 4, , , , , 0.05, , , , , 0.6, 0.15],\n]\n", "/* litecanvas v0.42.3 | https://github.com/litecanvas/game-engine */\nimport './zzfx'\nimport { colors } from './palette'\nimport { sounds } from './sounds'\n\nconst root = globalThis\n\n/**\n * The litecanvas constructor\n *\n * @param {LitecanvasOptions} [settings]\n * @returns {LitecanvasInstance}\n */\nexport default function litecanvas(settings = {}) {\n // helpers\n const PI = Math.PI,\n TWO_PI = PI * 2,\n /** @type {(elem:HTMLElement, evt:string, callback:Function)=>void} */\n on = (elem, evt, callback) => elem.addEventListener(evt, callback),\n /** @type {LitecanvasOptions} */\n defaults = {\n fps: 60,\n fullscreen: true,\n width: null,\n height: null,\n pauseOnBlur: true,\n autoscale: true,\n pixelart: false,\n antialias: true,\n canvas: null,\n global: true,\n tapEvents: true,\n loop: null,\n }\n\n // setup the settings default values\n settings = Object.assign(defaults, settings)\n\n let /** @type {boolean} */\n _initialized = false,\n /** @type {function[]} */\n _plugins = [],\n /** @type {HTMLCanvasElement|string} _canvas */\n _canvas = settings.canvas || document.createElement('canvas'),\n /** @type {boolean} */\n _fullscreen = settings.fullscreen,\n /** @type {boolean} */\n _autoscale = settings.autoscale,\n /** @type {number} */\n _scale = 1,\n /** @type {number?} */\n _mouseX,\n /** @type {number?} */\n _mouseY,\n /** @type {CanvasRenderingContext2D} */\n _ctx,\n /** @type {number} */\n _timeScale = 1,\n /** @type {number} */\n _lastFrame,\n /** @type {number} */\n _step = 1 / settings.fps,\n /** @type {number} */\n _stepMs = _step * 1000,\n /** @type {number} */\n _accumulated = 0,\n /** @type {number} */\n _rafid,\n /** @type {number} */\n _drawCount = 0,\n /** @type {number} */\n _drawTime = 0,\n /** @type {string} */\n _fontFamily = 'sans-serif',\n /** @type {string} */\n _fontStyle = '',\n /** @type {number} */\n _fontSize = 32,\n /** @type {string} */\n _textAlign = 'start',\n /** @type {string} */\n _textBaseline = 'top',\n /**\n * default game events\n */\n _events = {\n init: [],\n update: [],\n draw: [],\n resized: [],\n tap: [],\n untap: [],\n tapping: [],\n tapped: [],\n },\n /**\n * Helpers to be used by plugins\n *\n * @type {LitecanvasPluginHelpers}\n */\n _helpers = {\n settings: Object.assign({}, settings),\n colors,\n sounds,\n }\n\n /** @type {LitecanvasInstance} */\n const instance = {\n /** @type {number} */\n WIDTH: settings.width,\n /** @type {number} */\n HEIGHT: settings.height || settings.width,\n /** @type {HTMLCanvasElement} */\n CANVAS: null,\n /** @type {number} */\n ELAPSED: 0,\n /** @type {number} */\n FPS: settings.fps,\n /** @type {number} */\n CENTERX: null,\n /** @type {number} */\n CENTERY: null,\n\n /** MATH API */\n /**\n * The value of the mathematical constant PI (\u03C0).\n * Approximately 3.14159\n *\n * @type {number}\n */\n PI,\n\n /**\n * Twice the value of the mathematical constant PI (\u03C0).\n * Approximately 6.28318\n *\n * Note: TWO_PI radians equals 360\u00B0, PI radians equals 180\u00B0,\n * HALF_PI radians equals 90\u00B0, and HALF_PI/2 radians equals 45\u00B0.\n *\n * @type {number}\n */\n TWO_PI,\n\n /**\n * Half the value of the mathematical constant PI (\u03C0).\n * Approximately 1.57079\n *\n * @type {number}\n */\n HALF_PI: PI * 0.5,\n\n /**\n * Calculates a linear (interpolation) value over t%.\n *\n * @param {number} start\n * @param {number} end\n * @param {number} t The progress in percentage, where 0 = 0% and 1 = 100%.\n * @returns {number} The unterpolated value\n * @tutorial https://gamedev.net/tutorials/programming/general-and-gameplay-programming/a-brief-introduction-to-lerp-r4954/\n */\n lerp: (start, end, t) => start + t * (end - start),\n\n /**\n * Convert degrees to radians\n *\n * @param {number} degs\n * @returns {number} the value in radians\n */\n deg2rad: (degs) => (PI / 180) * degs,\n\n /**\n * Convert radians to degrees\n *\n * @param {number} rads\n * @returns {number} the value in degrees\n */\n rad2deg: (rads) => (180 / PI) * rads,\n\n /**\n * Constrains a number between `min` and `max`.\n *\n * @param {number} value\n * @param {number} min\n * @param {number} max\n * @returns {number}\n */\n clamp: (value, min, max) => Math.min(Math.max(value, min), max),\n\n /**\n * Wraps a number between `min` (inclusive) and `max` (exclusive).\n *\n * @param {number} value\n * @param {number} min\n * @param {number} max\n * @returns {number}\n */\n wrap: (value, min, max) =>\n value - (max - min) * Math.floor((value - min) / (max - min)),\n\n /**\n * Re-maps a number from one range to another.\n *\n * @param {number} value the value to be remapped.\n * @param {number} min1 lower bound of the value's current range.\n * @param {number} max1 upper bound of the value's current range.\n * @param {number} min2 lower bound of the value's target range.\n * @param {number} max2 upper bound of the value's target range.\n * @param {boolean} [withinBounds=false] constrain the value to the newly mapped range\n * @returns {number} the remapped number\n */\n map(value, min1, max1, min2, max2, withinBounds = false) {\n // prettier-ignore\n const result = ((value - min1) / (max1 - min1)) * (max2 - min2) + min2\n return !withinBounds ? result : instance.clamp(result, min2, max2)\n },\n\n /**\n * Maps a number from one range to a value between 0 and 1.\n *\n * @param {number} value\n * @param {number} min\n * @param {number} min\n * @returns {number} the normalized number.\n */\n norm: (value, min, max) => instance.map(value, min, max, 0, 1),\n\n /** RNG API */\n /**\n * Generates a pseudorandom float between min (inclusive) and max (exclusive)\n *\n * @param {number} [min=0.0]\n * @param {number} [max=1.0]\n * @returns {number} the random number\n */\n rand: (min = 0.0, max = 1.0) => Math.random() * (max - min) + min,\n\n /**\n * Generates a pseudorandom integer between min (inclusive) and max (inclusive)\n *\n * @param {number} [min=0]\n * @param {number} [max=1]\n * @returns {number} the random number\n */\n randi: (min = 0, max = 1) =>\n instance.floor(instance.rand() * (max - min + 1) + min),\n\n /** BASIC GRAPHICS API */\n /**\n * Clear the game screen\n *\n * @param {number|null} color The background color (from 0 to 7) or null (for transparent)\n */\n cls(color) {\n if (null == color) {\n _ctx.clearRect(0, 0, instance.WIDTH, instance.HEIGHT)\n } else {\n instance.rectfill(0, 0, instance.WIDTH, instance.HEIGHT, color)\n }\n },\n\n /**\n * Draw a rectangle outline\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @param {number} [color=0] the color index (generally from 0 to 7)\n * @param {number|number[]} [radii] A number or list specifying the radii used to draw a rounded-borders rectangle\n */\n rect(x, y, width, height, color = 0, radii = null) {\n _ctx.beginPath()\n _ctx[radii ? 'roundRect' : 'rect'](\n ~~x,\n ~~y,\n ~~width,\n ~~height,\n radii\n )\n instance.stroke(color)\n },\n\n /**\n * Draw a color-filled rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @param {number} [color=0] the color index (generally from 0 to 7)\n * @param {number|number[]} [radii] A number or list specifying the radii used to draw a rounded-borders rectangle\n */\n rectfill(x, y, width, height, color = 0, radii = null) {\n _ctx.beginPath()\n _ctx[radii ? 'roundRect' : 'rect'](\n ~~x,\n ~~y,\n ~~width,\n ~~height,\n radii\n )\n instance.fill(color)\n },\n\n /**\n * Draw a circle outline\n *\n * @param {number} x\n * @param {number} y\n * @param {number} radius\n * @param {number} [color=0] the color index (generally from 0 to 7)\n */\n circ(x, y, radius, color = 0) {\n _ctx.beginPath()\n _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI)\n _ctx.closePath()\n instance.stroke(color)\n },\n\n /**\n * Draw a color-filled circle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} radius\n * @param {number} [color=0] the color index (generally from 0 to 7)\n */\n circfill(x, y, radius, color = 0) {\n _ctx.beginPath()\n _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI)\n _ctx.closePath()\n instance.fill(color)\n },\n\n /**\n * Draw a line\n *\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} [color=0] the color index (generally from 0 to 7)\n */\n line(x1, y1, x2, y2, color = 0) {\n _ctx.beginPath()\n _ctx.moveTo(~~x1, ~~y1)\n _ctx.lineTo(~~x2, ~~y2)\n instance.stroke(color)\n },\n\n /**\n * Sets the thickness of lines\n *\n * @param {number} value\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineWidth\n */\n linewidth(value) {\n _ctx.lineWidth = value\n },\n\n /**\n * Sets the line dash pattern used when drawing lines\n *\n * @param {number|number[]} segments the line dash pattern\n * @param {number} [offset=0] the line dash offset, or \"phase\".\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset\n */\n linedash(segments, offset = 0) {\n _ctx.setLineDash(Array.isArray(segments) ? segments : [segments])\n _ctx.lineDashOffset = offset\n },\n\n /** TEXT RENDERING API */\n /**\n * Draw text\n *\n * @param {number} x\n * @param {number} y\n * @param {string} text the text message\n * @param {number} [color=3] the color index (generally from 0 to 7)\n */\n text(x, y, text, color = 3) {\n _ctx.font = `${_fontStyle || ''} ${~~_fontSize}px ${_fontFamily}`\n _ctx.fillStyle = instance.getcolor(color)\n _ctx.fillText(text, ~~x, ~~y)\n },\n\n /**\n * Set the font family\n *\n * @param {string} fontFamily\n */\n textfont(fontFamily) {\n _fontFamily = fontFamily\n },\n\n /**\n * Set the font size\n *\n * @param {string} size\n */\n textsize(size) {\n _fontSize = size\n },\n\n /**\n * Sets whether a font should be styled with a normal, italic, or bold.\n *\n * @param {string} style\n */\n textstyle(style) {\n _fontStyle = style\n },\n\n /**\n * Sets the alignment used when drawing texts\n *\n * @param {string} align the horizontal alignment. Possible values: \"left\", \"right\", \"center\", \"start\" or \"end\"\n * @param {string} baseline the vertical alignment. Possible values: \"top\", \"bottom\", \"middle\", \"hanging\" or \"ideographic\"\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/textBaseline\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/textAlign\n */\n textalign(align, baseline) {\n _ctx.textAlign = _textAlign = align\n _ctx.textBaseline = _textBaseline = baseline\n },\n\n /**\n * Returns a TextMetrics object that contains information about the measured text (such as its width, for example)\n *\n * @param {string} text\n * @param {number} [size]\n * @returns {TextMetrics}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics\n */\n textmetrics(text, size) {\n // prettier-ignore\n _ctx.font = `${_fontStyle || ''} ${~~(size || _fontSize)}px ${_fontFamily}`\n metrics = _ctx.measureText(text)\n metrics.height =\n metrics.actualBoundingBoxAscent +\n metrics.actualBoundingBoxDescent\n return metrics\n },\n\n /** IMAGE GRAPHICS API */\n /**\n * Draw an image\n *\n * @param {number} x\n * @param {number} y\n * @param {OffscreenCanvas|HTMLImageElement|HTMLCanvasElement} image\n */\n image(x, y, image) {\n _ctx.drawImage(image, ~~x, ~~y)\n },\n\n /**\n * Creates a offscreen canvas to draw on it\n *\n * @param {number} width\n * @param {number} height\n * @param {string[]|drawCallback} draw\n * @param {{scale?:number}} [options]\n * @returns {OffscreenCanvas}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas\n */\n paint(width, height, draw, options = {}) {\n const offscreenCanvas = new OffscreenCanvas(width, height),\n ctxOriginal = _ctx,\n scale = options.scale || 1\n\n offscreenCanvas.width = width * scale\n offscreenCanvas.height = height * scale\n _ctx = offscreenCanvas.getContext('2d')\n\n _ctx.scale(scale, scale)\n\n // is pixelart?\n if (Array.isArray(draw)) {\n let x = 0,\n y = 0\n\n _ctx.imageSmoothingEnabled = false\n\n for (const str of draw) {\n for (const color of str) {\n if (' ' !== color && '.' !== color) {\n // support for 16-color palettes using hex (from 0 to f)\n instance.rectfill(x, y, 1, 1, parseInt(color, 16))\n }\n x++\n }\n y++\n x = 0\n }\n } else {\n draw(offscreenCanvas, _ctx)\n }\n\n _ctx = ctxOriginal // restore the context\n\n return offscreenCanvas\n },\n\n /** ADVANCED GRAPHICS API */\n /**\n * Get the canvas context\n *\n * @returns {CanvasRenderingContext2D}\n */\n ctx: () => _ctx,\n\n /**\n * saves the current drawing style settings and transformations\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/save\n */\n push: () => _ctx.save(),\n\n /**\n * restores the drawing style settings and transformations\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/restore\n */\n pop: () => _ctx.restore(),\n\n /**\n * Adds a translation transformation to the current matrix\n *\n * @param {number} x\n * @param {number} y\n */\n translate: (x, y) => _ctx.translate(x, y),\n\n /**\n * Adds a scaling transformation to the canvas units horizontally and/or vertically.\n *\n * @param {number} x\n * @param {number} [y]\n */\n scale: (x, y) => _ctx.scale(x, y || x),\n\n /**\n * Adds a rotation to the transformation matrix\n *\n * @param {number} radians\n */\n rotate: (radians) => _ctx.rotate(radians),\n\n /**\n * Adds a transformation that skews to the transformation matrix\n *\n * @param {number} a\n * @param {number} b\n * @param {number} c\n * @param {number} d\n * @param {number} e\n * @param {number} f\n * @param {boolean} [resetFirst=true] `false` to use _ctx.transform(); by default use _ctx.setTransform()\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setTransform\n */\n transform: (a, b, c, d, e, f, resetFirst = true) =>\n _ctx[resetFirst ? 'setTransform' : 'transform'](a, b, c, d, e, f),\n\n /**\n * Sets the alpha (transparency) value to apply when drawing new shapes and images\n *\n * @param {number} alpha float from 0 to 1 (e.g: 0.5 = 50% transparent)\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalAlpha\n */\n alpha(alpha) {\n _ctx.globalAlpha = alpha\n },\n\n /**\n * Returns a newly instantiated Path2D object, optionally with another\n * path as an argument (creates a copy), or optionally with a string\n * consisting of SVG path data.\n *\n * @param {Path2D|string} [arg]\n * @returns Path2D\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Path2D/Path2D\n */\n path: (arg) => new Path2D(arg),\n\n /**\n * Fills the current or given path with a given color.\n *\n * @param {number} color\n * @param {Path2D} [path]\n */\n fill(color, path) {\n _ctx.fillStyle = instance.getcolor(color)\n _ctx.fill(path)\n },\n\n /**\n * Outlines the current or given path with a given color.\n *\n * @param {number} color\n * @param {Path2D} [path]\n */\n stroke(color, path) {\n _ctx.strokeStyle = instance.getcolor(color)\n path ? _ctx.stroke(path) : _ctx.stroke()\n },\n\n /**\n * Create a retangular clipping region.\n *\n * Note: Clip paths cannot be reverted directly. You must save your\n * canvas state using push() before calling cliprect(), and restore it\n * once you have finished drawing in the clipped area using pop().\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/clip\n */\n cliprect(x, y, width, height) {\n _ctx.beginPath()\n _ctx.rect(x, y, width, height)\n _ctx.clip()\n },\n\n /**\n * Create a circular clipping region.\n *\n * Note: Clip paths cannot be reverted directly. You must save your\n * canvas state using push() before calling clipcirc(), and restore it\n * once you have finished drawing in the clipped area using pop().\n *\n * @param {number} x\n * @param {number} y\n * @param {number} radius\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/clip\n */\n clipcirc(x, y, radius) {\n _ctx.beginPath()\n _ctx.arc(x, y, radius, 0, TWO_PI)\n _ctx.clip()\n },\n\n /**\n * Sets the type of compositing operation to apply when drawing new shapes.\n * Default value = 'source-over'.\n *\n * @param {string} value\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n */\n blendmode(value) {\n _ctx.globalCompositeOperation = value\n },\n\n /** SOUND API */\n /**\n * Play a defined sound or a ZzFX array of params\n *\n * @param {number|number[]} [sound=0] the sound index (from 0 to 7) or a ZzFX array of params\n * @param {number} [volume=1]\n * @param {number} [pitch=0]\n * @param {number} [randomness=0]\n * @returns {AudioBufferSourceNode}\n * @see https://github.com/KilledByAPixel/ZzFX\n */\n sfx(sound = 0, volume = 1, pitch = 0, randomness = 0) {\n if (\n navigator.userActivation &&\n !navigator.userActivation.hasBeenActive\n ) {\n return\n }\n\n let z = Array.isArray(sound)\n ? sound\n : sounds[~~sound % sounds.length]\n if (volume !== 1 || pitch || randomness) {\n z = [...z] // clone the sound to not modify the original\n z[0] = (Number(volume) || 1) * (z[0] || 1)\n z[1] = randomness > 0 ? randomness : 0\n z[10] = ~~z[10] + ~~pitch\n }\n\n return zzfx(...z)\n },\n\n /** UTILS API */\n /**\n * Check a collision between two rectangles\n *\n * @param {number} x1 first rectangle position X\n * @param {number} y1 first rectangle position Y\n * @param {number} w1 first rectangle width\n * @param {number} h1 first rectangle height\n * @param {number} x2 second rectangle position X\n * @param {number} y2 second rectangle position Y\n * @param {number} w2 second rectangle width\n * @param {number} h2 second rectangle height\n * @returns {boolean}\n */\n colrect: (x1, y1, w1, h1, x2, y2, w2, h2) =>\n x1 < x2 + w2 && x1 + w1 > x2 && y1 < y2 + h2 && y1 + h1 > y2,\n\n /**\n * Check a collision between two circles\n *\n * @param {number} x1 first circle position X\n * @param {number} y1 first circle position Y\n * @param {number} r1 first circle position radius\n * @param {number} x2 second circle position X\n * @param {number} y2 second circle position Y\n * @param {number} r2 second circle position radius\n * @returns {boolean}\n */\n colcirc: (x1, y1, r1, x2, y2, r2) =>\n (x2 - x1) ** 2 + (y2 - y1) ** 2 <= (r1 + r2) ** 2,\n\n /**\n * Get the mouse position\n * @returns number[]\n */\n mousepos: () => [_mouseX, _mouseY],\n\n /**\n * The scale of the game's delta time (dt).\n * Values higher than 1 increase the speed of time, while values smaller than 1 decrease it.\n * A value of 0 freezes time and is effectively equivalent to pausing.\n *\n * @param {number} value\n */\n timescale(value) {\n _timeScale = value\n },\n\n /** PLUGINS API */\n /**\n * Prepares a plugin to be loaded\n *\n * @param {pluginCallback} callback\n */\n use(callback, config = {}) {\n callback.__conf = config\n _initialized ? loadPlugin(callback) : _plugins.push(callback)\n },\n\n /**\n * Add a game event listener\n *\n * @param {string} event the event type name\n * @param {function} callback the function that is called when the event occurs\n * @param {boolean} [highPriority=false] determines whether the callback will be called before or after the others\n * @returns {function} a function to remove the listener\n */\n listen(event, callback, highPriority = false) {\n _events[event] = _events[event] || []\n _events[event][highPriority ? 'unshift' : 'push'](callback)\n\n // return a function to remove this event listener\n return () => {\n _events[event] = _events[event].filter(\n (item) => item !== callback\n )\n }\n },\n\n /**\n * Call all listeners attached to a game event\n *\n * @param {string} event The game event type\n * @param {...any} args Arguments passed to all listeners\n */\n emit(event, ...args) {\n if (!_events[event]) return\n for (let i = 0; i < _events[event].length; ++i) {\n _events[event][i](...args)\n }\n },\n\n /**\n * Get a color by index\n *\n * @param {number} index The color number\n * @returns {string} the color code\n */\n getcolor: (index) => colors[~~index % colors.length],\n\n /**\n * Create or update a instance variable\n *\n * @param {string} key\n * @param {any} value\n */\n setvar(key, value) {\n instance[key] = value\n if (settings.global) {\n root[key] = value\n }\n },\n\n /**\n * Resizes the game canvas and emit the \"resized\" event\n *\n * @param {number} width\n * @param {number} height\n */\n resize(width, height) {\n instance.setvar('WIDTH', (_canvas.width = ~~width))\n instance.setvar('HEIGHT', (_canvas.height = ~~(height || width)))\n pageResized()\n },\n }\n\n /** Copy some functions from native `Math` object */\n for (const k of [\n 'sin',\n 'cos',\n 'atan2',\n 'hypot',\n 'tan',\n 'abs',\n 'ceil',\n 'round',\n 'floor',\n 'trunc',\n 'min',\n 'max',\n 'pow',\n 'sqrt',\n 'sign',\n 'exp',\n ]) {\n // import some native Math functions\n instance[k] = Math[k]\n }\n\n function init() {\n _initialized = true\n setupCanvas()\n\n // listen the default events\n const source = settings.loop ? settings.loop : root\n for (const event in _events) {\n if (source[event]) instance.listen(event, source[event])\n }\n\n // load plugins\n for (let i = 0; i < _plugins.length; i++) {\n loadPlugin(_plugins[i])\n }\n\n // listen window resize event\n on(root, 'resize', pageResized)\n pageResized()\n\n // default mouse/touch handlers\n if (settings.tapEvents) {\n const _getXY = (pageX, pageY) => [\n (pageX - _canvas.offsetLeft) / _scale,\n (pageY - _canvas.offsetTop) / _scale,\n ],\n _taps = new Map(),\n _registerTap = (id, x, y) => {\n const tap = {\n x,\n y,\n startX: x,\n startY: y,\n // timestamp\n ts: performance.now(),\n }\n _taps.set(id, tap)\n return tap\n },\n _updateTap = (id, x, y) => {\n const tap = _taps.get(id) || _registerTap(id)\n tap.x = x\n tap.y = y\n },\n _checkTapped = (tap) => tap && performance.now() - tap.ts <= 200\n\n let _pressingMouse = false\n\n on(_canvas, 'mousedown', (ev) => {\n ev.preventDefault()\n const [x, y] = _getXY(ev.pageX, ev.pageY)\n instance.emit('tap', x, y, 0)\n _registerTap(0, x, y)\n _pressingMouse = true\n })\n\n on(_canvas, 'mousemove', (ev) => {\n ev.preventDefault()\n const [x, y] = ([_mouseX, _mouseY] = _getXY(ev.pageX, ev.pageY))\n if (!_pressingMouse) return\n instance.emit('tapping', x, y, 0)\n _updateTap(0, x, y)\n })\n\n on(_canvas, 'mouseup', (ev) => {\n ev.preventDefault()\n const tap = _taps.get(0)\n const [x, y] = _getXY(ev.pageX, ev.pageY)\n if (_checkTapped(tap)) {\n instance.emit('tapped', tap.startX, tap.startY, 0)\n }\n instance.emit('untap', x, y, 0)\n _taps.delete(0)\n _pressingMouse = false\n })\n\n on(_canvas, 'touchstart', (ev) => {\n ev.preventDefault()\n /** @type {TouchList} touches */\n const touches = ev.changedTouches\n for (let i = 0; i < touches.length; i++) {\n const touch = touches[i]\n const [x, y] = _getXY(touch.pageX, touch.pageY)\n instance.emit('tap', x, y, touch.identifier + 1)\n _registerTap(touch.identifier + 1, x, y)\n }\n })\n\n on(_canvas, 'touchmove', (ev) => {\n ev.preventDefault()\n /** @type {TouchList} touches */\n const touches = ev.changedTouches\n for (let i = 0; i < touches.length; i++) {\n const touch = touches[i]\n const [x, y] = _getXY(touch.pageX, touch.pageY)\n instance.emit('tapping', x, y, touch.identifier + 1)\n _updateTap(touch.identifier + 1, x, y)\n }\n })\n\n const _touchEndHandler = (ev) => {\n ev.preventDefault()\n const existing = []\n\n if (ev.targetTouches.length > 0) {\n for (const touch of ev.targetTouches) {\n existing.push(touch.identifier + 1)\n }\n }\n\n for (const [id, tap] of _taps) {\n if (existing.includes(id)) continue\n if (_checkTapped(tap)) {\n instance.emit('tapped', tap.startX, tap.startY, id)\n }\n instance.emit('untap', tap.x, tap.y, id)\n _taps.delete(id)\n }\n }\n\n on(_canvas, 'touchend', _touchEndHandler)\n on(_canvas, 'touchcancel', _touchEndHandler)\n\n on(root, 'blur', () => {\n _pressingMouse = false\n\n if (_taps.size === 0) return\n\n for (const [id, tap] of _taps) {\n instance.emit('untap', tap.x, tap.y, id)\n _taps.delete(id)\n }\n })\n }\n\n // listen browser focus/blur events and pause the update/draw loop\n if (settings.pauseOnBlur) {\n on(root, 'blur', () => {\n _rafid = null\n })\n on(root, 'focus', () => {\n if (!_rafid) {\n _lastFrame = performance.now()\n _rafid = requestAnimationFrame(drawFrame)\n }\n })\n }\n\n // start the game loop\n instance.emit('init')\n _lastFrame = performance.now()\n _rafid = requestAnimationFrame(drawFrame)\n }\n\n /**\n * @param {number} now\n */\n function drawFrame(now) {\n let ticks = 0,\n t = now - _lastFrame\n\n _lastFrame = now\n _accumulated += t\n\n while (_accumulated >= _stepMs) {\n instance.emit('update', _step * _timeScale)\n instance.setvar('ELAPSED', instance.ELAPSED + _step * _timeScale)\n _accumulated -= _stepMs\n ticks++\n }\n\n if (ticks) {\n instance.emit('draw')\n _drawCount++\n _drawTime += _stepMs * ticks\n if (_drawTime + _accumulated >= 1000) {\n instance.setvar('FPS', _drawCount)\n _drawCount = 0\n _drawTime -= 1000\n }\n }\n\n if (_rafid) _rafid = requestAnimationFrame(drawFrame)\n }\n\n function setupCanvas() {\n _canvas =\n 'string' === typeof _canvas\n ? document.querySelector(_canvas)\n : _canvas\n\n instance.setvar('CANVAS', _canvas)\n _ctx = _canvas.getContext('2d')\n\n // disable fullscreen if a width is specified\n if (instance.WIDTH > 0) _fullscreen = false\n\n _canvas.width = instance.WIDTH\n _canvas.height = instance.HEIGHT || instance.WIDTH\n\n if (!_canvas.parentNode) document.body.appendChild(_canvas)\n\n // canvas CSS tweaks\n _canvas.style.display = 'block'\n if (_fullscreen) {\n _canvas.style.position = 'absolute'\n _canvas.style.inset = 0\n } else if (_autoscale) {\n _canvas.style.margin = 'auto'\n }\n }\n\n function pageResized() {\n if (_fullscreen) {\n _canvas.width = innerWidth\n _canvas.height = innerHeight\n instance.setvar('WIDTH', innerWidth)\n instance.setvar('HEIGHT', innerHeight)\n } else if (_autoscale) {\n _scale = Math.min(\n innerWidth / instance.WIDTH,\n innerHeight / instance.HEIGHT\n )\n _scale = settings.pixelart ? Math.floor(_scale) : _scale\n _canvas.style.width = instance.WIDTH * _scale + 'px'\n _canvas.style.height = instance.HEIGHT * _scale + 'px'\n }\n\n instance.setvar('CENTERX', instance.WIDTH / 2)\n instance.setvar('CENTERY', instance.HEIGHT / 2)\n\n // restore canvas image rendering properties\n if (!settings.antialias || settings.pixelart) {\n _ctx.imageSmoothingEnabled = false\n _canvas.style.imageRendering = 'pixelated'\n }\n\n // fix the font align and baseline\n instance.textalign(_textAlign, _textBaseline)\n\n instance.emit('resized', _scale)\n }\n\n /**\n * @param {pluginCallback} callback\n */\n function loadPlugin(callback) {\n const pluginData = callback(instance, _helpers, callback.__conf)\n if ('object' === typeof pluginData) {\n for (const key in pluginData) {\n instance.setvar(key, pluginData[key])\n }\n }\n }\n\n if (settings.global) {\n if (root.__litecanvas) {\n throw 'Cannot instantiate litecanvas globally twice'\n }\n Object.assign(root, instance)\n root.__litecanvas = true\n }\n\n if ('loading' === document.readyState) {\n on(root, 'DOMContentLoaded', init)\n } else {\n init()\n }\n\n return instance\n}\n\nroot.litecanvas = litecanvas\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["p", "k", "b", "e", "r", "t", "q", "D", "u", "y", "v", "z", "l", "E", "A", "c", "w", "m", "B", "N", "M", "d", "R", "G", "C", "g", "H", "a", "I", "J", "f", "h", "x", "L", "Z", "K", "O", "X", "Y", "P", "Q", "S", "T", "U", "V", "W", "colors", "sounds", "root", "litecanvas", "settings", "PI", "TWO_PI", "on", "elem", "evt", "callback", "_initialized", "_plugins", "_canvas", "_fullscreen", "_autoscale", "_scale", "_mouseX", "_mouseY", "_ctx", "_timeScale", "_lastFrame", "_step", "_stepMs", "_accumulated", "_rafid", "_drawCount", "_drawTime", "_fontFamily", "_fontStyle", "_fontSize", "
|
|
4
|
+
"sourcesContent": ["// ZzFXMicro - Zuper Zmall Zound Zynth - v1.3.0 by Frank Force | https://github.com/KilledByAPixel/ZzFX\nglobalThis.zzfxX = new AudioContext() // audio context\nglobalThis.zzfxV = 0.3 // global volume\nglobalThis.zzfx = (\n p = 1,\n k = 0.05,\n b = 220,\n e = 0,\n r = 0,\n t = 0.1,\n q = 0,\n D = 1,\n u = 0,\n y = 0,\n v = 0,\n z = 0,\n l = 0,\n E = 0,\n A = 0,\n F = 0,\n c = 0,\n w = 1,\n m = 0,\n B = 0,\n N = 0\n) => {\n let M = Math,\n d = 2 * M.PI,\n R = 44100,\n G = (u *= (500 * d) / R / R),\n C = (b *= ((1 - k + 2 * k * M.random((k = []))) * d) / R),\n g = 0,\n H = 0,\n a = 0,\n n = 1,\n I = 0,\n J = 0,\n f = 0,\n h = N < 0 ? -1 : 1,\n x = (d * h * N * 2) / R,\n L = M.cos(x),\n Z = M.sin,\n K = Z(x) / 4,\n O = 1 + K,\n X = (-2 * L) / O,\n Y = (1 - K) / O,\n P = (1 + h * L) / 2 / O,\n Q = -(h + L) / O,\n S = P,\n T = 0,\n U = 0,\n V = 0,\n W = 0\n e = R * e + 9\n m *= R\n r *= R\n t *= R\n c *= R\n y *= (500 * d) / R ** 3\n A *= d / R\n v *= d / R\n z *= R\n l = (R * l) | 0\n p *= zzfxV\n for (h = (e + m + r + t + c) | 0; a < h; k[a++] = f * p)\n ++J % ((100 * F) | 0) ||\n ((f = q\n ? 1 < q\n ? 2 < q\n ? 3 < q\n ? Z(g * g)\n : M.max(M.min(M.tan(g), 1), -1)\n : 1 - (((((2 * g) / d) % 2) + 2) % 2)\n : 1 - 4 * M.abs(M.round(g / d) - g / d)\n : Z(g)),\n (f =\n (l ? 1 - B + B * Z((d * a) / l) : 1) *\n (f < 0 ? -1 : 1) *\n M.abs(f) ** D *\n (a < e\n ? a / e\n : a < e + m\n ? 1 - ((a - e) / m) * (1 - w)\n : a < e + m + r\n ? w\n : a < h - c\n ? ((h - a - c) / t) * w\n : 0)),\n (f = c\n ? f / 2 +\n (c > a\n ? 0\n : ((a < h - c ? 1 : (h - a) / c) * k[(a - c) | 0]) /\n 2 /\n p)\n : f),\n N\n ? (f = W =\n S * T + Q * (T = U) + P * (U = f) - Y * V - X * (V = W))\n : 0),\n (x = (b += u += y) * M.cos(A * H++)),\n (g += x + x * E * Z(a ** 5)),\n n && ++n > z && ((b += v), (C += v), (n = 0)),\n !l || ++I % l || ((b = C), (u = G), (n = n || 1))\n p = zzfxX.createBuffer(1, h, R)\n p.getChannelData(0).set(k)\n b = zzfxX.createBufferSource()\n b.buffer = p\n b.connect(zzfxX.destination)\n b.start()\n}\n", "// Default colors inspired by https://lospec.com/palette-list/trirampo\nexport const colors = [\n '#18161c',\n '#6a7799',\n '#aec2c2',\n '#f3eade',\n\n '#f04f78',\n '#fcf660',\n '#2f328f',\n '#4b80ca',\n\n '#327345',\n '#63c64d',\n '#703075',\n '#a56243',\n]\n", "// prettier-ignore\nexport const sounds = [\n // 0 - pickup\n [0.8, 0, 2e3, 0.01, 0.05, , 1, 2, , , -600, 0.05, , , , , , 0.5, 0.05],\n // 1 - hit\n [0.5, 0, 375, 0.02, 0.01, 0.2, 1, , , , , , , 0.4, , 0.1, , 0.6, 0.1],\n // 2 - jump\n [, 0, 360, 0.01, , 0.08, 1, 1.7, 12, 32, , , , , , , , 0.63, 0.02, , 99],\n // 3 - warning\n [1.2, 0, 240, 0.02, 0.15, 0.15, 1, 4, , , , , 0.05, , , , , 0.6, 0.15],\n]\n", "/* litecanvas v0.44.0 | https://github.com/litecanvas/game-engine */\nimport './zzfx.js'\nimport { colors } from './palette.js'\nimport { sounds } from './sounds.js'\n\nconst root = globalThis\n\n/**\n * The litecanvas constructor\n *\n * @param {LitecanvasOptions} [settings]\n * @returns {LitecanvasInstance}\n */\nexport default function litecanvas(settings = {}) {\n // helpers\n const PI = Math.PI,\n TWO_PI = PI * 2,\n /** @type {(elem:HTMLElement, evt:string, callback:Function)=>void} */\n on = (elem, evt, callback) => elem.addEventListener(evt, callback),\n /** @type {LitecanvasOptions} */\n defaults = {\n fps: 60,\n fullscreen: true,\n width: null,\n height: null,\n autoscale: true,\n pixelart: false,\n antialias: true,\n canvas: null,\n global: true,\n loop: null,\n tapEvents: true,\n pauseOnBlur: true,\n defaultTextSize: 32,\n }\n\n // setup the settings default values\n settings = Object.assign(defaults, settings)\n\n let /** @type {boolean} */\n _initialized = false,\n /** @type {function[]} */\n _plugins = [],\n /** @type {HTMLCanvasElement|string} _canvas */\n _canvas = settings.canvas || document.createElement('canvas'),\n /** @type {boolean} */\n _fullscreen = settings.fullscreen,\n /** @type {boolean} */\n _autoscale = settings.autoscale,\n /** @type {number} */\n _scale = 1,\n /** @type {number?} */\n _mouseX,\n /** @type {number?} */\n _mouseY,\n /** @type {CanvasRenderingContext2D} */\n _ctx,\n /** @type {number} */\n _timeScale = 1,\n /** @type {number} */\n _lastFrame,\n /** @type {number} */\n _step = 1 / settings.fps,\n /** @type {number} */\n _stepMs = _step * 1000,\n /** @type {number} */\n _accumulated = 0,\n /** @type {number} */\n _rafid,\n /** @type {number} */\n _drawCount = 0,\n /** @type {number} */\n _drawTime = 0,\n /** @type {string} */\n _fontFamily = 'sans-serif',\n /** @type {string} */\n _fontStyle = '',\n /** @type {number} */\n _fontSize = settings.defaultTextSize,\n /**\n * default game events\n */\n _events = {\n init: false,\n update: false,\n draw: false,\n resized: false,\n tap: false,\n untap: false,\n tapping: false,\n tapped: false,\n },\n /**\n * Helpers to be used by plugins\n *\n * @type {LitecanvasPluginHelpers}\n */\n _helpers = {\n settings: Object.assign({}, settings),\n colors,\n sounds,\n }\n\n /** @type {LitecanvasInstance} */\n const instance = {\n /** @type {number} */\n WIDTH: settings.width,\n /** @type {number} */\n HEIGHT: settings.height || settings.width,\n /** @type {HTMLCanvasElement} */\n CANVAS: null,\n /** @type {number} */\n ELAPSED: 0,\n /** @type {number} */\n FPS: settings.fps,\n /** @type {number} */\n CENTERX: null,\n /** @type {number} */\n CENTERY: null,\n\n /** MATH API */\n /**\n * The value of the mathematical constant PI (\u03C0).\n * Approximately 3.14159\n *\n * @type {number}\n */\n PI,\n\n /**\n * Twice the value of the mathematical constant PI (\u03C0).\n * Approximately 6.28318\n *\n * Note: TWO_PI radians equals 360\u00B0, PI radians equals 180\u00B0,\n * HALF_PI radians equals 90\u00B0, and HALF_PI/2 radians equals 45\u00B0.\n *\n * @type {number}\n */\n TWO_PI,\n\n /**\n * Half the value of the mathematical constant PI (\u03C0).\n * Approximately 1.57079\n *\n * @type {number}\n */\n HALF_PI: PI * 0.5,\n\n /**\n * Calculates a linear (interpolation) value over t%.\n *\n * @param {number} start\n * @param {number} end\n * @param {number} t The progress in percentage, where 0 = 0% and 1 = 100%.\n * @returns {number} The unterpolated value\n * @tutorial https://gamedev.net/tutorials/programming/general-and-gameplay-programming/a-brief-introduction-to-lerp-r4954/\n */\n lerp: (start, end, t) => start + t * (end - start),\n\n /**\n * Convert degrees to radians\n *\n * @param {number} degs\n * @returns {number} the value in radians\n */\n deg2rad: (degs) => (PI / 180) * degs,\n\n /**\n * Convert radians to degrees\n *\n * @param {number} rads\n * @returns {number} the value in degrees\n */\n rad2deg: (rads) => (180 / PI) * rads,\n\n /**\n * Constrains a number between `min` and `max`.\n *\n * @param {number} value\n * @param {number} min\n * @param {number} max\n * @returns {number}\n */\n clamp: (value, min, max) => Math.min(Math.max(value, min), max),\n\n /**\n * Wraps a number between `min` (inclusive) and `max` (exclusive).\n *\n * @param {number} value\n * @param {number} min\n * @param {number} max\n * @returns {number}\n */\n wrap: (value, min, max) =>\n value - (max - min) * Math.floor((value - min) / (max - min)),\n\n /**\n * Re-maps a number from one range to another.\n *\n * @param {number} value the value to be remapped.\n * @param {number} min1 lower bound of the value's current range.\n * @param {number} max1 upper bound of the value's current range.\n * @param {number} min2 lower bound of the value's target range.\n * @param {number} max2 upper bound of the value's target range.\n * @param {boolean} [withinBounds=false] constrain the value to the newly mapped range\n * @returns {number} the remapped number\n */\n map(value, min1, max1, min2, max2, withinBounds = false) {\n // prettier-ignore\n const result = ((value - min1) / (max1 - min1)) * (max2 - min2) + min2\n return !withinBounds ? result : instance.clamp(result, min2, max2)\n },\n\n /**\n * Maps a number from one range to a value between 0 and 1.\n *\n * @param {number} value\n * @param {number} min\n * @param {number} min\n * @returns {number} the normalized number.\n */\n norm: (value, min, max) => instance.map(value, min, max, 0, 1),\n\n /** RNG API */\n /**\n * Generates a pseudorandom float between min (inclusive) and max (exclusive)\n *\n * @param {number} [min=0.0]\n * @param {number} [max=1.0]\n * @returns {number} the random number\n */\n rand: (min = 0.0, max = 1.0) => Math.random() * (max - min) + min,\n\n /**\n * Generates a pseudorandom integer between min (inclusive) and max (inclusive)\n *\n * @param {number} [min=0]\n * @param {number} [max=1]\n * @returns {number} the random number\n */\n randi: (min = 0, max = 1) =>\n instance.floor(instance.rand() * (max - min + 1) + min),\n\n /** BASIC GRAPHICS API */\n /**\n * Clear the game screen\n *\n * @param {number|null} color The background color (from 0 to 7) or null (for transparent)\n */\n cls(color) {\n if (null == color) {\n _ctx.clearRect(0, 0, instance.WIDTH, instance.HEIGHT)\n } else {\n instance.rectfill(0, 0, instance.WIDTH, instance.HEIGHT, color)\n }\n },\n\n /**\n * Draw a rectangle outline\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @param {number} [color=0] the color index (generally from 0 to 7)\n * @param {number|number[]} [radii] A number or list specifying the radii used to draw a rounded-borders rectangle\n */\n rect(x, y, width, height, color = 0, radii = null) {\n _ctx.beginPath()\n _ctx[radii ? 'roundRect' : 'rect'](~~x, ~~y, width, height, radii)\n instance.stroke(color)\n },\n\n /**\n * Draw a color-filled rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @param {number} [color=0] the color index (generally from 0 to 7)\n * @param {number|number[]} [radii] A number or list specifying the radii used to draw a rounded-borders rectangle\n */\n rectfill(x, y, width, height, color = 0, radii = null) {\n _ctx.beginPath()\n _ctx[radii ? 'roundRect' : 'rect'](~~x, ~~y, width, height, radii)\n instance.fill(color)\n },\n\n /**\n * Draw a circle outline\n *\n * @param {number} x\n * @param {number} y\n * @param {number} radius\n * @param {number} [color=0] the color index (generally from 0 to 7)\n */\n circ(x, y, radius, color = 0) {\n _ctx.beginPath()\n _ctx.arc(~~x, ~~y, radius, 0, TWO_PI)\n _ctx.closePath()\n instance.stroke(color)\n },\n\n /**\n * Draw a color-filled circle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} radius\n * @param {number} [color=0] the color index (generally from 0 to 7)\n */\n circfill(x, y, radius, color = 0) {\n _ctx.beginPath()\n _ctx.arc(~~x, ~~y, radius, 0, TWO_PI)\n _ctx.closePath()\n instance.fill(color)\n },\n\n /**\n * Draw a line\n *\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} [color=0] the color index (generally from 0 to 7)\n */\n line(x1, y1, x2, y2, color = 0) {\n _ctx.beginPath()\n _ctx.moveTo(~~x1, ~~y1)\n _ctx.lineTo(~~x2, ~~y2)\n instance.stroke(color)\n },\n\n /**\n * Sets the thickness of lines\n *\n * @param {number} value\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineWidth\n */\n linewidth(value) {\n _ctx.lineWidth = value\n },\n\n /**\n * Sets the line dash pattern used when drawing lines\n *\n * @param {number|number[]} segments the line dash pattern\n * @param {number} [offset=0] the line dash offset, or \"phase\".\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset\n */\n linedash(segments, offset = 0) {\n _ctx.setLineDash(Array.isArray(segments) ? segments : [segments])\n _ctx.lineDashOffset = offset\n },\n\n /** TEXT RENDERING API */\n /**\n * Draw text\n *\n * @param {number} x\n * @param {number} y\n * @param {string} text the text message\n * @param {number} [color=3] the color index (generally from 0 to 7)\n */\n text(x, y, text, color = 3) {\n _ctx.font = `${_fontStyle || ''} ${_fontSize}px ${_fontFamily}`\n _ctx.fillStyle = instance.getcolor(color)\n _ctx.fillText(text, ~~x, ~~y)\n },\n\n /**\n * Set the font family\n *\n * @param {string} fontFamily\n */\n textfont(fontFamily) {\n _fontFamily = fontFamily\n },\n\n /**\n * Set the font size\n *\n * @param {string} size\n */\n textsize(size) {\n _fontSize = size\n },\n\n /**\n * Sets whether a font should be styled with a normal, italic, or bold.\n *\n * @param {string} style\n */\n textstyle(style) {\n _fontStyle = style\n },\n\n /**\n * Sets the alignment used when drawing texts\n *\n * @param {string} align the horizontal alignment. Possible values: \"left\", \"right\", \"center\", \"start\" or \"end\"\n * @param {string} baseline the vertical alignment. Possible values: \"top\", \"bottom\", \"middle\", \"hanging\" or \"ideographic\"\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/textBaseline\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/textAlign\n */\n textalign(align, baseline) {\n if (align) _ctx.textAlign = align\n if (baseline) _ctx.textBaseline = baseline\n },\n\n /**\n * Returns a TextMetrics object that contains information about the measured text (such as its width, for example)\n *\n * @param {string} text\n * @param {number} [size]\n * @returns {TextMetrics}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics\n */\n textmetrics(text, size) {\n // prettier-ignore\n _ctx.font = `${_fontStyle || ''} ${(size || _fontSize)}px ${_fontFamily}`\n metrics = _ctx.measureText(text)\n metrics.height =\n metrics.actualBoundingBoxAscent +\n metrics.actualBoundingBoxDescent\n return metrics\n },\n\n /** IMAGE GRAPHICS API */\n /**\n * Draw an image\n *\n * @param {number} x\n * @param {number} y\n * @param {OffscreenCanvas|HTMLImageElement|HTMLCanvasElement} image\n */\n image(x, y, image) {\n _ctx.drawImage(image, ~~x, ~~y)\n },\n\n /**\n * Creates a offscreen canvas to draw on it\n *\n * @param {number} width\n * @param {number} height\n * @param {string[]|drawCallback} draw\n * @param {{scale?:number}} [options]\n * @returns {OffscreenCanvas}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas\n */\n paint(width, height, draw, options = {}) {\n const offscreenCanvas = new OffscreenCanvas(width, height),\n ctxOriginal = _ctx,\n scale = options.scale || 1\n\n offscreenCanvas.width = width * scale\n offscreenCanvas.height = height * scale\n _ctx = offscreenCanvas.getContext('2d')\n\n _ctx.scale(scale, scale)\n\n // is pixelart?\n if (Array.isArray(draw)) {\n let x = 0,\n y = 0\n\n _ctx.imageSmoothingEnabled = false\n\n for (const str of draw) {\n for (const color of str) {\n if (' ' !== color && '.' !== color) {\n // support for 16-color palettes using hex (from 0 to f)\n instance.rectfill(x, y, 1, 1, parseInt(color, 16))\n }\n x++\n }\n y++\n x = 0\n }\n } else {\n draw(offscreenCanvas, _ctx)\n }\n\n _ctx = ctxOriginal // restore the context\n\n return offscreenCanvas\n },\n\n /** ADVANCED GRAPHICS API */\n /**\n * Get the canvas context\n *\n * @returns {CanvasRenderingContext2D}\n */\n ctx: () => _ctx,\n\n /**\n * saves the current drawing style settings and transformations\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/save\n */\n push: () => _ctx.save(),\n\n /**\n * restores the drawing style settings and transformations\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/restore\n */\n pop: () => _ctx.restore(),\n\n /**\n * Adds a translation transformation to the current matrix\n *\n * @param {number} x\n * @param {number} y\n */\n translate: (x, y) => _ctx.translate(x, y),\n\n /**\n * Adds a scaling transformation to the canvas units horizontally and/or vertically.\n *\n * @param {number} x\n * @param {number} [y]\n */\n scale: (x, y) => _ctx.scale(x, y || x),\n\n /**\n * Adds a rotation to the transformation matrix\n *\n * @param {number} radians\n */\n rotate: (radians) => _ctx.rotate(radians),\n\n /**\n * Adds a transformation that skews to the transformation matrix\n *\n * @param {number} a\n * @param {number} b\n * @param {number} c\n * @param {number} d\n * @param {number} e\n * @param {number} f\n * @param {boolean} [resetFirst=true] `false` to use _ctx.transform(); by default use _ctx.setTransform()\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setTransform\n */\n transform: (a, b, c, d, e, f, resetFirst = true) =>\n _ctx[resetFirst ? 'setTransform' : 'transform'](a, b, c, d, e, f),\n\n /**\n * Sets the alpha (transparency) value to apply when drawing new shapes and images\n *\n * @param {number} alpha float from 0 to 1 (e.g: 0.5 = 50% transparent)\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalAlpha\n */\n alpha(alpha) {\n _ctx.globalAlpha = alpha\n },\n\n /**\n * Returns a newly instantiated Path2D object, optionally with another\n * path as an argument (creates a copy), or optionally with a string\n * consisting of SVG path data.\n *\n * @param {Path2D|string} [arg]\n * @returns Path2D\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Path2D/Path2D\n */\n path: (arg) => new Path2D(arg),\n\n /**\n * Fills the current or given path with a given color.\n *\n * @param {number} color\n * @param {Path2D} [path]\n */\n fill(color, path) {\n _ctx.fillStyle = instance.getcolor(color)\n _ctx.fill(path)\n },\n\n /**\n * Outlines the current or given path with a given color.\n *\n * @param {number} color\n * @param {Path2D} [path]\n */\n stroke(color, path) {\n _ctx.strokeStyle = instance.getcolor(color)\n path ? _ctx.stroke(path) : _ctx.stroke()\n },\n\n /**\n * Create a retangular clipping region.\n *\n * Note: Clip paths cannot be reverted directly. You must save your\n * canvas state using push() before calling cliprect(), and restore it\n * once you have finished drawing in the clipped area using pop().\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/clip\n */\n cliprect(x, y, width, height) {\n _ctx.beginPath()\n _ctx.rect(x, y, width, height)\n _ctx.clip()\n },\n\n /**\n * Create a circular clipping region.\n *\n * Note: Clip paths cannot be reverted directly. You must save your\n * canvas state using push() before calling clipcirc(), and restore it\n * once you have finished drawing in the clipped area using pop().\n *\n * @param {number} x\n * @param {number} y\n * @param {number} radius\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/clip\n */\n clipcirc(x, y, radius) {\n _ctx.beginPath()\n _ctx.arc(x, y, radius, 0, TWO_PI)\n _ctx.clip()\n },\n\n /**\n * Sets the type of compositing operation to apply when drawing new shapes.\n * Default value = 'source-over'.\n *\n * @param {string} value\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n */\n blendmode(value) {\n _ctx.globalCompositeOperation = value\n },\n\n /** SOUND API */\n /**\n * Play a defined sound or a ZzFX array of params\n *\n * @param {number|number[]} [sound=0] the sound index (from 0 to 7) or a ZzFX array of params\n * @param {number} [volume=1]\n * @param {number} [pitch=0]\n * @param {number} [randomness=0]\n * @returns {AudioBufferSourceNode}\n * @see https://github.com/KilledByAPixel/ZzFX\n */\n sfx(sound = 0, volume = 1, pitch = 0, randomness = 0) {\n if (\n navigator.userActivation &&\n !navigator.userActivation.hasBeenActive\n ) {\n return\n }\n\n let z = Array.isArray(sound) ? sound : sounds[sound % sounds.length]\n if (volume !== 1 || pitch || randomness) {\n z = [...z] // clone the sound to not modify the original\n z[0] = (Number(volume) || 1) * (z[0] || 1)\n z[1] = randomness > 0 ? randomness : 0\n z[10] = ~~z[10] + ~~pitch\n }\n\n return zzfx(...z)\n },\n\n /** UTILS API */\n /**\n * Check a collision between two rectangles\n *\n * @param {number} x1 first rectangle position X\n * @param {number} y1 first rectangle position Y\n * @param {number} w1 first rectangle width\n * @param {number} h1 first rectangle height\n * @param {number} x2 second rectangle position X\n * @param {number} y2 second rectangle position Y\n * @param {number} w2 second rectangle width\n * @param {number} h2 second rectangle height\n * @returns {boolean}\n */\n colrect: (x1, y1, w1, h1, x2, y2, w2, h2) =>\n x1 < x2 + w2 && x1 + w1 > x2 && y1 < y2 + h2 && y1 + h1 > y2,\n\n /**\n * Check a collision between two circles\n *\n * @param {number} x1 first circle position X\n * @param {number} y1 first circle position Y\n * @param {number} r1 first circle position radius\n * @param {number} x2 second circle position X\n * @param {number} y2 second circle position Y\n * @param {number} r2 second circle position radius\n * @returns {boolean}\n */\n colcirc: (x1, y1, r1, x2, y2, r2) =>\n (x2 - x1) ** 2 + (y2 - y1) ** 2 <= (r1 + r2) ** 2,\n\n /**\n * Get the mouse position\n * @returns number[]\n */\n mousepos: () => [_mouseX, _mouseY],\n\n /**\n * The scale of the game's delta time (dt).\n * Values higher than 1 increase the speed of time, while values smaller than 1 decrease it.\n * A value of 0 freezes time and is effectively equivalent to pausing.\n *\n * @param {number} value\n */\n timescale(value) {\n _timeScale = value\n },\n\n /** PLUGINS API */\n /**\n * Prepares a plugin to be loaded\n *\n * @param {pluginCallback} callback\n */\n use(callback, config = {}) {\n callback.__conf = config\n _initialized ? loadPlugin(callback) : _plugins.push(callback)\n },\n\n /**\n * Add a game event listener\n *\n * @param {string} event the event type name\n * @param {function} callback the function that is called when the event occurs\n * @param {boolean} [highPriority=false] determines whether the callback will be called before or after the others\n * @returns {function} a function to remove the listener\n */\n listen(event, callback, highPriority = false) {\n _events[event] = _events[event] || [[], []]\n const size = _events[event][highPriority ? 0 : 1].push(callback)\n\n // return a function to remove this event listener\n return () => {\n _events[event][highPriority ? 0 : 1].splice(size - 1, 1)\n }\n },\n\n /**\n * Call all listeners attached to a game event\n *\n * @param {string} event The game event type\n * @param {...any} args Arguments passed to all listeners\n */\n emit(event, ...args) {\n if (!_events[event]) return\n for (const list of _events[event]) {\n for (const callback of list) {\n callback(...args)\n }\n }\n },\n\n /**\n * Get a color by index\n *\n * @param {number} index The color number\n * @returns {string} the color code\n */\n getcolor: (index) => colors[~~index % colors.length],\n\n /**\n * Create or update a instance variable\n *\n * @param {string} key\n * @param {any} value\n */\n setvar(key, value) {\n instance[key] = value\n if (settings.global) {\n root[key] = value\n }\n },\n\n /**\n * Resizes the game canvas and emit the \"resized\" event\n *\n * @param {number} width\n * @param {number} height\n */\n resize(width, height) {\n instance.setvar('WIDTH', (_canvas.width = width))\n instance.setvar('HEIGHT', (_canvas.height = height || width))\n pageResized()\n },\n }\n\n /** Copy some functions from native `Math` object */\n for (const k of [\n 'sin',\n 'cos',\n 'atan2',\n 'hypot',\n 'tan',\n 'abs',\n 'ceil',\n 'round',\n 'floor',\n 'trunc',\n 'min',\n 'max',\n 'pow',\n 'sqrt',\n 'sign',\n 'exp',\n ]) {\n // import some native Math functions\n instance[k] = Math[k]\n }\n\n function init() {\n _initialized = true\n setupCanvas()\n\n // add listeners for default events\n const source = settings.loop ? settings.loop : root\n for (const event of Object.keys(_events)) {\n if (source[event]) instance.listen(event, source[event])\n }\n\n // load plugins\n for (const plugin of _plugins) {\n loadPlugin(plugin)\n }\n\n // listen window resize event\n on(root, 'resize', pageResized)\n pageResized()\n\n // default mouse/touch handlers\n if (settings.tapEvents) {\n const _getXY = (pageX, pageY) => [\n (pageX - _canvas.offsetLeft) / _scale,\n (pageY - _canvas.offsetTop) / _scale,\n ],\n _taps = new Map(),\n _registerTap = (id, x, y) => {\n const tap = {\n x,\n y,\n startX: x,\n startY: y,\n // timestamp\n ts: performance.now(),\n }\n _taps.set(id, tap)\n return tap\n },\n _updateTap = (id, x, y) => {\n const tap = _taps.get(id) || _registerTap(id)\n tap.x = x\n tap.y = y\n },\n _checkTapped = (tap) => tap && performance.now() - tap.ts <= 200\n\n let _pressingMouse = false\n\n on(_canvas, 'mousedown', (ev) => {\n ev.preventDefault()\n const [x, y] = _getXY(ev.pageX, ev.pageY)\n instance.emit('tap', x, y, 0)\n _registerTap(0, x, y)\n _pressingMouse = true\n })\n\n on(_canvas, 'mousemove', (ev) => {\n ev.preventDefault()\n const [x, y] = ([_mouseX, _mouseY] = _getXY(ev.pageX, ev.pageY))\n if (!_pressingMouse) return\n instance.emit('tapping', x, y, 0)\n _updateTap(0, x, y)\n })\n\n on(_canvas, 'mouseup', (ev) => {\n ev.preventDefault()\n const tap = _taps.get(0)\n const [x, y] = _getXY(ev.pageX, ev.pageY)\n if (_checkTapped(tap)) {\n instance.emit('tapped', tap.startX, tap.startY, 0)\n }\n instance.emit('untap', x, y, 0)\n _taps.delete(0)\n _pressingMouse = false\n })\n\n on(_canvas, 'touchstart', (ev) => {\n ev.preventDefault()\n /** @type {TouchList} touches */\n const touches = ev.changedTouches\n for (const touch of touches) {\n const [x, y] = _getXY(touch.pageX, touch.pageY)\n instance.emit('tap', x, y, touch.identifier + 1)\n _registerTap(touch.identifier + 1, x, y)\n }\n })\n\n on(_canvas, 'touchmove', (ev) => {\n ev.preventDefault()\n /** @type {TouchList} touches */\n const touches = ev.changedTouches\n for (const touch of touches) {\n const [x, y] = _getXY(touch.pageX, touch.pageY)\n instance.emit('tapping', x, y, touch.identifier + 1)\n _updateTap(touch.identifier + 1, x, y)\n }\n })\n\n const _touchEndHandler = (ev) => {\n ev.preventDefault()\n const existing = []\n\n if (ev.targetTouches.length > 0) {\n for (const touch of ev.targetTouches) {\n existing.push(touch.identifier + 1)\n }\n }\n\n for (const [id, tap] of _taps) {\n if (existing.includes(id)) continue\n if (_checkTapped(tap)) {\n instance.emit('tapped', tap.startX, tap.startY, id)\n }\n instance.emit('untap', tap.x, tap.y, id)\n _taps.delete(id)\n }\n }\n\n on(_canvas, 'touchend', _touchEndHandler)\n on(_canvas, 'touchcancel', _touchEndHandler)\n\n on(root, 'blur', () => {\n _pressingMouse = false\n\n if (_taps.size === 0) return\n\n for (const [id, tap] of _taps) {\n instance.emit('untap', tap.x, tap.y, id)\n _taps.delete(id)\n }\n })\n }\n\n // listen browser focus/blur events and pause the update/draw loop\n if (settings.pauseOnBlur) {\n on(root, 'blur', () => {\n _rafid = null\n })\n on(root, 'focus', () => {\n if (!_rafid) {\n _lastFrame = performance.now()\n _rafid = requestAnimationFrame(drawFrame)\n }\n })\n }\n\n // start the game loop\n instance.emit('init')\n _lastFrame = performance.now()\n _rafid = requestAnimationFrame(drawFrame)\n }\n\n /**\n * @param {number} now\n */\n function drawFrame(now) {\n let ticks = 0,\n t = now - _lastFrame\n\n _lastFrame = now\n _accumulated += t\n\n while (_accumulated >= _stepMs) {\n instance.emit('update', _step * _timeScale)\n instance.setvar('ELAPSED', instance.ELAPSED + _step * _timeScale)\n _accumulated -= _stepMs\n ticks++\n }\n\n if (ticks) {\n // default custom values for textAlign & textBaseline\n instance.textalign('start', 'top')\n\n instance.emit('draw')\n _drawCount++\n _drawTime += _stepMs * ticks\n if (_drawTime + _accumulated >= 1000) {\n instance.setvar('FPS', _drawCount)\n _drawCount = 0\n _drawTime -= 1000\n }\n }\n\n if (_rafid) _rafid = requestAnimationFrame(drawFrame)\n }\n\n function setupCanvas() {\n _canvas =\n 'string' === typeof _canvas\n ? document.querySelector(_canvas)\n : _canvas\n\n instance.setvar('CANVAS', _canvas)\n _ctx = _canvas.getContext('2d')\n\n // disable fullscreen if a width is specified\n if (instance.WIDTH > 0) _fullscreen = false\n\n _canvas.width = instance.WIDTH\n _canvas.height = instance.HEIGHT || instance.WIDTH\n\n if (!_canvas.parentNode) document.body.appendChild(_canvas)\n\n // canvas CSS tweaks\n _canvas.style.display = 'block'\n if (_fullscreen) {\n _canvas.style.position = 'absolute'\n _canvas.style.inset = 0\n } else if (_autoscale) {\n _canvas.style.margin = 'auto'\n }\n }\n\n function pageResized() {\n if (_fullscreen) {\n _canvas.width = innerWidth\n _canvas.height = innerHeight\n instance.setvar('WIDTH', innerWidth)\n instance.setvar('HEIGHT', innerHeight)\n } else if (_autoscale) {\n _scale = Math.min(\n innerWidth / instance.WIDTH,\n innerHeight / instance.HEIGHT\n )\n _scale = settings.pixelart ? Math.floor(_scale) : _scale\n _canvas.style.width = instance.WIDTH * _scale + 'px'\n _canvas.style.height = instance.HEIGHT * _scale + 'px'\n }\n\n instance.setvar('CENTERX', instance.WIDTH / 2)\n instance.setvar('CENTERY', instance.HEIGHT / 2)\n\n // restore canvas image rendering properties\n if (!settings.antialias || settings.pixelart) {\n _ctx.imageSmoothingEnabled = false\n _canvas.style.imageRendering = 'pixelated'\n }\n\n instance.emit('resized', _scale)\n }\n\n /**\n * @param {pluginCallback} callback\n */\n function loadPlugin(callback) {\n const pluginData = callback(instance, _helpers, callback.__conf)\n if ('object' === typeof pluginData) {\n for (const [key, value] of Object.entries(pluginData)) {\n instance.setvar(key, value)\n }\n }\n }\n\n if (settings.global) {\n if (root.__litecanvas) {\n throw 'Cannot instantiate litecanvas globally twice'\n }\n Object.assign(root, instance)\n root.__litecanvas = true\n }\n\n if ('loading' === document.readyState) {\n on(root, 'DOMContentLoaded', init)\n } else {\n init()\n }\n\n return instance\n}\n\nroot.litecanvas = litecanvas\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["p", "k", "b", "e", "r", "t", "q", "D", "u", "y", "v", "z", "l", "E", "A", "F", "c", "w", "m", "B", "N", "M", "d", "R", "G", "C", "g", "H", "a", "n", "I", "J", "f", "h", "x", "L", "Z", "K", "O", "X", "Y", "P", "Q", "S", "T", "U", "V", "W", "colors", "sounds", "root", "litecanvas", "settings", "PI", "TWO_PI", "on", "elem", "evt", "callback", "_initialized", "_plugins", "_canvas", "_fullscreen", "_autoscale", "_scale", "_mouseX", "_mouseY", "_ctx", "_timeScale", "_lastFrame", "_step", "_stepMs", "_accumulated", "_rafid", "_drawCount", "_drawTime", "_fontFamily", "_fontStyle", "_fontSize", "_events", "_helpers", "colors", "sounds", "instance", "start", "end", "t", "degs", "rads", "value", "min", "max", "min1", "max1", "min2", "max2", "withinBounds", "result", "color", "x", "y", "width", "height", "radii", "radius", "x1", "y1", "x2", "y2", "segments", "offset", "text", "fontFamily", "size", "style", "align", "baseline", "image", "draw", "options", "offscreenCanvas", "ctxOriginal", "scale", "str", "radians", "a", "b", "c", "d", "e", "f", "resetFirst", "alpha", "arg", "path", "sound", "volume", "pitch", "randomness", "z", "w1", "h1", "w2", "h2", "r1", "r2", "config", "loadPlugin", "event", "highPriority", "args", "list", "index", "key", "pageResized", "k", "init", "setupCanvas", "source", "plugin", "_getXY", "pageX", "pageY", "_taps", "_registerTap", "id", "tap", "_updateTap", "_checkTapped", "_pressingMouse", "ev", "touches", "touch", "_touchEndHandler", "existing", "drawFrame", "now", "ticks", "pluginData"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "litecanvas",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.44.0",
|
|
4
4
|
"description": "Lightweight HTML5 canvas engine suitable for small games and animations.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Luiz Bills <luizbills@pm.me>",
|
|
7
7
|
"contributors": [],
|
|
8
8
|
"devDependencies": {
|
|
9
|
+
"ava": "^6.1.3",
|
|
9
10
|
"esbuild": "^0.20.1"
|
|
10
11
|
},
|
|
11
12
|
"homepage": "https://litecanvas.github.io/about.html",
|
|
@@ -20,6 +21,8 @@
|
|
|
20
21
|
"main": "src/index.js",
|
|
21
22
|
"type": "module",
|
|
22
23
|
"scripts": {
|
|
24
|
+
"test": "ava",
|
|
25
|
+
"dev:test": "ava --watch",
|
|
23
26
|
"dev": "esbuild src/index.js --bundle --watch --outfile=dist/dist.js --servedir=.",
|
|
24
27
|
"build": "node script/build.js",
|
|
25
28
|
"gzip-size": "gzip -c dist/dist.min.js | wc -c | xargs printf \" Gzip size: %s bytes\n\"",
|
|
@@ -40,5 +43,11 @@
|
|
|
40
43
|
"dist",
|
|
41
44
|
"src",
|
|
42
45
|
"types"
|
|
43
|
-
]
|
|
46
|
+
],
|
|
47
|
+
"ava": {
|
|
48
|
+
"files": [
|
|
49
|
+
"tests/**/*",
|
|
50
|
+
"!tests/_mocks"
|
|
51
|
+
]
|
|
52
|
+
}
|
|
44
53
|
}
|
package/src/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/* litecanvas v0.
|
|
2
|
-
import './zzfx'
|
|
3
|
-
import { colors } from './palette'
|
|
4
|
-
import { sounds } from './sounds'
|
|
1
|
+
/* litecanvas v0.44.0 | https://github.com/litecanvas/game-engine */
|
|
2
|
+
import './zzfx.js'
|
|
3
|
+
import { colors } from './palette.js'
|
|
4
|
+
import { sounds } from './sounds.js'
|
|
5
5
|
|
|
6
6
|
const root = globalThis
|
|
7
7
|
|
|
@@ -23,14 +23,15 @@ export default function litecanvas(settings = {}) {
|
|
|
23
23
|
fullscreen: true,
|
|
24
24
|
width: null,
|
|
25
25
|
height: null,
|
|
26
|
-
pauseOnBlur: true,
|
|
27
26
|
autoscale: true,
|
|
28
27
|
pixelart: false,
|
|
29
28
|
antialias: true,
|
|
30
29
|
canvas: null,
|
|
31
30
|
global: true,
|
|
32
|
-
tapEvents: true,
|
|
33
31
|
loop: null,
|
|
32
|
+
tapEvents: true,
|
|
33
|
+
pauseOnBlur: true,
|
|
34
|
+
defaultTextSize: 32,
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
// setup the settings default values
|
|
@@ -75,23 +76,19 @@ export default function litecanvas(settings = {}) {
|
|
|
75
76
|
/** @type {string} */
|
|
76
77
|
_fontStyle = '',
|
|
77
78
|
/** @type {number} */
|
|
78
|
-
_fontSize =
|
|
79
|
-
/** @type {string} */
|
|
80
|
-
_textAlign = 'start',
|
|
81
|
-
/** @type {string} */
|
|
82
|
-
_textBaseline = 'top',
|
|
79
|
+
_fontSize = settings.defaultTextSize,
|
|
83
80
|
/**
|
|
84
81
|
* default game events
|
|
85
82
|
*/
|
|
86
83
|
_events = {
|
|
87
|
-
init:
|
|
88
|
-
update:
|
|
89
|
-
draw:
|
|
90
|
-
resized:
|
|
91
|
-
tap:
|
|
92
|
-
untap:
|
|
93
|
-
tapping:
|
|
94
|
-
tapped:
|
|
84
|
+
init: false,
|
|
85
|
+
update: false,
|
|
86
|
+
draw: false,
|
|
87
|
+
resized: false,
|
|
88
|
+
tap: false,
|
|
89
|
+
untap: false,
|
|
90
|
+
tapping: false,
|
|
91
|
+
tapped: false,
|
|
95
92
|
},
|
|
96
93
|
/**
|
|
97
94
|
* Helpers to be used by plugins
|
|
@@ -270,13 +267,7 @@ export default function litecanvas(settings = {}) {
|
|
|
270
267
|
*/
|
|
271
268
|
rect(x, y, width, height, color = 0, radii = null) {
|
|
272
269
|
_ctx.beginPath()
|
|
273
|
-
_ctx[radii ? 'roundRect' : 'rect'](
|
|
274
|
-
~~x,
|
|
275
|
-
~~y,
|
|
276
|
-
~~width,
|
|
277
|
-
~~height,
|
|
278
|
-
radii
|
|
279
|
-
)
|
|
270
|
+
_ctx[radii ? 'roundRect' : 'rect'](~~x, ~~y, width, height, radii)
|
|
280
271
|
instance.stroke(color)
|
|
281
272
|
},
|
|
282
273
|
|
|
@@ -292,13 +283,7 @@ export default function litecanvas(settings = {}) {
|
|
|
292
283
|
*/
|
|
293
284
|
rectfill(x, y, width, height, color = 0, radii = null) {
|
|
294
285
|
_ctx.beginPath()
|
|
295
|
-
_ctx[radii ? 'roundRect' : 'rect'](
|
|
296
|
-
~~x,
|
|
297
|
-
~~y,
|
|
298
|
-
~~width,
|
|
299
|
-
~~height,
|
|
300
|
-
radii
|
|
301
|
-
)
|
|
286
|
+
_ctx[radii ? 'roundRect' : 'rect'](~~x, ~~y, width, height, radii)
|
|
302
287
|
instance.fill(color)
|
|
303
288
|
},
|
|
304
289
|
|
|
@@ -312,7 +297,7 @@ export default function litecanvas(settings = {}) {
|
|
|
312
297
|
*/
|
|
313
298
|
circ(x, y, radius, color = 0) {
|
|
314
299
|
_ctx.beginPath()
|
|
315
|
-
_ctx.arc(~~x, ~~y,
|
|
300
|
+
_ctx.arc(~~x, ~~y, radius, 0, TWO_PI)
|
|
316
301
|
_ctx.closePath()
|
|
317
302
|
instance.stroke(color)
|
|
318
303
|
},
|
|
@@ -327,7 +312,7 @@ export default function litecanvas(settings = {}) {
|
|
|
327
312
|
*/
|
|
328
313
|
circfill(x, y, radius, color = 0) {
|
|
329
314
|
_ctx.beginPath()
|
|
330
|
-
_ctx.arc(~~x, ~~y,
|
|
315
|
+
_ctx.arc(~~x, ~~y, radius, 0, TWO_PI)
|
|
331
316
|
_ctx.closePath()
|
|
332
317
|
instance.fill(color)
|
|
333
318
|
},
|
|
@@ -381,7 +366,7 @@ export default function litecanvas(settings = {}) {
|
|
|
381
366
|
* @param {number} [color=3] the color index (generally from 0 to 7)
|
|
382
367
|
*/
|
|
383
368
|
text(x, y, text, color = 3) {
|
|
384
|
-
_ctx.font = `${_fontStyle || ''} ${
|
|
369
|
+
_ctx.font = `${_fontStyle || ''} ${_fontSize}px ${_fontFamily}`
|
|
385
370
|
_ctx.fillStyle = instance.getcolor(color)
|
|
386
371
|
_ctx.fillText(text, ~~x, ~~y)
|
|
387
372
|
},
|
|
@@ -422,8 +407,8 @@ export default function litecanvas(settings = {}) {
|
|
|
422
407
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/textAlign
|
|
423
408
|
*/
|
|
424
409
|
textalign(align, baseline) {
|
|
425
|
-
_ctx.textAlign =
|
|
426
|
-
_ctx.textBaseline =
|
|
410
|
+
if (align) _ctx.textAlign = align
|
|
411
|
+
if (baseline) _ctx.textBaseline = baseline
|
|
427
412
|
},
|
|
428
413
|
|
|
429
414
|
/**
|
|
@@ -436,7 +421,7 @@ export default function litecanvas(settings = {}) {
|
|
|
436
421
|
*/
|
|
437
422
|
textmetrics(text, size) {
|
|
438
423
|
// prettier-ignore
|
|
439
|
-
_ctx.font = `${_fontStyle || ''} ${
|
|
424
|
+
_ctx.font = `${_fontStyle || ''} ${(size || _fontSize)}px ${_fontFamily}`
|
|
440
425
|
metrics = _ctx.measureText(text)
|
|
441
426
|
metrics.height =
|
|
442
427
|
metrics.actualBoundingBoxAscent +
|
|
@@ -672,9 +657,7 @@ export default function litecanvas(settings = {}) {
|
|
|
672
657
|
return
|
|
673
658
|
}
|
|
674
659
|
|
|
675
|
-
let z = Array.isArray(sound)
|
|
676
|
-
? sound
|
|
677
|
-
: sounds[~~sound % sounds.length]
|
|
660
|
+
let z = Array.isArray(sound) ? sound : sounds[sound % sounds.length]
|
|
678
661
|
if (volume !== 1 || pitch || randomness) {
|
|
679
662
|
z = [...z] // clone the sound to not modify the original
|
|
680
663
|
z[0] = (Number(volume) || 1) * (z[0] || 1)
|
|
@@ -753,14 +736,12 @@ export default function litecanvas(settings = {}) {
|
|
|
753
736
|
* @returns {function} a function to remove the listener
|
|
754
737
|
*/
|
|
755
738
|
listen(event, callback, highPriority = false) {
|
|
756
|
-
_events[event] = _events[event] || []
|
|
757
|
-
_events[event][highPriority ?
|
|
739
|
+
_events[event] = _events[event] || [[], []]
|
|
740
|
+
const size = _events[event][highPriority ? 0 : 1].push(callback)
|
|
758
741
|
|
|
759
742
|
// return a function to remove this event listener
|
|
760
743
|
return () => {
|
|
761
|
-
_events[event]
|
|
762
|
-
(item) => item !== callback
|
|
763
|
-
)
|
|
744
|
+
_events[event][highPriority ? 0 : 1].splice(size - 1, 1)
|
|
764
745
|
}
|
|
765
746
|
},
|
|
766
747
|
|
|
@@ -772,8 +753,10 @@ export default function litecanvas(settings = {}) {
|
|
|
772
753
|
*/
|
|
773
754
|
emit(event, ...args) {
|
|
774
755
|
if (!_events[event]) return
|
|
775
|
-
for (
|
|
776
|
-
|
|
756
|
+
for (const list of _events[event]) {
|
|
757
|
+
for (const callback of list) {
|
|
758
|
+
callback(...args)
|
|
759
|
+
}
|
|
777
760
|
}
|
|
778
761
|
},
|
|
779
762
|
|
|
@@ -805,8 +788,8 @@ export default function litecanvas(settings = {}) {
|
|
|
805
788
|
* @param {number} height
|
|
806
789
|
*/
|
|
807
790
|
resize(width, height) {
|
|
808
|
-
instance.setvar('WIDTH', (_canvas.width =
|
|
809
|
-
instance.setvar('HEIGHT', (_canvas.height =
|
|
791
|
+
instance.setvar('WIDTH', (_canvas.width = width))
|
|
792
|
+
instance.setvar('HEIGHT', (_canvas.height = height || width))
|
|
810
793
|
pageResized()
|
|
811
794
|
},
|
|
812
795
|
}
|
|
@@ -838,15 +821,15 @@ export default function litecanvas(settings = {}) {
|
|
|
838
821
|
_initialized = true
|
|
839
822
|
setupCanvas()
|
|
840
823
|
|
|
841
|
-
//
|
|
824
|
+
// add listeners for default events
|
|
842
825
|
const source = settings.loop ? settings.loop : root
|
|
843
|
-
for (const event
|
|
826
|
+
for (const event of Object.keys(_events)) {
|
|
844
827
|
if (source[event]) instance.listen(event, source[event])
|
|
845
828
|
}
|
|
846
829
|
|
|
847
830
|
// load plugins
|
|
848
|
-
for (
|
|
849
|
-
loadPlugin(
|
|
831
|
+
for (const plugin of _plugins) {
|
|
832
|
+
loadPlugin(plugin)
|
|
850
833
|
}
|
|
851
834
|
|
|
852
835
|
// listen window resize event
|
|
@@ -913,8 +896,7 @@ export default function litecanvas(settings = {}) {
|
|
|
913
896
|
ev.preventDefault()
|
|
914
897
|
/** @type {TouchList} touches */
|
|
915
898
|
const touches = ev.changedTouches
|
|
916
|
-
for (
|
|
917
|
-
const touch = touches[i]
|
|
899
|
+
for (const touch of touches) {
|
|
918
900
|
const [x, y] = _getXY(touch.pageX, touch.pageY)
|
|
919
901
|
instance.emit('tap', x, y, touch.identifier + 1)
|
|
920
902
|
_registerTap(touch.identifier + 1, x, y)
|
|
@@ -925,8 +907,7 @@ export default function litecanvas(settings = {}) {
|
|
|
925
907
|
ev.preventDefault()
|
|
926
908
|
/** @type {TouchList} touches */
|
|
927
909
|
const touches = ev.changedTouches
|
|
928
|
-
for (
|
|
929
|
-
const touch = touches[i]
|
|
910
|
+
for (const touch of touches) {
|
|
930
911
|
const [x, y] = _getXY(touch.pageX, touch.pageY)
|
|
931
912
|
instance.emit('tapping', x, y, touch.identifier + 1)
|
|
932
913
|
_updateTap(touch.identifier + 1, x, y)
|
|
@@ -1005,6 +986,9 @@ export default function litecanvas(settings = {}) {
|
|
|
1005
986
|
}
|
|
1006
987
|
|
|
1007
988
|
if (ticks) {
|
|
989
|
+
// default custom values for textAlign & textBaseline
|
|
990
|
+
instance.textalign('start', 'top')
|
|
991
|
+
|
|
1008
992
|
instance.emit('draw')
|
|
1009
993
|
_drawCount++
|
|
1010
994
|
_drawTime += _stepMs * ticks
|
|
@@ -1070,9 +1054,6 @@ export default function litecanvas(settings = {}) {
|
|
|
1070
1054
|
_canvas.style.imageRendering = 'pixelated'
|
|
1071
1055
|
}
|
|
1072
1056
|
|
|
1073
|
-
// fix the font align and baseline
|
|
1074
|
-
instance.textalign(_textAlign, _textBaseline)
|
|
1075
|
-
|
|
1076
1057
|
instance.emit('resized', _scale)
|
|
1077
1058
|
}
|
|
1078
1059
|
|
|
@@ -1082,8 +1063,8 @@ export default function litecanvas(settings = {}) {
|
|
|
1082
1063
|
function loadPlugin(callback) {
|
|
1083
1064
|
const pluginData = callback(instance, _helpers, callback.__conf)
|
|
1084
1065
|
if ('object' === typeof pluginData) {
|
|
1085
|
-
for (const key
|
|
1086
|
-
instance.setvar(key,
|
|
1066
|
+
for (const [key, value] of Object.entries(pluginData)) {
|
|
1067
|
+
instance.setvar(key, value)
|
|
1087
1068
|
}
|
|
1088
1069
|
}
|
|
1089
1070
|
}
|
package/src/types.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @typedef LitecanvasOptions
|
|
3
3
|
* @type {object}
|
|
4
|
-
* @property {number} [fps=60]
|
|
4
|
+
* @property {number} [fps=60]
|
|
5
5
|
* @property {boolean} [fullscreen=true]
|
|
6
6
|
* @property {number} [width]
|
|
7
7
|
* @property {number} [height]
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* @property {boolean} [global=true]
|
|
14
14
|
* @property {boolean} [tapEvents=true]
|
|
15
15
|
* @property {LitecanvasGameLoop} [loop]
|
|
16
|
+
* @property {number} [defaultTextSize=32]
|
|
16
17
|
*/
|
|
17
18
|
|
|
18
19
|
/**
|
package/src/zzfx.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ZzFXMicro - Zuper Zmall Zound Zynth - v1.3.0 by Frank Force | https://github.com/KilledByAPixel/ZzFX
|
|
2
|
-
zzfxX = new AudioContext() // audio context
|
|
3
|
-
zzfxV = 0.3 // global volume
|
|
4
|
-
zzfx = (
|
|
2
|
+
globalThis.zzfxX = new AudioContext() // audio context
|
|
3
|
+
globalThis.zzfxV = 0.3 // global volume
|
|
4
|
+
globalThis.zzfx = (
|
|
5
5
|
p = 1,
|
|
6
6
|
k = 0.05,
|
|
7
7
|
b = 220,
|
|
@@ -80,12 +80,12 @@ zzfx = (
|
|
|
80
80
|
(a < e
|
|
81
81
|
? a / e
|
|
82
82
|
: a < e + m
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
83
|
+
? 1 - ((a - e) / m) * (1 - w)
|
|
84
|
+
: a < e + m + r
|
|
85
|
+
? w
|
|
86
|
+
: a < h - c
|
|
87
|
+
? ((h - a - c) / t) * w
|
|
88
|
+
: 0)),
|
|
89
89
|
(f = c
|
|
90
90
|
? f / 2 +
|
|
91
91
|
(c > a
|
package/types/types.d.ts
CHANGED