xxxxxxxxxx
287
let ratioX, ratioY, viewportScale;
let fire;
let shipPositionX;
let shipPositionY;
let shipDirectionX;
let shipDirectionY;
let shipAngle;
let shipSpeed;
let shipRadius;
let shipMaxSpeed;
let shipAcceleration;
let shipFriction;
let shipScore;
let shipLife;
let gunPositionX;
let gunPositionY;
let gunRadius;
let bulletPositionX = [];
let bulletPositionY = [];
let bulletDirectionX = [];
let bulletDirectionY = [];
let bulletSpeed = [];
let bulletRadius = [];
let bulletStatus = [];
let maxBullets;
let asteroidPositionX = [];
let asteroidPositionY = [];
let asteroidDirectionX = [];
let asteroidDirectionY = [];
let asteroidRadius = [];
let asteroidSpeed = [];
let asteroidStatus = [];
let maxAsteroid;
function setup() {
ratioX = 9; ratioY = 6; viewportScale = 70;
createCanvas(ratioX * viewportScale, ratioY * viewportScale);
fire = 0;
//Ship Initialization
shipPositionX = (ratioX * viewportScale)/2;
shipPositionY = (ratioY * viewportScale)/2;
shipDirectionX = cos(0.5);
shipDirectionY = sin(0.8);
shipAngle = 0;
shipSpeed = 0;
shipRadius = 20;
shipMaxSpeed = 5.5;//try 50 Teerathep
shipAcceleration = 0.05;
shipFriction = 0.030;
shipScore = 0;
shipLife = 5;
//Gun Initialization
gunPositionX = shipPositionX;
gunPositionY = shipPositionY;
gunRadius = shipRadius + 1.2;
maxBullets = 200;
for(i=0;i<maxBullets;i++)
{
bulletPositionX[i] = gunPositionX;
bulletPositionY[i] = gunPositionY;
bulletDirectionX[i] = shipDirectionX;
bulletDirectionY[i] = shipDirectionY;
bulletSpeed[i] = 7;
bulletRadius[i] = 4;
bulletStatus[i] = false; //0 == off
}
maxAsteroid = 15;
for(i=0;i<maxAsteroid;i++)
{
asteroidPositionX[i] = random(0, ratioX * viewportScale);
asteroidPositionY[i] = random(0, ratioY * viewportScale);
asteroidDirectionX[i] = random(-1,1);
asteroidDirectionY[i] = random(-1,1);
asteroidRadius[i] = random(5,45);
asteroidSpeed[i] = random(2, 5);
asteroidStatus[i] = true;
}
}
function draw() {
background(0);
if(shipLife)
{
playerInput();
updateShipDirection();
updateShipPosition();
updateGunPosition();
if(bulletStatus)
updateBulletPosition();//Later on we are going to have many bullets
updateAsteroid();
}
drawGameObjects();
}
function playerInput()
{
if(keyIsDown(38))//UP_ARROW is a constant with value 38
{
shipSpeed = shipSpeed + shipAcceleration;
if(shipSpeed >shipMaxSpeed)
shipSpeed = shipMaxSpeed;
}
if(keyIsDown(LEFT_ARROW))
{
shipAngle = shipAngle - 0.02; //Its in radian
}
else if(keyIsDown(RIGHT_ARROW))
{
shipAngle = shipAngle + 0.02; //Its in radian
}
if(fire)
{fire=0;
//Search for an status false bullet
for(i=0; i<maxBullets;i++)
if(bulletStatus[i] == false)
break;
bulletStatus[i] = true;
bulletPositionX[i] = gunPositionX + shipDirectionX*gunRadius;
bulletPositionY[i] = gunPositionY + shipDirectionY*gunRadius;
bulletDirectionX[i] = shipDirectionX * bulletSpeed[i];
bulletDirectionY[i] = shipDirectionY * bulletSpeed[i];
//print(bulletDirectionX[i],bulletDirectionY[i]);
}
}
function updateShipDirection()
{
shipDirectionX = cos(shipAngle);
shipDirectionY = sin(shipAngle);
}
function updateShipPosition()// P = P + Vt or P = P + direction * speed
{
if(shipSpeed < 0)
shipSpeed = 0;
else
shipSpeed = shipSpeed - shipFriction;
shipPositionX = shipPositionX + shipDirectionX * shipSpeed;
shipPositionY = shipPositionY + shipDirectionY * shipSpeed;
if(shipPositionX < 0)
shipPositionX = ratioX * viewportScale;
else if(shipPositionX > ratioX * viewportScale)
shipPositionX = 0;
else if(shipPositionY < 0)
shipPositionY = ratioY * viewportScale;
else if(shipPositionY > ratioY * viewportScale)
shipPositionY = 0;
//Check for Asteriod
for(i=0; i<maxAsteroid ;i++)//For every Asteroid
if(asteroidStatus[i])
{
if(pointCircleIntersection(shipPositionX,shipPositionY, asteroidPositionX[i],asteroidPositionY[i], asteroidRadius[i]))
{
asteroidStatus[i] = false;
shipLife = shipLife - 1;
}
}
}
function updateGunPosition()
{
gunPositionX = shipPositionX;
gunPositionY = shipPositionY;
}
function updateBulletPosition()
{
for(i=0;i<maxBullets;i++)
if(bulletStatus[i] == true)
{
bulletPositionX[i] = bulletPositionX[i] + bulletDirectionX[i];
bulletPositionY[i] = bulletPositionY[i] + bulletDirectionY[i];
}
for(i=0;i<maxBullets;i++)
if(outOfBound(bulletPositionX[i], bulletPositionY[i]))
bulletStatus[i] = false;
}
function updateAsteroid()
{
//Check for bullet intersection
for(i=0; i<maxAsteroid ;i++)//For every Asteroid
if(asteroidStatus[i])
for(j=0; j<maxBullets; j++)////Check all the bullet distances
{
if(bulletStatus[j] && pointCircleIntersection(bulletPositionX[j],bulletPositionY[j], asteroidPositionX[i],asteroidPositionY[i], asteroidRadius[i]))
{
asteroidStatus[i] = false;
bulletStatus[j] = false;
shipScore = shipScore + 1000;
}
}
for(i=0;i<maxAsteroid;i++)//Update position
if(asteroidStatus[i] == true)
{
asteroidPositionX[i] = asteroidPositionX[i] + asteroidDirectionX[i];
asteroidPositionY[i] = asteroidPositionY[i] + asteroidDirectionY[i]; }
for(i=0;i<maxAsteroid;i++)//Wrap the Asteroid
if(outOfBound(asteroidPositionX[i], asteroidPositionY[i]))
{
if(asteroidPositionX[i] < 0)
asteroidPositionX[i] = ratioX * viewportScale;
else if(asteroidPositionX[i] > ratioX * viewportScale)
asteroidPositionX[i] = 0;
else if(asteroidPositionY[i] < 0)
asteroidPositionY[i] = ratioY * viewportScale;
else if(asteroidPositionY[i] > ratioY * viewportScale)
asteroidPositionY[i] = 0;
}
}
function drawGameObjects()
{
//Drawing the ship
stroke(255,255,255);
strokeWeight(shipRadius);
point(shipPositionX, shipPositionY);
//Drawing the gun
strokeWeight(2);
line(gunPositionX, gunPositionY,
gunPositionX + (shipDirectionX*gunRadius),
gunPositionY + (shipDirectionY*gunRadius));
//Drawing the bullet(s)
strokeWeight(5);
for(i=0;i<maxBullets;i++)
if(bulletStatus[i])
point(bulletPositionX[i],bulletPositionY[i]);
//Drawing the Asteroids
strokeWeight(1);fill(180);
for(i=0;i<maxAsteroid;i++)
if(asteroidStatus[i])
circle(asteroidPositionX[i],asteroidPositionY[i], asteroidRadius[i]);
strokeWeight(1);fill(255);
text(shipScore, 50,20);
//text(shipLife, 50, 35);
for(i=0;i<shipLife;i++)
text("O", 50+(i*15), 35);
if(shipLife == 0)
text("Game Over", ratioX * viewportScale/2-20, ratioY * viewportScale/2);
}
function outOfBound(x, y)
{
if(x < 0 || x > ratioX * viewportScale || y <0 || y > ratioY * viewportScale)
return true;
else
return false;
}
function keyPressed() {
if (keyCode === 32)
{
fire = 1;
} else
fire = 0;
}
function pointCircleIntersection(pointX, pointY, circleCenterX, circleCenterY, circleRadius)
{
let diffX = circleCenterX - pointX;
let diffY = circleCenterY - pointY;
let squaredDistance = diffX*diffX + diffY*diffY;
if(squaredDistance > circleRadius*circleRadius)
return false;
return true;
}