Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/** Meteor Defense 

by Liam Peixoto

In this program, players control an orbital spaceship defending the Earth from falling 
debris from a recent meteor strike on the Moon.

Players control their ship by using WSAD and Spacebar to fire a projectile.

**/

float shipInitialStart = 0; //Initial start of ship
float shipCurrentPos; //Ship position
float bulletX; 
float bulletY;
float bulletWidth;
float bulletHeight;
float randomEnemyInitial = 0; //Asteroid initial start
float enemyY = 185;
float enemyWidth = 0;
float enemyHeight = 0;
float randomGen; //Random number generator

int counter;

boolean shipExist = false; //Boolean for spawning the ship
boolean bulletExist = false; //Boolean for creating a bullet
boolean enemyExist = false; //Boolean for creating an asteroid


void setup()
{
  size(400, 400);
  frameRate(60);
}

void draw()
{
  background(0);
  bGStars();
  bGPattern();
  planet();

  if (enemyExist == false);
  {
    enemy();
  }
  if (enemyExist == true)
  {
    enemyMove();
  }
  if (bulletExist == true)
  {
    bulletTravel();
  }
  if (shipExist == false)
  {
    spaceShipStart();
    shipExist = true;
  }
  if (shipExist == true)
  {
    spaceShip();
  }
}

///////////////////////////////////////////////
///////////////FUNCTIONS///////////////////////
///////////////////////////////////////////////

void enemyMove() //This function moves the enemy towards the ship slowly. Resets the enemy if it moves to a certain Y value
{
  fill(50);
  ellipse(randomEnemyInitial, enemyY+0.2, enemyWidth, enemyHeight);
  enemyY = enemyY+0.2;
  enemyWidth = enemyWidth+0.2;
  enemyHeight = enemyHeight+0.2;
  if (enemyY >= 350)
  {
    resetEnemy();
  }
}

///////////////////////////////////////////////

void resetEnemy() //Resets the enemy to a new random spawn location
{
  enemyExist = false;
  randomEnemyInitial = 0;
  enemyY = 185;
  enemyWidth =0;
  enemyHeight = 0;
  counter = 0;
}

///////////////////////////////////////////////

void enemy() //Ditermines the initial spawn point of the enemy and adds a 5 second delay to spawning an enemy
{

  if (randomEnemyInitial == 0)
  {
    randomGen = random(50, 351);
    counter = millis();
  }
  if (counter >= 5000)
  {
    randomEnemyInitial = randomGen;
    enemyExist = true;
  }
}

///////////////////////////////////////////////

void bulletTravel() //Function for bullet movement and collision. Is called when space is pressed. Fires a bullet upwards which shrinks as it moves away.
{
  if (bulletWidth <= 0)
  {
    bulletExist = false;
  }
  if ((int)bulletY <= (int)enemyY)
  {
    if (bulletX <= (randomEnemyInitial+(enemyWidth/2)) && bulletX >= (randomEnemyInitial-(enemyWidth/2)))
    {
      resetEnemy();
      bulletExist = false;
    }
  }
  fill(#d60000);
  stroke(#ff0000);
  strokeWeight(2);
  ellipse(bulletX, bulletY-2, bulletWidth-0.5, bulletHeight-0.5);
  bulletY = bulletY-2;
  bulletWidth = bulletWidth-0.4;
  bulletHeight = bulletHeight-0.4;
}

///////////////////////////////////////////////

void keyPressed() //Contains various key pressed functions for the A, D, and SPACEBAR keys. A and D move the ship, while space fires a bullet
{                 //Called when keys are pressed
  if (key == 'd')
  {
    shipCurrentPos = shipCurrentPos+15;
    if (shipCurrentPos >= 380)
    {
      shipCurrentPos = 380;
    }
  }
  if (key == 'a')
  {
    shipCurrentPos = shipCurrentPos-15;
    if (shipCurrentPos <= 20)
    {
      shipCurrentPos = 20;
    }
  }
  if (key == ' ')
  {
    bulletX = shipCurrentPos;
    bulletY = 305;
    bulletWidth = 20;
    bulletHeight = 20;
    bulletExist = true;
  }
}

///////////////////////////////////////////////

void spaceShip() //This function creates all graphic aspects of the ship and adds a slight animation to them
{
  rectMode(CENTER);
  ellipseMode(CENTER);
  fill(#470000);
  stroke(#7c0101);
  strokeWeight(3);
  quad((shipCurrentPos-20), 290+3*(sin(radians(frameCount))), (shipCurrentPos-10), 280+3*(sin(radians(frameCount))), (shipCurrentPos+10), 280+3*(sin(radians(frameCount))), (shipCurrentPos+20), 290+3*(sin(radians(frameCount))));
  fill(100);
  strokeWeight(1);
  noStroke();
  rect(shipCurrentPos, 305+3*(sin(radians(frameCount))), 75, 30);
  fill(110);
  triangle((shipCurrentPos-36.5), 320+3*(sin(radians(frameCount))), (shipCurrentPos-100), 315+3*(sin(radians(frameCount))), (shipCurrentPos-36.5), 290+3*(sin(radians(frameCount))));
  triangle((shipCurrentPos+36.5), 320+3*(sin(radians(frameCount))), (shipCurrentPos+100), 315+3*(sin(radians(frameCount))), (shipCurrentPos+36.5), 290+3*(sin(radians(frameCount))));
  fill(50);
  ellipse((shipCurrentPos-18.75), 305+3*(sin(radians(frameCount))), 30, 30);
  ellipse((shipCurrentPos+18.75), 305+3*(sin(radians(frameCount))), 30, 30);
  fill(#ff6b21);
  ellipse((shipCurrentPos-18.75), 305+3*(sin(radians(frameCount))), 23+(sin(radians(frameCount*80))), 23+(sin(radians(frameCount*80))));
  ellipse((shipCurrentPos+18.75), 305+3*(sin(radians(frameCount))), 23+(sin(radians(frameCount*80))), 23+(sin(radians(frameCount*80))));
  fill(#ffe182);
  ellipse((shipCurrentPos-18.75), 305+3*(sin(radians(frameCount))), 15+(sin(radians(frameCount*80))), 15+(sin(radians(frameCount*80))));
  ellipse((shipCurrentPos+18.75), 305+3*(sin(radians(frameCount))), 15+(sin(radians(frameCount*80))), 15+(sin(radians(frameCount*80))));
}

///////////////////////////////////////////////

void spaceShipStart() //Figures out the initial start of the ship and stores it's location
{
  if (shipInitialStart == 0)
  {
    shipInitialStart = random(175, 226);
  }
  fill(100);
  shipCurrentPos = shipInitialStart;
}

///////////////////////////////////////////////

void planet() //Creates the Panet beneath the ship
{
  fill(#102657);
  noStroke();
  ellipse(200, 450, 800, 300);
  fill(#263e7e);
  ellipse(200, 460, 800, 300);
  fill(#2b49a1);
  ellipse(200, 470, 800, 300);
  fill(#004c06);
  quad(0, 400, 0, 385, 50, 355, 50, 400);
  quad(50, 355, 50, 400, 75, 400, 75, 380);
  quad(75, 400, 75, 380, 125, 400, 125, 410);
}

///////////////////////////////////////////////

void bGPattern() //Creates the moon and meteor impact visible in the background
{
  fill(100);
  noStroke();
  ellipse(450, 100, 400, 400);
  fill(75);
  ellipse(375,175,75,75);
  ellipse(325,25,65,65);
  for (int i=0; i<300; i++)
  {
    fill(#d36200);
    noStroke();
    ellipse(i, i/3, 60, 60);
  }
  for (int j=0; j<300; j++)
  {
    fill(#ffdb66);
    noStroke();
    ellipse(j, j/3, 40, 40);
  }
  for(int k=0;k<300;k++)
  {
    fill(#ffecb2);
    noStroke();
    ellipse(k,k/3,20,20);
  }
  fill(#d36200);
  ellipse(300,100,120+7*(sin(radians(frameCount/4))),120+7*(sin(radians(frameCount/4))));
  fill(#ffdb66);
  ellipse(300,100,90+5*(sin(radians(frameCount/3))),90+5*(sin(radians(frameCount/3))));
  fill(#ffecb2);
  ellipse(300,100,60+5*(sin(radians(frameCount/3))),60+5*(sin(radians(frameCount/3))));
}

///////////////////////////////////////////////

void bGStars() //Creates the stars in the background.
{
  fill(255);
  stroke(255);
  point(189, 354);
  point(337, 225);
  point(153, 43);
  point(104, 225);
  point(262, 382);
  point(73, 77);
  point(115, 38);
  stroke(#ffe03d);
  point(129, 252);
  point(52, 209);
  point(278, 248);
  point(72, 374);
  point(252, 27);
  stroke(#bc0000);
  point(209, 136);
  point(117, 60);
  point(204, 103);
  point(147, 197);
  point(91, 348);
  point(113, 156);
  point(350, 200);
}