-
Notifications
You must be signed in to change notification settings - Fork 1
/
kontra.min.js
1 lines (1 loc) · 9.55 KB
/
kontra.min.js
1
var kontra=function(){let t,i,e={};function s(t,...i){(e[t]||[]).map(t=>t(...i))}function h(){return i}class n{constructor({spriteSheet:t,frames:i,frameRate:e,loop:s=!0}){this.spriteSheet=t,this.frames=i,this.frameRate=e,this.loop=s;let{width:h,height:n,margin:r=0}=t.frame;this.width=h,this.height=n,this.margin=r,this._f=0,this._a=0}clone(){return new n(this)}reset(){this._f=0,this._a=0}update(t=1/60){if(this.loop||this._f!=this.frames.length-1)for(this._a+=t;this._a*this.frameRate>=1;)this._f=++this._f%this.frames.length,this._a-=1/this.frameRate}render({x:t,y:i,width:e=this.width,height:s=this.height,context:n=h()}){let r=this.frames[this._f]/this.spriteSheet._f|0,a=this.frames[this._f]%this.spriteSheet._f|0;n.drawImage(this.spriteSheet.image,a*this.width+(2*a+1)*this.margin,r*this.height+(2*r+1)*this.margin,this.width,this.height,t,i,e,s)}}function r(){return new n(...arguments)}r.prototype=n.prototype,r.class=n;let a=/^\//,o=/\/$/,c=new WeakMap,l="";function d(t,i){return new URL(t,i).href}let u={},p={};function w(t,i){let e=Math.sin(i),s=Math.cos(i);return{x:t.x*s-t.y*e,y:t.x*e+t.y*s}}function f(t,i,e){return Math.min(Math.max(t,e),i)}function _(t){let{x:i,y:e,width:s,height:h}=t.world||t;return t.anchor&&(i-=s*t.anchor.x,e-=h*t.anchor.y),s<0&&(i+=s,s*=-1),h<0&&(e+=h,h*=-1),{x:i,y:e,width:s,height:h}}class y{constructor(t=0,i=0,e={}){this.x=t,this.y=i,e._c&&(this.clamp(e._a,e._b,e._d,e._e),this.x=t,this.y=i)}add(t){return new y(this.x+t.x,this.y+t.y,this)}subtract(t){return new y(this.x-t.x,this.y-t.y,this)}scale(t){return new y(this.x*t,this.y*t)}normalize(t=this.length()){return new y(this.x/t,this.y/t)}dot(t){return this.x*t.x+this.y*t.y}length(){return Math.hypot(this.x,this.y)}distance(t){return Math.hypot(this.x-t.x,this.y-t.y)}angle(t){return Math.acos(this.dot(t)/(this.length()*t.length()))}clamp(t,i,e,s){this._c=!0,this._a=t,this._b=i,this._d=e,this._e=s}get x(){return this._x}get y(){return this._y}set x(t){this._x=this._c?f(this._a,this._d,t):t}set y(t){this._y=this._c?f(this._b,this._e,t):t}}function m(){return new y(...arguments)}m.prototype=y.prototype,m.class=y;class g{constructor(t){return this.init(t)}init(t={}){this.position=m(),this.velocity=m(),this.acceleration=m(),this.ttl=1/0,Object.assign(this,t)}update(t){this.advance(t)}advance(t){let i=this.acceleration;t&&(i=i.scale(t)),this.velocity=this.velocity.add(i);let e=this.velocity;t&&(e=e.scale(t)),this.position=this.position.add(e),this._pc(),this.ttl--}get dx(){return this.velocity.x}get dy(){return this.velocity.y}set dx(t){this.velocity.x=t}set dy(t){this.velocity.y=t}get ddx(){return this.acceleration.x}get ddy(){return this.acceleration.y}set ddx(t){this.acceleration.x=t}set ddy(t){this.acceleration.y=t}isAlive(){return this.ttl>0}_pc(){}}const x=()=>{};class v extends g{init({width:t=0,height:i=0,context:e=h(),render:s=this.draw,update:n=this.advance,children:r=[],anchor:a={x:0,y:0},sx:o=0,sy:c=0,opacity:l=1,rotation:d=0,scaleX:u=1,scaleY:p=1,...w}={}){this.children=[],super.init({width:t,height:i,context:e,anchor:a,sx:o,sy:c,opacity:l,rotation:d,scaleX:u,scaleY:p,...w}),this._di=!0,this._uw(),r.map(t=>this.addChild(t)),this._rf=s,this._uf=n}update(t){this._uf(t),this.children.map(t=>t.update&&t.update())}render(t){let i=this.context;i.save(),(this.x||this.y)&&i.translate(this.x,this.y),this.rotation&&i.rotate(this.rotation),(this.sx||this.sy)&&i.translate(-this.sx,-this.sy),1==this.scaleX&&1==this.scaleY||i.scale(this.scaleX,this.scaleY);let e=-this.width*this.anchor.x,s=-this.height*this.anchor.y;(e||s)&&i.translate(e,s),this.context.globalAlpha=this.opacity,this._rf(),(e||s)&&i.translate(-e,-s);let h=this.children;t&&(h=h.filter(t)),h.map(t=>t.render&&t.render()),i.restore()}draw(){}_pc(t,i){this._uw(),this.children.map(t=>t._pc())}get x(){return this.position.x}get y(){return this.position.y}set x(t){this.position.x=t,this._pc()}set y(t){this.position.y=t,this._pc()}get width(){return this._w}set width(t){this._w=t,this._pc()}get height(){return this._h}set height(t){this._h=t,this._pc()}_uw(){if(!this._di)return;let{_wx:t=0,_wy:i=0,_wo:e=1,_wr:s=0,_wsx:h=1,_wsy:n=1}=this.parent||{};this._wx=this.x,this._wy=this.y,this._ww=this.width,this._wh=this.height,this._wo=e*this.opacity,this._wr=s+this.rotation;let{x:r,y:a}=w({x:this.x,y:this.y},s);this._wx=r,this._wy=a,this._wsx=h*this.scaleX,this._wsy=n*this.scaleY,this._wx=this.x*h,this._wy=this.y*n,this._ww=this.width*this._wsx,this._wh=this.height*this._wsy,this._wx+=t,this._wy+=i}get world(){return{x:this._wx,y:this._wy,width:this._ww,height:this._wh,opacity:this._wo,rotation:this._wr,scaleX:this._wsx,scaleY:this._wsy}}addChild(t,{absolute:i=!1}={}){this.children.push(t),t.parent=this,t._pc=t._pc||x,t._pc()}removeChild(t){let i=this.children.indexOf(t);-1!==i&&(this.children.splice(i,1),t.parent=null,t._pc())}get opacity(){return this._opa}set opacity(t){this._opa=t,this._pc()}get rotation(){return this._rot}set rotation(t){this._rot=t,this._pc()}setScale(t,i=t){this.scaleX=t,this.scaleY=i}get scaleX(){return this._scx}set scaleX(t){this._scx=t,this._pc()}get scaleY(){return this._scy}set scaleY(t){this._scy=t,this._pc()}}function A(){return new v(...arguments)}A.prototype=v.prototype,A.class=v;class S extends A.class{init({image:t,width:i=(t?t.width:void 0),height:e=(t?t.height:void 0),...s}={}){super.init({image:t,width:i,height:e,...s})}get animations(){return this._a}set animations(t){let i,e;for(i in this._a={},t)this._a[i]=t[i].clone(),e=e||this._a[i];this.currentAnimation=e,this.width=this.width||e.width,this.height=this.height||e.height}playAnimation(t){this.currentAnimation=this.animations[t],this.currentAnimation.loop||this.currentAnimation.reset()}advance(t){super.advance(t),this.currentAnimation&&this.currentAnimation.update(t)}draw(){this.image&&this.context.drawImage(this.image,0,0,this.image.width,this.image.height),this.currentAnimation&&this.currentAnimation.render({x:0,y:0,width:this.width,height:this.height,context:this.context}),this.color&&(this.context.fillStyle=this.color,this.context.fillRect(0,0,this.width,this.height))}}function M(){return new S(...arguments)}M.prototype=S.prototype,M.class=S;function R(t){let i=t.canvas;t.clearRect(0,0,i.width,i.height)}let C={},Y={},b={Enter:"enter",Escape:"esc",Space:"space",ArrowLeft:"left",ArrowUp:"up",ArrowRight:"right",ArrowDown:"down"};function E(t){let i=b[t.code];Y[i]=!0,C[i]&&C[i](t)}function I(t){Y[b[t.code]]=!1}function k(){Y={}}function X(t){if(+t===t)return t;let i=[],e=t.split(".."),s=+e[0],h=+e[1],n=s;if(s<h)for(;n<=h;n++)i.push(n);else for(;n>=h;n--)i.push(n);return i}class L{constructor({image:t,frameWidth:i,frameHeight:e,frameMargin:s,animations:h}={}){if(!t)throw Error("You must provide an Image for the SpriteSheet");this.animations={},this.image=t,this.frame={width:i,height:e,margin:s},this._f=t.width/i|0,this.createAnimations(h)}createAnimations(t){let i,e;for(e in t){let{frames:s,frameRate:h,loop:n}=t[e];if(i=[],void 0===s)throw Error("Animation "+e+" must provide a frames property");[].concat(s).map(t=>{i=i.concat(X(t))}),this.animations[e]=r({spriteSheet:this,frames:i,frameRate:h,loop:n})}}}function P(){return new L(...arguments)}return P.prototype=L.prototype,P.class=L,{Animation:r,imageAssets:u,audioAssets:{},dataAssets:p,loadImage:function(t){return window.__k||(window.__k={dm:c,u:d,d:p,i:u}),new Promise((i,e)=>{let h,n,r;if(h=function(t,i){return[t.replace(o,""),t?i.replace(a,""):i].filter(t=>t).join("/")}(l,t),u[h])return i(u[h]);(n=new Image).onload=function(){r=d(h,window.location.href),u[function(t){let i=t.replace("."+function(t){return t.split(".").pop()}(t),"");return 2==i.split("/").length?i.replace(a,""):i}(t)]=u[h]=u[r]=this,s("assetLoaded",this,t),i(this)},n.onerror=function(){e("Unable to load image "+h)},n.src=h})},init:function(e){if(!(t=document.getElementById(e)||e||document.querySelector("canvas")))throw Error("You must provide a canvas element for the game");return(i=t.getContext("2d")).imageSmoothingEnabled=!1,s("init"),{canvas:t,context:i}},getCanvas:function(){return t},getContext:h,on:function(t,i){e[t]=e[t]||[],e[t].push(i)},off:function(t,i){e[t]=(e[t]||[]).filter(t=>t!=i)},emit:s,GameLoop:function({fps:t=60,clearCanvas:i=!0,update:e=x,render:n,context:r=h()}={}){if(!n)throw Error("You must provide a render() function");let a,o,c,l,d,u=0,p=1e3/t,w=1/t,f=i?R:x;function _(){if(o=requestAnimationFrame(_),c=performance.now(),l=c-a,a=c,!(l>1e3)){for(s("tick"),u+=l;u>=p;)d.update(w),u-=p;f(r),d.render()}}return d={update:e,render:n,isStopped:!0,start(){a=performance.now(),this.isStopped=!1,requestAnimationFrame(_)},stop(){this.isStopped=!0,cancelAnimationFrame(o)},_frame:_,set _last(t){a=t}}},GameObject:A,degToRad:function(t){return t*Math.PI/180},radToDeg:function(t){return 180*t/Math.PI},angleToTarget:function(t,i){return Math.atan2(i.y-t.y,i.x-t.x)+Math.PI/2},rotatePoint:w,randInt:function(t,i){return Math.floor(Math.random()*(i-t+1))+t},seedRand:function(t){for(var i=0,e=2166136261;i<t.length;i++)e=Math.imul(e^t.charCodeAt(i),16777619);e+=e<<13,e^=e>>>7,e+=e<<3,e^=e>>>17;let s=(e+=e<<5)>>>0,h=()=>(2**31-1&(s=Math.imul(48271,s)))/2**31;return h(),h},lerp:function(t,i,e){return t*(1-e)+i*e},inverseLerp:function(t,i,e){return(e-t)/(i-t)},clamp:f,collides:function(t,i){return t.rotation||i.rotation?null:([t,i]=[t,i].map(t=>_(t)),t.x<i.x+i.width&&t.x+t.width>i.x&&t.y<i.y+i.height&&t.y+t.height>i.y)},getWorldRect:_,keyMap:b,initKeys:function(){let t;for(t=0;t<26;t++)b[t+65]=b["Key"+String.fromCharCode(t+65)]=String.fromCharCode(t+97);for(t=0;t<10;t++)b[48+t]=b["Digit"+t]=""+t;window.addEventListener("keydown",E),window.addEventListener("keyup",I),window.addEventListener("blur",k)},keyPressed:function(t){return!!Y[t]},Sprite:M,SpriteSheet:P,Vector:m}}();