litecanvas 0.82.0 → 0.83.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.dev.js CHANGED
@@ -854,6 +854,7 @@
854
854
  "function" === typeof callback,
855
855
  "listen: 2nd param must be a function"
856
856
  );
857
+ eventName = eventName.toLowerCase();
857
858
  _events[eventName] = _events[eventName] || /* @__PURE__ */ new Set();
858
859
  _events[eventName].add(callback);
859
860
  return () => _events[eventName].delete(callback);
@@ -873,6 +874,7 @@
873
874
  "emit: 1st param must be a string"
874
875
  );
875
876
  if (_initialized) {
877
+ eventName = eventName.toLowerCase();
876
878
  triggerEvent("before:" + eventName, arg1, arg2, arg3, arg4);
877
879
  triggerEvent(eventName, arg1, arg2, arg3, arg4);
878
880
  triggerEvent("after:" + eventName, arg1, arg2, arg3, arg4);
@@ -974,7 +976,9 @@
974
976
  // 11
975
977
  _fontFamily
976
978
  ];
977
- return list[n];
979
+ const data = { index: n, value: list[n] };
980
+ instance.emit("stat", data);
981
+ return data.value;
978
982
  },
979
983
  /**
980
984
  * Stops the litecanvas instance and remove all event listeners.
@@ -1142,25 +1146,24 @@
1142
1146
  });
1143
1147
  }
1144
1148
  if (settings.keyboardEvents) {
1145
- const toLowerCase = (s) => s.toLowerCase();
1146
1149
  const _keysDown = /* @__PURE__ */ new Set();
1147
1150
  const _keysPress = /* @__PURE__ */ new Set();
1148
- const keyCheck = (keysSet, key) => {
1149
- return !key ? keysSet.size > 0 : keysSet.has(
1150
- "space" === toLowerCase(key) ? " " : toLowerCase(key)
1151
- );
1151
+ const keyCheck = (keySet, key = "") => {
1152
+ key = key.toLowerCase();
1153
+ return !key ? keySet.size > 0 : keySet.has("space" === key ? " " : key);
1152
1154
  };
1153
1155
  on(root, "keydown", (event) => {
1154
- if (!_keysDown.has(toLowerCase(event.key))) {
1155
- _keysDown.add(toLowerCase(event.key));
1156
- _keysPress.add(toLowerCase(event.key));
1156
+ const key = event.key.toLowerCase();
1157
+ if (!_keysDown.has(key)) {
1158
+ _keysDown.add(key);
1159
+ _keysPress.add(key);
1157
1160
  }
1158
1161
  });
1159
1162
  on(root, "keyup", (event) => {
1160
- _keysDown.delete(toLowerCase(event.key));
1163
+ _keysDown.delete(event.key.toLowerCase());
1161
1164
  });
1162
1165
  on(root, "blur", () => _keysDown.clear());
1163
- instance.listen("after:draw", () => _keysPress.clear());
1166
+ instance.listen("after:update", () => _keysPress.clear());
1164
1167
  instance.def(
1165
1168
  "iskeydown",
1166
1169
  /**
package/dist/dist.js CHANGED
@@ -610,6 +610,7 @@
610
610
  * @returns {Function} a function to remove the listener
611
611
  */
612
612
  listen(eventName, callback) {
613
+ eventName = eventName.toLowerCase();
613
614
  _events[eventName] = _events[eventName] || /* @__PURE__ */ new Set();
614
615
  _events[eventName].add(callback);
615
616
  return () => _events[eventName].delete(callback);
@@ -625,6 +626,7 @@
625
626
  */
626
627
  emit(eventName, arg1, arg2, arg3, arg4) {
627
628
  if (_initialized) {
629
+ eventName = eventName.toLowerCase();
628
630
  triggerEvent("before:" + eventName, arg1, arg2, arg3, arg4);
629
631
  triggerEvent(eventName, arg1, arg2, arg3, arg4);
630
632
  triggerEvent("after:" + eventName, arg1, arg2, arg3, arg4);
@@ -701,7 +703,9 @@
701
703
  // 11
702
704
  _fontFamily
703
705
  ];
704
- return list[n];
706
+ const data = { index: n, value: list[n] };
707
+ instance.emit("stat", data);
708
+ return data.value;
705
709
  },
706
710
  /**
707
711
  * Stops the litecanvas instance and remove all event listeners.
@@ -869,25 +873,24 @@
869
873
  });
870
874
  }
871
875
  if (settings.keyboardEvents) {
872
- const toLowerCase = (s) => s.toLowerCase();
873
876
  const _keysDown = /* @__PURE__ */ new Set();
874
877
  const _keysPress = /* @__PURE__ */ new Set();
875
- const keyCheck = (keysSet, key) => {
876
- return !key ? keysSet.size > 0 : keysSet.has(
877
- "space" === toLowerCase(key) ? " " : toLowerCase(key)
878
- );
878
+ const keyCheck = (keySet, key = "") => {
879
+ key = key.toLowerCase();
880
+ return !key ? keySet.size > 0 : keySet.has("space" === key ? " " : key);
879
881
  };
880
882
  on(root, "keydown", (event) => {
881
- if (!_keysDown.has(toLowerCase(event.key))) {
882
- _keysDown.add(toLowerCase(event.key));
883
- _keysPress.add(toLowerCase(event.key));
883
+ const key = event.key.toLowerCase();
884
+ if (!_keysDown.has(key)) {
885
+ _keysDown.add(key);
886
+ _keysPress.add(key);
884
887
  }
885
888
  });
886
889
  on(root, "keyup", (event) => {
887
- _keysDown.delete(toLowerCase(event.key));
890
+ _keysDown.delete(event.key.toLowerCase());
888
891
  });
889
892
  on(root, "blur", () => _keysDown.clear());
890
- instance.listen("after:draw", () => _keysPress.clear());
893
+ instance.listen("after:update", () => _keysPress.clear());
891
894
  instance.def(
892
895
  "iskeydown",
893
896
  /**
package/dist/dist.min.js CHANGED
@@ -1 +1 @@
1
- (()=>{var e=new AudioContext,t=(t=1,a=.05,l=220,n=0,i=0,o=.1,r=0,s=1,f=0,c=0,d=0,p=0,u=0,h=0,g=0,m=0,b=0,w=1,x=0,v=0,y=0)=>{let k=Math,E=2*k.PI,T=f*=500*E/44100/44100,C=l*=(1-a+2*a*k.random(a=[]))*E/44100,z=0,A=0,I=0,P=1,S=0,X=0,Y=0,M=y<0?-1:1,N=E*M*y*2/44100,H=k.cos(N),W=k.sin,D=W(N)/4,L=1+D,F=-2*H/L,V=(1-D)/L,q=(1+M*H)/2/L,B=-(M+H)/L,O=0,R=0,G=0,$=0;for(n=44100*n+9,x*=44100,i*=44100,o*=44100,b*=44100,c*=500*E/85766121e6,g*=E/44100,d*=E/44100,p*=44100,u=44100*u|0,t*=.3*(globalThis.zzfxV||1),M=n+x+i+o+b|0;I<M;a[I++]=Y*t)++X%(100*m|0)||(Y=r?1<r?2<r?3<r?W(z*z):k.max(k.min(k.tan(z),1),-1):1-(2*z/E%2+2)%2:1-4*k.abs(k.round(z/E)-z/E):W(z),Y=(u?1-v+v*W(E*I/u):1)*(Y<0?-1:1)*k.abs(Y)**s*(I<n?I/n:I<n+x?1-(I-n)/x*(1-w):I<n+x+i?w:I<M-b?(M-I-b)/o*w:0),Y=b?Y/2+(b>I?0:(I<M-b?1:(M-I)/b)*a[I-b|0]/2/t):Y,y&&(Y=$=q*O+B*(O=R)+q*(R=Y)-V*G-F*(G=$))),z+=(N=(l+=f+=c)*k.cos(g*A++))+N*h*W(I**5),P&&++P>p&&(l+=d,C+=d,P=0),!u||++S%u||(l=C,f=T,P=P||1);(t=e.createBuffer(1,M,44100)).getChannelData(0).set(a),(l=e.createBufferSource()).buffer=t,l.connect(e.destination),l.start()},a=["#111","#6a7799","#aec2c2","#FFF1E8","#e83b3b","#fabc20","#155fd9","#3cbcfc","#327345","#63c64d","#6c2c1f","#ac7c00"];globalThis.litecanvas=function(e={}){let l=globalThis,n=Math,i=2*n.PI,o=requestAnimationFrame,r=[],s=(e,t,a)=>{e.addEventListener(t,a,!1),r.push(()=>e.removeEventListener(t,a,!1))};e=Object.assign({width:null,height:null,autoscale:!0,pixelart:!1,antialias:!1,canvas:null,global:!0,loop:null,tapEvents:!0,keyboardEvents:!0,animate:!0},e);let f=!1,c=[],d,p=1,u,h=.5,g=1,m,b=1/60,w=0,x,v="sans-serif",y=20,k=Date.now(),E=a,T=[.5,0,1750,,,.3,1,,,,600,.1],C={init:null,update:null,draw:null,resized:null,tap:null,untap:null,tapping:null,tapped:null},z={CANVAS:null,W:0,H:0,T:0,CX:0,CY:0,MX:-1,MY:-1,TWO_PI:i,HALF_PI:n.PI/2,lerp:(e,t,a)=>a*(t-e)+e,deg2rad:e=>n.PI/180*e,rad2deg:e=>180/n.PI*e,round:(e,t=0)=>{if(!t)return n.round(e);let a=10**t;return n.round(e*a)/a},clamp:(e,t,a)=>e<t?t:e>a?a:e,wrap:(e,t,a)=>e-(a-t)*n.floor((e-t)/(a-t)),map(e,t,a,l,n,i){let o=(e-t)/(a-t)*(n-l)+l;return i?z.clamp(o,l,n):o},norm:(e,t,a)=>z.map(e,t,a,0,1),wave:(e,t,a,l=Math.sin)=>e+(l(a)+1)/2*(t-e),rand:(e=0,t=1)=>(k=(1664525*k+0x3c6ef35f)%0x100000000)/0x100000000*(t-e)+e,randi:(e=0,t=1)=>n.floor(z.rand(e,t+1)),rseed(e){k=~~e},cls(e){null==e?u.clearRect(0,0,u.canvas.width,u.canvas.height):z.rectfill(0,0,u.canvas.width,u.canvas.height,e)},rect(e,t,a,l,n,i){u.beginPath(),u[i?"roundRect":"rect"](~~e-h,~~t-h,~~a+2*h,~~l+2*h,i),z.stroke(n)},rectfill(e,t,a,l,n,i){u.beginPath(),u[i?"roundRect":"rect"](~~e,~~t,~~a,~~l,i),z.fill(n)},circ(e,t,a,l){u.beginPath(),u.arc(~~e,~~t,~~a,0,i),z.stroke(l)},circfill(e,t,a,l){u.beginPath(),u.arc(~~e,~~t,~~a,0,i),z.fill(l)},line(e,t,a,l,n){u.beginPath();let i=.5*(0!==h&&~~e==~~a),o=.5*(0!==h&&~~t==~~l);u.moveTo(~~e+i,~~t+o),u.lineTo(~~a+i,~~l+o),z.stroke(n)},linewidth(e){u.lineWidth=~~e,h=.5*(0!=~~e%2)},linedash(e,t=0){u.setLineDash(e),u.lineDashOffset=t},text(e,t,a,l=3,n="normal"){u.font=`${n} ${y}px ${v}`,u.fillStyle=E[~~l%E.length],u.fillText(a,~~e,~~t)},textfont(e){v=e},textsize(e){y=e},textalign(e,t){e&&(u.textAlign=e),t&&(u.textBaseline=t)},image(e,t,a){u.drawImage(a,~~e,~~t)},paint(e,t,a,l={}){let n=l.canvas||new OffscreenCanvas(1,1),i=l.scale||1,o=u;if(n.width=e*i,n.height=t*i,(u=n.getContext("2d")).scale(i,i),a.push){let e=0,t=0;for(let l of(u.imageSmoothingEnabled=!1,a)){for(let a of l)" "!==a&&"."!==a&&z.rectfill(e,t,1,1,parseInt(a,16)),e++;t++,e=0}}else a(u);return u=o,n.transferToImageBitmap()},ctx:e=>(e&&(u=e),u),push:()=>u.save(),pop:()=>u.restore(),translate:(e,t)=>u.translate(~~e,~~t),scale:(e,t)=>u.scale(e,t||e),rotate:e=>u.rotate(e),alpha(e){u.globalAlpha=z.clamp(e,0,1)},path:e=>new Path2D(e),fill(e,t){u.fillStyle=E[~~e%E.length],t?u.fill(t):u.fill()},stroke(e,t){u.strokeStyle=E[~~e%E.length],t?u.stroke(t):u.stroke()},clip(e){u.clip(e)},sfx:(e,a=0,n=1)=>!(l.zzfxV<=0)&&(!navigator.userActivation||!!navigator.userActivation.hasBeenActive)&&(e=e||T,(0!==a||1!==n)&&((e=e.slice())[0]=n*(e[0]||1),e[10]=~~e[10]+a),t.apply(0,e),e),volume(e){l.zzfxV=e},use(e,t={}){f?X(e,t):c.push([e,t])},listen:(e,t)=>(C[e]=C[e]||new Set,C[e].add(t),()=>C[e].delete(t)),emit(e,t,a,l,n){f&&(S("before:"+e,t,a,l,n),S(e,t,a,l,n),S("after:"+e,t,a,l,n))},pal(e=a){E=e},def(t,a){z[t]=a,e.global&&(l[t]=a)},timescale(e){g=e},framerate(e){b=1/~~e},stat:t=>[e,f,x,p,C,E,T,g,l.zzfxV||1,k,y,v][t],quit(){for(let e of(cancelAnimationFrame(x),x=0,z.emit("quit"),r))e();if(C={},e.global){for(let e in z)delete l[e];delete l.ENGINE}}};for(let e of"PI,sin,cos,atan2,hypot,tan,abs,ceil,floor,trunc,min,max,pow,sqrt,sign,exp".split(","))z[e]=n[e];function A(){let t=e.loop?e.loop:l;for(let e in C)t[e]&&z.listen(e,t[e]);for(let[e,t]of c)X(e,t);if(e.autoscale&&s(l,"resize",P),e.tapEvents){let e=(e,t)=>[(e-d.offsetLeft)/p,(t-d.offsetTop)/p],t=new Map,a=(e,a,l)=>{let n={x:a,y:l,startX:a,startY:l,ts:performance.now()};return t.set(e,n),n},n=(e,l,n)=>{let i=t.get(e)||a(e);i.x=l,i.y=n},i=e=>e&&performance.now()-e.ts<=300,o=e=>e.preventDefault(),r=!1;s(d,"mousedown",t=>{if(0===t.button){o(t);let[l,n]=e(t.pageX,t.pageY);z.emit("tap",l,n,0),a(0,l,n),r=!0}}),s(d,"mouseup",a=>{if(0===a.button){o(a);let l=t.get(0),[n,s]=e(a.pageX,a.pageY);i(l)&&z.emit("tapped",l.startX,l.startY,0),z.emit("untap",n,s,0),t.delete(0),r=!1}}),s(d,"mousemove",t=>{o(t);let[a,l]=e(t.pageX,t.pageY);z.def("MX",a),z.def("MY",l),r&&(z.emit("tapping",a,l,0),n(0,a,l))}),s(d,"touchstart",t=>{for(let l of(o(t),t.changedTouches)){let[t,n]=e(l.pageX,l.pageY);z.emit("tap",t,n,l.identifier+1),a(l.identifier+1,t,n)}}),s(d,"touchmove",t=>{for(let a of(o(t),t.changedTouches)){let[t,l]=e(a.pageX,a.pageY);z.emit("tapping",t,l,a.identifier+1),n(a.identifier+1,t,l)}});let f=e=>{o(e);let a=[];if(e.targetTouches.length>0)for(let t of e.targetTouches)a.push(t.identifier+1);for(let[e,l]of t)a.includes(e)||(i(l)&&z.emit("tapped",l.startX,l.startY,e),z.emit("untap",l.x,l.y,e),t.delete(e))};s(d,"touchend",f),s(d,"touchcancel",f),s(l,"blur",()=>{for(let[e,a]of(r=!1,t))z.emit("untap",a.x,a.y,e),t.delete(e)})}if(e.keyboardEvents){let e=e=>e.toLowerCase(),t=new Set,a=new Set,n=(t,a)=>a?t.has("space"===e(a)?" ":e(a)):t.size>0;s(l,"keydown",l=>{t.has(e(l.key))||(t.add(e(l.key)),a.add(e(l.key)))}),s(l,"keyup",a=>{t.delete(e(a.key))}),s(l,"blur",()=>t.clear()),z.listen("after:draw",()=>a.clear()),z.def("iskeydown",e=>n(t,e)),z.def("iskeypressed",e=>n(a,e))}f=!0,z.emit("init",z),m=performance.now(),x=o(I)}function I(t){let a=0,l=(t-m)/1e3;if(m=t,e.animate){if(l>.3);else for(w+=l;w>=b;)a++,z.emit("update",b*g,a),z.def("T",z.T+b*g),w-=b;x&&(x=o(I))}else a=1;a&&(z.textalign("start","top"),z.emit("draw"))}function P(){let t=e.width||l.innerWidth,a=e.height||e.width||l.innerHeight;z.def("W",d.width=t),z.def("H",d.height=a),z.def("CX",z.W/2),z.def("CY",z.H/2),e.autoscale&&(d.style.display||(d.style.display="block",d.style.margin="auto"),p=n.min(l.innerWidth/z.W,l.innerHeight/z.H),p=(e.pixelart?~~p:p)||1,d.style.width=z.W*p+"px",d.style.height=z.H*p+"px"),(!e.antialias||e.pixelart)&&(u.imageSmoothingEnabled=!1,d.style.imageRendering="pixelated"),z.emit("resized",p),z.cls(0),e.animate||o(I)}function S(e,t,a,l,n){if(C[e])for(let i of C[e])i(t,a,l,n)}function X(e,t){let a=e(z,t);for(let e in a)z.def(e,a[e])}if(e.global){if(l.ENGINE)throw Error("two global litecanvas detected");Object.assign(l,z),l.ENGINE=z}return e.canvas&&(d=document.querySelector(e.canvas)),d=d||document.createElement("canvas"),z.def("CANVAS",d),u=d.getContext("2d"),s(d,"click",()=>l.focus()),d.style="",P(),d.parentNode||document.body.appendChild(d),"loading"===document.readyState?s(l,"DOMContentLoaded",()=>o(A)):o(A),z}})();
1
+ (()=>{var e=new AudioContext,t=(t=1,a=.05,l=220,n=0,i=0,o=.1,r=0,s=1,f=0,c=0,d=0,p=0,u=0,h=0,g=0,m=0,w=0,b=1,v=0,x=0,y=0)=>{let C=Math,k=2*C.PI,E=f*=500*k/44100/44100,T=l*=(1-a+2*a*C.random(a=[]))*k/44100,z=0,A=0,I=0,P=1,S=0,X=0,Y=0,L=y<0?-1:1,M=k*L*y*2/44100,N=C.cos(M),H=C.sin,W=H(M)/4,D=1+W,F=-2*N/D,V=(1-W)/D,q=(1+L*N)/2/D,B=-(L+N)/D,O=0,R=0,G=0,$=0;for(n=44100*n+9,v*=44100,i*=44100,o*=44100,w*=44100,c*=500*k/85766121e6,g*=k/44100,d*=k/44100,p*=44100,u=44100*u|0,t*=.3*(globalThis.zzfxV||1),L=n+v+i+o+w|0;I<L;a[I++]=Y*t)++X%(100*m|0)||(Y=r?1<r?2<r?3<r?H(z*z):C.max(C.min(C.tan(z),1),-1):1-(2*z/k%2+2)%2:1-4*C.abs(C.round(z/k)-z/k):H(z),Y=(u?1-x+x*H(k*I/u):1)*(Y<0?-1:1)*C.abs(Y)**s*(I<n?I/n:I<n+v?1-(I-n)/v*(1-b):I<n+v+i?b:I<L-w?(L-I-w)/o*b:0),Y=w?Y/2+(w>I?0:(I<L-w?1:(L-I)/w)*a[I-w|0]/2/t):Y,y&&(Y=$=q*O+B*(O=R)+q*(R=Y)-V*G-F*(G=$))),z+=(M=(l+=f+=c)*C.cos(g*A++))+M*h*H(I**5),P&&++P>p&&(l+=d,T+=d,P=0),!u||++S%u||(l=T,f=E,P=P||1);(t=e.createBuffer(1,L,44100)).getChannelData(0).set(a),(l=e.createBufferSource()).buffer=t,l.connect(e.destination),l.start()},a=["#111","#6a7799","#aec2c2","#FFF1E8","#e83b3b","#fabc20","#155fd9","#3cbcfc","#327345","#63c64d","#6c2c1f","#ac7c00"];globalThis.litecanvas=function(e={}){let l=globalThis,n=Math,i=2*n.PI,o=requestAnimationFrame,r=[],s=(e,t,a)=>{e.addEventListener(t,a,!1),r.push(()=>e.removeEventListener(t,a,!1))};e=Object.assign({width:null,height:null,autoscale:!0,pixelart:!1,antialias:!1,canvas:null,global:!0,loop:null,tapEvents:!0,keyboardEvents:!0,animate:!0},e);let f=!1,c=[],d,p=1,u,h=.5,g=1,m,w=1/60,b=0,v,x="sans-serif",y=20,C=Date.now(),k=a,E=[.5,0,1750,,,.3,1,,,,600,.1],T={init:null,update:null,draw:null,resized:null,tap:null,untap:null,tapping:null,tapped:null},z={CANVAS:null,W:0,H:0,T:0,CX:0,CY:0,MX:-1,MY:-1,TWO_PI:i,HALF_PI:n.PI/2,lerp:(e,t,a)=>a*(t-e)+e,deg2rad:e=>n.PI/180*e,rad2deg:e=>180/n.PI*e,round:(e,t=0)=>{if(!t)return n.round(e);let a=10**t;return n.round(e*a)/a},clamp:(e,t,a)=>e<t?t:e>a?a:e,wrap:(e,t,a)=>e-(a-t)*n.floor((e-t)/(a-t)),map(e,t,a,l,n,i){let o=(e-t)/(a-t)*(n-l)+l;return i?z.clamp(o,l,n):o},norm:(e,t,a)=>z.map(e,t,a,0,1),wave:(e,t,a,l=Math.sin)=>e+(l(a)+1)/2*(t-e),rand:(e=0,t=1)=>(C=(1664525*C+0x3c6ef35f)%0x100000000)/0x100000000*(t-e)+e,randi:(e=0,t=1)=>n.floor(z.rand(e,t+1)),rseed(e){C=~~e},cls(e){null==e?u.clearRect(0,0,u.canvas.width,u.canvas.height):z.rectfill(0,0,u.canvas.width,u.canvas.height,e)},rect(e,t,a,l,n,i){u.beginPath(),u[i?"roundRect":"rect"](~~e-h,~~t-h,~~a+2*h,~~l+2*h,i),z.stroke(n)},rectfill(e,t,a,l,n,i){u.beginPath(),u[i?"roundRect":"rect"](~~e,~~t,~~a,~~l,i),z.fill(n)},circ(e,t,a,l){u.beginPath(),u.arc(~~e,~~t,~~a,0,i),z.stroke(l)},circfill(e,t,a,l){u.beginPath(),u.arc(~~e,~~t,~~a,0,i),z.fill(l)},line(e,t,a,l,n){u.beginPath();let i=.5*(0!==h&&~~e==~~a),o=.5*(0!==h&&~~t==~~l);u.moveTo(~~e+i,~~t+o),u.lineTo(~~a+i,~~l+o),z.stroke(n)},linewidth(e){u.lineWidth=~~e,h=.5*(0!=~~e%2)},linedash(e,t=0){u.setLineDash(e),u.lineDashOffset=t},text(e,t,a,l=3,n="normal"){u.font=`${n} ${y}px ${x}`,u.fillStyle=k[~~l%k.length],u.fillText(a,~~e,~~t)},textfont(e){x=e},textsize(e){y=e},textalign(e,t){e&&(u.textAlign=e),t&&(u.textBaseline=t)},image(e,t,a){u.drawImage(a,~~e,~~t)},paint(e,t,a,l={}){let n=l.canvas||new OffscreenCanvas(1,1),i=l.scale||1,o=u;if(n.width=e*i,n.height=t*i,(u=n.getContext("2d")).scale(i,i),a.push){let e=0,t=0;for(let l of(u.imageSmoothingEnabled=!1,a)){for(let a of l)" "!==a&&"."!==a&&z.rectfill(e,t,1,1,parseInt(a,16)),e++;t++,e=0}}else a(u);return u=o,n.transferToImageBitmap()},ctx:e=>(e&&(u=e),u),push:()=>u.save(),pop:()=>u.restore(),translate:(e,t)=>u.translate(~~e,~~t),scale:(e,t)=>u.scale(e,t||e),rotate:e=>u.rotate(e),alpha(e){u.globalAlpha=z.clamp(e,0,1)},path:e=>new Path2D(e),fill(e,t){u.fillStyle=k[~~e%k.length],t?u.fill(t):u.fill()},stroke(e,t){u.strokeStyle=k[~~e%k.length],t?u.stroke(t):u.stroke()},clip(e){u.clip(e)},sfx:(e,a=0,n=1)=>!(l.zzfxV<=0)&&(!navigator.userActivation||!!navigator.userActivation.hasBeenActive)&&(e=e||E,(0!==a||1!==n)&&((e=e.slice())[0]=n*(e[0]||1),e[10]=~~e[10]+a),t.apply(0,e),e),volume(e){l.zzfxV=e},use(e,t={}){f?X(e,t):c.push([e,t])},listen:(e,t)=>(T[e=e.toLowerCase()]=T[e]||new Set,T[e].add(t),()=>T[e].delete(t)),emit(e,t,a,l,n){f&&(S("before:"+(e=e.toLowerCase()),t,a,l,n),S(e,t,a,l,n),S("after:"+e,t,a,l,n))},pal(e=a){k=e},def(t,a){z[t]=a,e.global&&(l[t]=a)},timescale(e){g=e},framerate(e){w=1/~~e},stat(t){let a={index:t,value:[e,f,v,p,T,k,E,g,l.zzfxV||1,C,y,x][t]};return z.emit("stat",a),a.value},quit(){for(let e of(cancelAnimationFrame(v),v=0,z.emit("quit"),r))e();if(T={},e.global){for(let e in z)delete l[e];delete l.ENGINE}}};for(let e of"PI,sin,cos,atan2,hypot,tan,abs,ceil,floor,trunc,min,max,pow,sqrt,sign,exp".split(","))z[e]=n[e];function A(){let t=e.loop?e.loop:l;for(let e in T)t[e]&&z.listen(e,t[e]);for(let[e,t]of c)X(e,t);if(e.autoscale&&s(l,"resize",P),e.tapEvents){let e=(e,t)=>[(e-d.offsetLeft)/p,(t-d.offsetTop)/p],t=new Map,a=(e,a,l)=>{let n={x:a,y:l,startX:a,startY:l,ts:performance.now()};return t.set(e,n),n},n=(e,l,n)=>{let i=t.get(e)||a(e);i.x=l,i.y=n},i=e=>e&&performance.now()-e.ts<=300,o=e=>e.preventDefault(),r=!1;s(d,"mousedown",t=>{if(0===t.button){o(t);let[l,n]=e(t.pageX,t.pageY);z.emit("tap",l,n,0),a(0,l,n),r=!0}}),s(d,"mouseup",a=>{if(0===a.button){o(a);let l=t.get(0),[n,s]=e(a.pageX,a.pageY);i(l)&&z.emit("tapped",l.startX,l.startY,0),z.emit("untap",n,s,0),t.delete(0),r=!1}}),s(d,"mousemove",t=>{o(t);let[a,l]=e(t.pageX,t.pageY);z.def("MX",a),z.def("MY",l),r&&(z.emit("tapping",a,l,0),n(0,a,l))}),s(d,"touchstart",t=>{for(let l of(o(t),t.changedTouches)){let[t,n]=e(l.pageX,l.pageY);z.emit("tap",t,n,l.identifier+1),a(l.identifier+1,t,n)}}),s(d,"touchmove",t=>{for(let a of(o(t),t.changedTouches)){let[t,l]=e(a.pageX,a.pageY);z.emit("tapping",t,l,a.identifier+1),n(a.identifier+1,t,l)}});let f=e=>{o(e);let a=[];if(e.targetTouches.length>0)for(let t of e.targetTouches)a.push(t.identifier+1);for(let[e,l]of t)a.includes(e)||(i(l)&&z.emit("tapped",l.startX,l.startY,e),z.emit("untap",l.x,l.y,e),t.delete(e))};s(d,"touchend",f),s(d,"touchcancel",f),s(l,"blur",()=>{for(let[e,a]of(r=!1,t))z.emit("untap",a.x,a.y,e),t.delete(e)})}if(e.keyboardEvents){let e=new Set,t=new Set,a=(e,t="")=>(t=t.toLowerCase())?e.has("space"===t?" ":t):e.size>0;s(l,"keydown",a=>{let l=a.key.toLowerCase();e.has(l)||(e.add(l),t.add(l))}),s(l,"keyup",t=>{e.delete(t.key.toLowerCase())}),s(l,"blur",()=>e.clear()),z.listen("after:update",()=>t.clear()),z.def("iskeydown",t=>a(e,t)),z.def("iskeypressed",e=>a(t,e))}f=!0,z.emit("init",z),m=performance.now(),v=o(I)}function I(t){let a=0,l=(t-m)/1e3;if(m=t,e.animate){if(l>.3);else for(b+=l;b>=w;)a++,z.emit("update",w*g,a),z.def("T",z.T+w*g),b-=w;v&&(v=o(I))}else a=1;a&&(z.textalign("start","top"),z.emit("draw"))}function P(){let t=e.width||l.innerWidth,a=e.height||e.width||l.innerHeight;z.def("W",d.width=t),z.def("H",d.height=a),z.def("CX",z.W/2),z.def("CY",z.H/2),e.autoscale&&(d.style.display||(d.style.display="block",d.style.margin="auto"),p=n.min(l.innerWidth/z.W,l.innerHeight/z.H),p=(e.pixelart?~~p:p)||1,d.style.width=z.W*p+"px",d.style.height=z.H*p+"px"),(!e.antialias||e.pixelart)&&(u.imageSmoothingEnabled=!1,d.style.imageRendering="pixelated"),z.emit("resized",p),z.cls(0),e.animate||o(I)}function S(e,t,a,l,n){if(T[e])for(let i of T[e])i(t,a,l,n)}function X(e,t){let a=e(z,t);for(let e in a)z.def(e,a[e])}if(e.global){if(l.ENGINE)throw Error("two global litecanvas detected");Object.assign(l,z),l.ENGINE=z}return e.canvas&&(d=document.querySelector(e.canvas)),d=d||document.createElement("canvas"),z.def("CANVAS",d),u=d.getContext("2d"),s(d,"click",()=>l.focus()),d.style="",P(),d.parentNode||document.body.appendChild(d),"loading"===document.readyState?s(l,"DOMContentLoaded",()=>o(A)):o(A),z}})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "litecanvas",
3
- "version": "0.82.0",
3
+ "version": "0.83.0",
4
4
  "description": "Lightweight HTML5 canvas 2D game engine suitable for small projects and creative coding. Inspired by PICO-8 and P5/Processing.",
5
5
  "license": "MIT",
6
6
  "author": "Luiz Bills <luizbills@pm.me>",
package/src/index.js CHANGED
@@ -1013,6 +1013,8 @@ export default function litecanvas(settings = {}) {
1013
1013
  'listen: 2nd param must be a function'
1014
1014
  )
1015
1015
 
1016
+ eventName = eventName.toLowerCase()
1017
+
1016
1018
  _events[eventName] = _events[eventName] || new Set()
1017
1019
  _events[eventName].add(callback)
1018
1020
 
@@ -1035,6 +1037,8 @@ export default function litecanvas(settings = {}) {
1035
1037
  'emit: 1st param must be a string'
1036
1038
  )
1037
1039
  if (_initialized) {
1040
+ eventName = eventName.toLowerCase()
1041
+
1038
1042
  triggerEvent('before:' + eventName, arg1, arg2, arg3, arg4)
1039
1043
  triggerEvent(eventName, arg1, arg2, arg3, arg4)
1040
1044
  triggerEvent('after:' + eventName, arg1, arg2, arg3, arg4)
@@ -1145,7 +1149,13 @@ export default function litecanvas(settings = {}) {
1145
1149
  // 11
1146
1150
  _fontFamily,
1147
1151
  ]
1148
- return list[n]
1152
+
1153
+ const data = { index: n, value: list[n] }
1154
+
1155
+ // plugins can modify or create stat values
1156
+ instance.emit('stat', data)
1157
+
1158
+ return data.value
1149
1159
  },
1150
1160
 
1151
1161
  /**
@@ -1361,8 +1371,6 @@ export default function litecanvas(settings = {}) {
1361
1371
  }
1362
1372
 
1363
1373
  if (settings.keyboardEvents) {
1364
- const toLowerCase = (/** @type {string} */ s) => s.toLowerCase()
1365
-
1366
1374
  /** @type {Set<string>} */
1367
1375
  const _keysDown = new Set()
1368
1376
 
@@ -1370,34 +1378,34 @@ export default function litecanvas(settings = {}) {
1370
1378
  const _keysPress = new Set()
1371
1379
 
1372
1380
  /**
1373
- * @param {Set<string>} keysSet
1381
+ * @param {Set<string>} keySet
1374
1382
  * @param {string} [key]
1375
1383
  * @returns {boolean}
1376
1384
  */
1377
- const keyCheck = (keysSet, key) => {
1385
+ const keyCheck = (keySet, key = '') => {
1386
+ key = key.toLowerCase()
1378
1387
  return !key
1379
- ? keysSet.size > 0
1380
- : keysSet.has(
1381
- 'space' === toLowerCase(key) ? ' ' : toLowerCase(key)
1382
- )
1388
+ ? keySet.size > 0
1389
+ : keySet.has('space' === key ? ' ' : key)
1383
1390
  }
1384
1391
 
1385
1392
  // @ts-ignore
1386
1393
  on(root, 'keydown', (/** @type {KeyboardEvent} */ event) => {
1387
- if (!_keysDown.has(toLowerCase(event.key))) {
1388
- _keysDown.add(toLowerCase(event.key))
1389
- _keysPress.add(toLowerCase(event.key))
1394
+ const key = event.key.toLowerCase()
1395
+ if (!_keysDown.has(key)) {
1396
+ _keysDown.add(key)
1397
+ _keysPress.add(key)
1390
1398
  }
1391
1399
  })
1392
1400
 
1393
1401
  // @ts-ignore
1394
1402
  on(root, 'keyup', (/** @type {KeyboardEvent} */ event) => {
1395
- _keysDown.delete(toLowerCase(event.key))
1403
+ _keysDown.delete(event.key.toLowerCase())
1396
1404
  })
1397
1405
 
1398
1406
  // @ts-ignore
1399
1407
  on(root, 'blur', () => _keysDown.clear())
1400
- instance.listen('after:draw', () => _keysPress.clear())
1408
+ instance.listen('after:update', () => _keysPress.clear())
1401
1409
 
1402
1410
  instance.def(
1403
1411
  'iskeydown',