let mapWidth = 210.; let mapHeith = 100.; const playerSize = 50.; const playerSpeed=.2; const bulletSpeed=playerSpeed*2; const halfSqrtTwo=0.70710678118; class Player { constructor (id,x,y,name, dir) { this.name=name; this.x=x; this.y=y; this.id=id; this.visibleDir=1; this.dir=dir;//0=standStill //1=North //2=North-East //3=East //4=South-East //5=South //6=South-West //7=West //8=North-West this.ammo=10; this.health=10; } takeDamage(amount) { this.health-=amount; if(this.health<=0) { //send death message to server //this.reset() } } retrieveServerInfo(id,x,y,dir) { if(this.id==id) { this.x=x; this.y=y; this.dir=dir; if(dir!=0) this.visibleDir=dir; } } changeDirection(newDirection){ this.dir = newDirection; if(this.dir!=0){ this.visibleDir = newDirection; } } update(squares,circles, dt)//update position { if(this.dir==0) return; let dx,dy; switch(this.dir) { case 1: dx=0.;dy=-playerSpeed;break; case 2: dx=halfSqrtTwo*playerSpeed;dy=-halfSqrtTwo*playerSpeed;break; case 3: dx=playerSpeed;dy=0.;break; case 4: dx=halfSqrtTwo*playerSpeed;dy=halfSqrtTwo*playerSpeed;break; case 5: dx=0.;dy=playerSpeed;break; case 6: dx=-halfSqrtTwo*playerSpeed;dy=halfSqrtTwo*playerSpeed;break; case 7: dx=-playerSpeed;dy=0.;break; case 8: dx=-halfSqrtTwo*playerSpeed;dy=-halfSqrtTwo*playerSpeed;break; default: } this.x += dx*dt; this.y += dy*dt; squares.forEach(square => { if(square.collide(this)) { this.x-=dx*dt; this.y-=dy*dt; this.dir=0; return; } }); circles.forEach(circle => { if(circle.collide(this)) { this.x-=dx*dt; this.y-=dy*dt; this.dir=0; return; } }); } get angle() { return (this.visibleDir-3)*3.1415926535/4.; } } function dist(A,B) { return Math.sqrt((A.x-B.x)**2+(A.y-B.y)**2); } class Bullet { constructor (x,y,dx,dy) { this.x=x; this.y=y; this.dx=dx; this.dy=dy; this.deleted=false; } update(dt) { if(!this.deleted) { this.x+=this.dx*dt*bulletSpeed; this.y+=this.dy*dt*bulletSpeed; } } checkCollisions(player,squares,circles)//only the client's player /!\ { if(!this.deleted) { if(player!=null && dist(player,this) { if(square.collide(this)) { this.deleted=true; return; } }); circles.forEach((circle) => { if(circle.collide(this)) { this.deleted=true; return; } }); } } } class Square { constructor(x,y,width,heigth) { this.x=x; this.y=y; this.w=width; this.h=heigth; } collide(point) { return (this.x<=point.x && point.x<=this.x+this.w && this.y<=point.y && point.y<=this.y+this.h); } } class Circle { constructor(x,y,radius) { this.x=x; this.y=y; this.r=radius; } collide(point) { return ((point.x-this.x)**2+(point.y-this.y)**2<=this.r**2); } }