GrandTabernacleAutoVI/js/class.js

280 lines
6.4 KiB
JavaScript
Raw Normal View History

2023-11-15 09:09:13 +01:00
let mapWidth = 210.;
let mapHeith = 100.;
2023-12-06 09:02:34 +01:00
const playerSize = 50.;
2023-12-07 10:03:55 +01:00
const carSize = 40.;
2023-11-29 19:03:50 +01:00
const playerSpeed=.2;
2023-12-06 09:50:34 +01:00
const bulletSpeed=playerSpeed*2;
2023-11-15 09:09:13 +01:00
const halfSqrtTwo=0.70710678118;
2023-12-07 09:35:35 +01:00
const defaulthealth=10.;
2023-12-06 14:02:35 +01:00
2023-11-15 09:09:13 +01:00
class Player
{
2023-12-07 13:42:18 +01:00
constructor (id,x,y,name, dir,net)
2023-11-15 09:09:13 +01:00
{
this.name=name;
this.x=x;
this.y=y;
this.id=id;
this.visibleDir=1;
2023-11-19 18:55:21 +01:00
this.dir=dir;//0=standStill
2023-11-15 09:09:13 +01:00
//1=North
//2=North-East
//3=East
//4=South-East
//5=South
//6=South-West
//7=West
//8=North-West
this.ammo=10;
2023-12-07 09:03:23 +01:00
this.health=defaulthealth;
2023-12-06 14:02:35 +01:00
this.kill=0;
this.death=0;
2023-11-15 09:09:13 +01:00
}
2023-12-07 13:42:18 +01:00
takeDamage(amount,killerId,network)
2023-11-15 09:09:13 +01:00
{
this.health-=amount;
2023-12-07 13:42:18 +01:00
if(this.health<=0)
{
2023-12-07 14:06:11 +01:00
this.death++;
2023-12-07 13:42:18 +01:00
network.died(this.id,killerId);
this.health=10;
}
2023-11-15 09:09:13 +01:00
}
2023-12-07 13:42:18 +01:00
/*retrieveServerInfo(id,x,y,dir)
2023-11-15 09:09:13 +01:00
{
if(this.id==id)
{
this.x=x;
this.y=y;
this.dir=dir;
if(dir!=0)
this.visibleDir=dir;
}
2023-12-07 13:42:18 +01:00
}*/
2023-11-15 09:09:13 +01:00
2023-11-19 19:56:29 +01:00
changeDirection(newDirection){
this.dir = newDirection;
if(this.dir!=0){
this.visibleDir = newDirection;
}
}
2023-11-29 19:03:50 +01:00
update(squares,circles, dt)//update position
2023-11-15 09:09:13 +01:00
{
if(this.dir==0)
return;
let dx,dy;
switch(this.dir)
{
2023-11-29 19:09:13 +01:00
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;
2023-11-15 09:09:13 +01:00
default:
}
2023-11-29 19:09:13 +01:00
this.x += dx*dt;
this.y += dy*dt;
2023-11-15 09:09:13 +01:00
2023-12-05 15:18:25 +01:00
squares.forEach(square => {
2023-11-15 09:09:13 +01:00
if(square.collide(this))
{
2023-12-05 15:18:25 +01:00
this.x-=dx*dt;
this.y-=dy*dt;
2023-11-15 09:09:13 +01:00
this.dir=0;
return;
}
2023-12-05 15:18:25 +01:00
});
circles.forEach(circle => {
2023-11-15 09:09:13 +01:00
if(circle.collide(this))
{
2023-12-05 15:18:25 +01:00
this.x-=dx*dt;
this.y-=dy*dt;
2023-11-15 09:09:13 +01:00
this.dir=0;
return;
}
2023-12-05 15:18:25 +01:00
});
2023-11-15 09:09:13 +01:00
}
get angle()
{
return (this.visibleDir-3)*3.1415926535/4.;
}
}
class Bullet
{
2023-12-06 10:40:08 +01:00
constructor (x,y,dx,dy,id)
2023-11-15 09:09:13 +01:00
{
this.x=x;
this.y=y;
this.dx=dx;
this.dy=dy;
this.deleted=false;
2023-12-06 10:40:08 +01:00
this.parentId=id;
2023-11-15 09:09:13 +01:00
}
2023-12-06 09:50:34 +01:00
update(dt)
2023-11-15 09:09:13 +01:00
{
if(!this.deleted)
{
2023-12-06 09:50:34 +01:00
this.x+=this.dx*dt*bulletSpeed;
this.y+=this.dy*dt*bulletSpeed;
2023-11-15 09:09:13 +01:00
}
}
2023-12-07 13:42:18 +01:00
checkCollisions(player,squares,circles,network)//only the client's player /!\
2023-11-15 09:09:13 +01:00
{
if(!this.deleted)
{
2023-12-06 10:40:08 +01:00
if(player!=null && player.id!=this.parentId && Math.sqrt((player.x-this.x)**2+(player.y-this.y)**2)<playerSize/2)
2023-11-15 09:09:13 +01:00
{
2023-12-07 13:42:18 +01:00
player.takeDamage(1,this.parentId,network);
2023-11-15 09:09:13 +01:00
this.deleted=true;
return;
}
2023-12-06 09:50:34 +01:00
squares.forEach((square) => {
2023-11-15 09:09:13 +01:00
if(square.collide(this))
{
this.deleted=true;
return;
}
2023-12-06 09:50:34 +01:00
});
2023-11-15 09:09:13 +01:00
2023-12-06 09:50:34 +01:00
circles.forEach((circle) => {
2023-11-15 09:09:13 +01:00
if(circle.collide(this))
{
this.deleted=true;
return;
}
2023-12-06 09:50:34 +01:00
});
2023-11-15 09:09:13 +01:00
}
}
}
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)
{
2023-11-29 17:25:40 +01:00
return ((point.x-this.x)**2+(point.y-this.y)**2<=this.r**2);
2023-11-15 09:09:13 +01:00
}
2023-12-07 10:45:31 +01:00
}
class Car
{
2023-12-07 12:04:32 +01:00
constructor(Renderer, x, y)
2023-12-07 10:45:31 +01:00
{
2023-12-07 12:04:32 +01:00
this.x=x;
this.y=y;
2023-12-07 10:45:31 +01:00
this.dir=1;
this.angle=0;
this.tick=1;
this.Renderer=Renderer;
}
Update()
{
this.ChangeDirection()
switch (this.dir) {
case 1:
this.x=this.x+this.tick
break;
case 2:
this.y=this.y-this.tick
break;
case 3:
this.x=this.x-this.tick
break;
case 4:
this.y=this.y+this.tick
break;
}
this.Renderer.RenderCar(this.x,this.y, this.angle)
}
2023-12-07 12:04:32 +01:00
pseudoaleatoire() {
return Math.floor(Date.now()/1000)%10
}
2023-12-07 10:45:31 +01:00
ChangeDirection()
{
2023-12-07 12:04:32 +01:00
if(this.x == 1280 && this.y==75) {
2023-12-07 10:45:31 +01:00
this.dir=2
this.y=60
this.angle=-Math.PI/2
} else if(this.y<-40) {
this.dir=2
this.x=947
this.y=1000
2023-12-07 12:04:32 +01:00
} else if(this.x==947 && this.y==875 ) {
if(this.pseudoaleatoire()>7) {
//tourner à droite
this.dir=1
this.angle=0
}
} else if(this.x==947 && this.y==839 ) {
if(this.pseudoaleatoire()>4) {
//tourner à gauche
this.dir=3
this.angle=-Math.PI
}
} else if(this.x==947 && this.y==587) {
this.dir=1
this.angle=0
} else if(this.x==1280 && this.y>400) {
this.dir=2
this.angle=-Math.PI/2
} else if(this.x==228 && this.y==839) {
this.y==823
this.dir=2
this.angle=-Math.PI/2
} else if(this.x==228 && this.y==587) {
this.dir=1
this.angle=0
} else if(this.x==644 && this.y==587) {
this.dir=2
this.angle=-Math.PI/2
} else if(this.dir==2 && this.y==295) {
this.dir=3
this.angle=-Math.PI
} else if(this.x==468 && this.y==295) {
this.dir=2
this.angle=-Math.PI/2
} else if(this.x==468 && this.y==75) {
this.dir=1
this.angle=0
2023-12-07 10:45:31 +01:00
}
}
2023-11-15 09:09:13 +01:00
}