Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
//obstacle variables
float ballX1 = 0;
float ballX2 = 400;
float ballY1 = 125;
float ballY2 = -275;
float ballW = 50;
float ballH = 50;
float ballSpeed = 5;
float movementY = 3;

//cannon variables
float quadX = 0;
float quadY = 50;
float quadY2 = -350;
float rectX = 0;
float rectY = 125;
float rectY2 = -275;

//background paths
float pathX = 0;
float pathY = 0;
float pathFinish = -800;

//player variables
float shipX = 200;
float shipY = 380;
float shipSpeedY = -3;
float flameX = 196.5;
float flameY = 390;
float flameTip = 398;
float lazerX = 200;
float lazerY = 380;
float lazerSpeedY = -10;
float lazerSpeedX1 = 0.5;
float lazerSpeedX2 = 0.5;

//player movement variables
float thrust = 0.5;
float acceleration = 0.1;
float speed1 = 0.5;
float speed2 = 0.5;

//enemy variables
float enemyX = 200;
float enemyY = -600;
float enemySpeedY = 3;
float enemyFlameX = 196;
float enemyFlameY = -610;
float enemyTip = -630;
float enemyThrust = 1.5;
float enemyLazX = enemyX - 15;
float enemyLazY = -600;
float enemyLazSpeedY = 10;
float enemyLazSpeedX = 1.5;

//scoring variables
int count = 0;
int enemyDeaths = 0;

//switches
boolean start = false;
boolean trigger = false;
boolean shoot = false;
boolean boost = false;
boolean enemyShoot = false;
boolean enemyDead = false;
boolean victory = false;


void setup() {
  size(400, 400);
  ellipseMode(CENTER);
  rectMode(CENTER);
  println("Click to start!");
}

void draw() {

  background(0);
  
  //star placement
  drawStars(60, 20);
  drawStars(140, 40);
  drawStars(40, 90);
  drawStars(200, 140);
  drawStars(60, 190);
  drawStars(250, 230);
  drawStars(160, 260);
  drawStars(300, 290);
  drawStars(230, 340);
  drawStars(320, 360);
  drawStars(150, 380);
  drawStars(230, 30);
  drawStars(30, 350);
  drawStars(75, 280);
  drawStars(300, 60);
  drawStars(320, 170);
  drawStars(360, 240);
  drawStars(380, 100);
  drawStars(360, 40);

  //path structure
  fill(80);
  stroke(0);
  rect(pathX + 200, pathY - 400, 150, 100);
  rect(pathX + 200, pathY - 300, 150, 100);
  rect(pathX + 200, pathY - 200, 150, 100);
  rect(pathX + 200, pathY - 100, 150, 100);
  rect(pathX + 200, pathY, 150, 100);
  rect(pathX + 200, pathY + 100, 150, 100);
  rect(pathX + 200, pathY + 200, 150, 100);
  rect(pathX + 200, pathY + 300, 150, 100);
  rect(pathX + 200, pathY + 400, 150, 100);
  
  //draw all objects
  drawFinish(pathX + 200,pathFinish,150);
  drawShip();
  drawEnemy();
  drawLeftCannon();
  drawRightCannon();
  
  //cannons continuosly fire
  if (ballX1 >= 450) {
    ballX1=ballX1-460;
  }
  if (ballX2 <= -50) {
    ballX2=ballX2+460;
  }

  //player resets when hit by left cannon
  if ((shipX <= ballX1 + 25 && shipX >= ballX1 - 25) && (shipY - 20 <= ballY1 + 25 && shipY - 20 >= ballY1 - 25)) {
    start = false;
    flameY = 390;
    flameTip = 398;
  }

//player resets when hit by right cannon
  if ((shipX <= ballX2 + 25 && shipX >= ballX2 - 25) && (shipY - 20 <= ballY2 + 25 && shipY - 20 >= ballY2 -25)) {
    start = false;
    flameY = 390;
    flameTip = 398;
  }
  
   //player resets when hit by enemy fire
    if ((enemyLazX >= shipX - 60 && enemyLazX <= shipX + 40) && (enemyLazY >= shipY -10 && enemyLazY <= shipY + 5)){
    start = false;
    flameY = 390;
    flameTip = 398;
  }
  
  //loop path
while (pathY >= 400 && start == true) {
    pathY = pathY - 400 ;
  } 

//when game starts
  if (start == true) {
    
   
   //ship flies up
    runShip();
    
     //ship remains at y = 300
  if (shipY <= 300 && victory == false) {
    shipY = 300;
    shipSpeedY = 0;
    flameY = 290;
    flameTip = shipY + 40;
  
  //ship flies off after crossing finish line and game is over
  } else if (victory == true){
    shipY = shipY + shipSpeedY;
    flameY = shipY + 10;
    flameY = flameY + shipSpeedY;
  flameTip = shipY + 40;
    shipSpeedY = -3;
    lazerY = -100;
  
  //game says victory
    println("Victory!");
   
    //game resets by clicking after game is over
    if (mousePressed && shipY < 0){
      start = false;
      flameY = 390;
      flameTip = 398;
    }
  }
  
     //movement illusion while ship stays in place
    if (shipY == 300){ 
      
      //cannons move
    quadY = quadY + movementY;
    ballY1 = ballY1 + movementY;
    rectY = rectY + movementY;

    quadY2 = quadY2 + movementY;
    ballY2 = ballY2 + movementY;
    rectY2 = rectY2 + movementY;

    //path moves
    pathY = pathY + movementY;
   
    //loop cannons after going off screen
  if (quadY >= 800 && enemyDeaths <= 2) {

    drawLeftCannon();
    rectY = rectY - 1000;
    quadY = quadY - 1000;
    ballY1 = ballY1 - 1000;
  }
  
  if (quadY2 >= 800 && enemyDeaths <= 2) {

    drawRightCannon();
    rectY2 = rectY2 - 1000;
    quadY2 = quadY2 - 1000;
    ballY2 = ballY2 - 1000;
  } 
  }
    } else {
  
     //game restart
    resetGame();
    start = false;
  }
  
  //reset other statements at game restart
  if (start == false) {
    trigger = false;
    shoot = false;
    enemyShoot = false;
   
    //say click to start
     println("Click to start!");
     
     //scores start at zero
    count = 0;
    enemyDeaths = 0;
  }
  
  //keep track of how many balls avoided
  if (((ballY1 >= 300 && ballY1 <= 302) || (ballY2 >= 300 && ballY2 <= 302)) && start == true && movementY == 3 && boost == false) 
  {
    count = count + 1;
    println("Blasts Avoided " + count);
    
    //different number range when boosting
  } else if ((boost == true && ballY1 >= 300 && ballY1 <= 305) || (boost == true && ballY2 >= 300 && ballY2 <= 305)){
     count = count + 1;
    println("Blasts Avoided " + count);
  }
  
  //ball speed increases
  if (count >= 3 && count <=6){
    ballSpeed = 8;
    } 
    
    //enemy appears
    if (ballSpeed == 8 && count >= 6){
      runEnemy();
      }
      
      //enemy re-appears faster
      if (enemyDeaths == 1){
         enemyX = enemyX + enemyThrust;
      enemyFlameX = enemyFlameX + enemyThrust;
      enemyLazX = enemyLazX + enemyLazSpeedX;
      }
      
      //enemy re-appears even faster
      if (enemyDeaths >= 2){
         enemyX = enemyX + enemyThrust * 2;
      enemyFlameX = enemyFlameX + enemyThrust * 2;
      enemyLazX = enemyLazX + enemyLazSpeedX * 2;
      }
      
      //finish line approaches
      if (enemyDeaths == 3){
         enemyY = -200;
         enemyLazY = -200;
         enemyFlameY = -200;
         enemyTip = -210;
         pathFinish = pathFinish + movementY;
        }
        
        //game is over and everything stops moving
        if (pathFinish >= 200){
          victory = true;
          pathY = 200;
          pathFinish = 200;
         }
        
        
     
}


//draw player ship
void drawShip() {
  fill(255, 0, 0);
  triangle(flameX - 7, flameY, flameX, flameY, flameX - 3, flameTip);
  triangle(flameX + 7, flameY, flameX + 14, flameY, flameX + 11, flameTip);

  //flame animation
 if (start == false){
   flameTip = flameTip + thrust;
  if (flameTip>=flameY + 10 || flameTip<=flameY + 6) {
    thrust=thrust *-1;
    
  }
 }

  //lazer beams
  noStroke();
  fill(150, 250, 0);
  rect(lazerX - 13, lazerY - 10, 3, 6);
  rect(lazerX + 14, lazerY - 10, 3, 6);

  //ship structure
  stroke(0);
  fill(200);
  rect(shipX-13, shipY-10, 5, 12);
  rect(shipX+14, shipY-10, 5, 12);
  
  fill(200);
  rect(shipX-7, shipY+10, 7, 10);
  rect(shipX+8, shipY+10, 7, 10);
  
  fill(0, 0, 200);
  quad(shipX-30, shipY+10, shipX-10, shipY-10, shipX+10, shipY-10, shipX+30, shipY+10);
  triangle(shipX-10, shipY, shipX, shipY-30, shipX+10, shipY);
  rect(shipX, shipY, 20, 20);
  
  noStroke();
  fill(0);
  triangle(shipX - 5, shipY - 10, shipX, shipY - 20, shipX + 5, shipY -10);
  ellipse(shipX, shipY-8, 10, 10);
}


//activate ship movement and controls
void runShip() {
  shipY = shipY + shipSpeedY;
  lazerY = lazerY + shipSpeedY;
  shipSpeedY = shipSpeedY - acceleration;
  flameY = flameY + shipSpeedY;
  flameTip = shipY + 40;
  
  //boost
    if (keyPressed) {
      boost = true;
      
      //increase speed
      movementY = 6;
      
      //speed lines for effect
      stroke(200);
      line(shipX - 30, shipY + 10, shipX - 30, shipY + 30);
      line(shipX + 30, shipY + 10, shipX + 30, shipY + 30);
      
      //show boost flames
      drawBoost();
    
  } else {
      movementY = 3;
      boost = false;
    }

//control ship left
    if (mouseX <= shipX) {

      shipX = shipX - speed1;
      flameX = flameX - speed1;
      lazerX = lazerX - lazerSpeedX1;

      lazerSpeedX1 = lazerSpeedX1 + acceleration;
      lazerSpeedX2 = 0;

      speed1 = speed1 + acceleration;
      speed2 = 0;
    } else {

      //control ship right
      shipX = shipX + speed2;
      flameX = flameX + speed2;
      lazerX = lazerX + lazerSpeedX2;

      lazerSpeedX2 = lazerSpeedX2 + acceleration;
      lazerSpeedX1 = 0;

      speed2 = speed2 + acceleration;
      speed1 = 0;
    }
    
    //trigger activates lazer
  if (shipY <= 300) {
    trigger = true;
  } else {
    trigger = false;
  }
  
  //mouse click shoots
  if (trigger == true && mousePressed) {
    shoot = true;
  }
  
  //lazer shoots straight
  if (shoot == true) {
    lazerY = lazerY - 10;
    lazerSpeedX1 = 0;
    lazerSpeedX2 = 0;
  }
  
  //lazer returns to position related to ship
  if (lazerY <= -20) {
    shoot = false;
    lazerY = 300;
  } 
  
  //lazer continues to move with ship
  if (shoot == false) {
    lazerX = shipX + acceleration;
    lazerSpeedX1 = 0.5;
    lazerSpeedX1 = lazerSpeedX1 + acceleration;

    lazerSpeedX2 = 0.5;
    lazerSpeedX2 = lazerSpeedX2 + acceleration;
  }
    }

//boost flames
void drawBoost() {
  noStroke();
  fill(0, 0, 255);
  ellipse(shipX - 7, shipY + 32, 6, 30);
  ellipse(shipX + 7, shipY + 32, 6, 30);

  fill(255);
  ellipse(shipX - 7, shipY + 32, 2, 35);
  ellipse(shipX + 7, shipY + 32, 2, 35);
}

//left cannon structure with shoot speed = 5
void drawLeftCannon() {
  
  //outer ball
  fill(150, 255, 150);
  noStroke();
  ellipse(ballX1, ballY1, ballW, ballH);
  
  //inner ball
  fill((int) random(0,256),(int) random(0,256),(int) random(0,256));
  ellipse(ballX1, ballY1, ballW - 15, ballH - 15);
  ballX1=ballX1+ballSpeed;

  
  
  
  //tube
  stroke(0);
  fill(100);
  rect(rectX, rectY, 120, 80);
  
  //base
  fill(150,0,0);
  quad(quadX, quadY, quadX + 50, quadY + 25, quadX + 50, quadY + 125, quadX, quadY + 150);
}

//right cannon structure with shoot speed faster than left cannon
void drawRightCannon() {
  
  //outer ball
  fill(255, 150, 150);
  noStroke();
  ellipse(ballX2, ballY2, ballW, ballH);
  
  //inner ball
  fill((int) random(0,256),(int) random(0,256),(int) random(0,256));
  ellipse(ballX2, ballY2, ballW - 15, ballH - 15);
  ballX2=ballX2-ballSpeed * 1.2;

  
  
  //tube
  stroke(0);
  fill(100);
  rect(rectX + 400, rectY2, 120, 80);
  
  //base
  fill(150,0,0);
  quad(quadX + 400, quadY2, quadX + 350, quadY2 + 25, quadX + 350, quadY2 + 125, quadX + 400, quadY2 +150);
}

//draw stars in background
void drawStars(float starX, float starY) {

  //random colours changing
  fill((int) random(0,256),(int) random(0,256),(int) random(0,256));
  noStroke();
  ellipse(starX, starY, 5, 5);
}

//enemy ship
void drawEnemy() {
  
  //flames
  fill(230, 100, 0);
  triangle(enemyFlameX, enemyFlameY, enemyX, enemyTip, enemyX + 4, enemyFlameY);

//enemy lazers
fill(0,255,0);
noStroke();
rect(enemyLazX,enemyLazY,3,10);
rect(enemyLazX + 30,enemyLazY,3,10);

//structure
  stroke(0);
  fill(150, 0, 0);
  rect(enemyX - 15, enemyY + 5, 10, 20);
  rect(enemyX + 15, enemyY + 5, 10, 20);
  rect(enemyX, enemyY - 5, 10, 20);
  ellipse(enemyX, enemyY, 60, 20);

  fill(50);
  ellipse(enemyX, enemyY + 4, 20, 10);

  fill(0, 200, 0);
  ellipse(enemyX - 20, enemyY, 5, 5);
  ellipse(enemyX + 20, enemyY, 5, 5);
}

//enemy movement
void runEnemy(){
  
  //enemy flies down
   enemyY = enemyY + enemySpeedY;
    enemyFlameY = enemyFlameY + enemySpeedY;
    enemyTip = enemyY - 50;
    enemyLazY = enemyLazY + enemySpeedY;
    
    //keep enemy on screen
    if (enemyY >= 100) {
      enemySpeedY = 0;
    }
    
    //all enemy parts move together at y = 100 and enemy shoots continuously
    if (enemySpeedY <= 0) {
      enemyX = enemyX + enemyThrust;
      enemyFlameX = enemyFlameX + enemyThrust;
      enemyTip = 60;
      enemyLazX = enemyLazX + enemyLazSpeedX;
      enemyShoot = true;
       } else {
      enemyShoot = false;
       }
       
        //enemy moves left and right
    if (enemyX >= 370 || enemyX <= 30) {
      enemyThrust = enemyThrust * -1;
      enemyLazSpeedX = enemyLazSpeedX * -1;
    }
     
     //enemy shoots every time enemyLazY >= 650
    if (enemyShoot == true && enemyLazY <= 650 && start == true){
      enemyLazY = enemyLazY + enemyLazSpeedY;
    } else if (enemyLazY >= 650) {
      enemyLazY = 100;
       }
       
       //enemy shot goes straight
       if (enemyLazY > 100 && enemyLazY < 650 && enemyShoot == true){
         enemyLazSpeedX = 0;
       
       //lazer moves with enemy after every shot
       } else {
         enemyLazSpeedX = 1.5;
         enemyLazX = enemyX - 15;
       }
          
         //destroy enemy
  if ((lazerX >= enemyX - 40 && lazerX <= enemyX + 40) && (lazerY >= enemyY - 20 && lazerY <= enemyY)){
    enemyDead = true;
  } else if (enemyDead == true) {
    
    //reset enemy off screen
 enemyX = 200;
 enemyY = -600;
 enemySpeedY = 3;
 enemyFlameX = 196;
 enemyFlameY = -610;
 enemyTip = -600;
 enemyThrust = 1.5;
 enemyLazX = enemyX - 15;
 enemyLazY = -600;
 enemyLazSpeedY = 10;
 enemyLazSpeedX = 1.5;
 enemyDeaths = enemyDeaths + 1;
enemyDead = false;
  }
}

//reset coordinates and statements
void resetGame(){
    start = false;
    victory = false;
   
    shipY = 380;
    shipX = 200;
    shipSpeedY = 0;
    flameX = 196.5;
    flameY = 390;
    
    lazerX = 200;
    lazerY = 380;

    rectY = 125;
    quadY = 50;
    ballY1 = 125;

    rectY2 = -275;
    quadY2 = -350;
    ballY2 = -275;
    ballSpeed = 5;
    
    enemyX = 200;
    enemyY = -200;
    enemySpeedY = 3;
    enemyFlameX = 196;
    enemyFlameY = -210;
    enemyTip = -230;
    enemyThrust = 1.5;
    enemyLazY = -200;
    enemyLazX = enemyX - 15;
    
    pathFinish = -800;
    enemyDeaths = 0;
    count = 0;
  }

//finish line
void drawFinish(float x, float y, float w){
   
 //white strip
  fill(255);
  rect(x,y,w,w/2);
  
  //checkers
  fill(0);
  rect(x - w/2.4,y - w/8, w/6, w/4);
  rect(x - w/4,y + w/8, w/6, w/4);
  rect(x - w/12,y - w/8, w/6, w/4);
  
  rect(x + w/12,y + w/8, w/6, w/4);
  rect(x + w/4,y - w/8, w/6, w/4);
  rect(x + w/2.4,y + w/8, w/6, w/4);
}

  //clicking mouse starts game
  void mousePressed() {
  start = true;
}