Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
boolean alive = false;

int numEnemies = 2;
int carWidth = 30;
int carHeight = 50;
int enemySpeed = 1;
int respawnMaxHeight = -200;

int overlayOpacity;
int lineOffset;

int level;
int scoreCurrent;
int scoreMax;
int scoreIncrease = 10;

float playerX;
float playerY;
float enemy1X;
float enemy1Y;
float enemy2X;
float enemy2Y;

void setup() {
  size (400,400);
  
  rectMode(CENTER);
  noStroke();
  
  startGame();
}

void draw() {
  background(150);
  
  //update overlay opacity
  if (overlayOpacity > 0) {
    overlayOpacity--;
  }
  
  
  if (alive) {
    //update player position
    playerX = mouseX;
    playerY = mouseY;
    
    //increase and check score
    updateScore();
    
    //increase line offset to create illusion of movement
    lineOffset+= 2 * (enemySpeed + level);
    while (lineOffset >= 30) {
      lineOffset -= 30;
    }
  }
  //update and check enemy positions
  updateEnemyPos();
  
  //draw moving lines on the road
  drawRoad();
  
  //draw player and enemies
  drawCar(playerX,playerY,255,0,0,true);
  drawCar(enemy1X,enemy1Y,0,255,0,false);
  drawCar(enemy2X,enemy2Y,0,0,255,false);
  
  //draw overlay
  fill(255,255,255,overlayOpacity);
  rect(200,200,width,height);
  
  //draw scorebox
  fill(255,255,255);
  rect(200,10,(width * scoreCurrent / scoreMax),10);
}

//USER DEFINED FUNCTIONS
void startGame(){
  alive = true;
  scoreMax = 500;
  scoreCurrent = 0;
  level = 1;
  for (int i = 1; i <= numEnemies; i++) {
    resetEnemyPos(i);
  }
}

void mouseClicked(){
  if (alive == false) {
    startGame();
  }
}

void drawCar(float drawX, float drawY, int red,int green, int blue, boolean drawPlayer) {
  //draw car base
  fill(red,green,blue);
  rect(drawX,drawY,carWidth,carHeight);
  
  //add player stripes
  if (drawPlayer) {
    fill(0,0,0);
    rect(drawX-5,drawY,4,carHeight);
    rect(drawX+5,drawY,4,carHeight);
  }
  
  //add windshield
  fill(100);
  rect(drawX,drawY-10,20,10);
}

void updateEnemyPos() {
  if (alive) {
    //move enemies down screen
    enemy1Y += enemySpeed + level;
    enemy2Y += enemySpeed + level;
    
    //check if enemy is offscreen
    if (enemy1Y >= height + carHeight) {
      resetEnemyPos(1);
    }
    //check if enemy is colliding with player
    else if (((enemy1Y - carHeight < playerY) && (playerY < enemy1Y + carHeight)) && ((enemy1X - carWidth < playerX) && (playerX < enemy1X + carWidth))) {
      alive = false;
    }
    
    //check if enemy is offscreen
    if (enemy2Y >= height + carHeight) {
      resetEnemyPos(2);
    }
    //check if enemy is colliding with player
    else if (((enemy2Y - carHeight < playerY) && (playerY < enemy2Y + carHeight)) && ((enemy2X - carWidth < playerX) && (playerX < enemy2X + carWidth))) {
      alive = false;
    }
  }
  
  else {
    //move enemies up screen
    enemy1Y -= 2 * (enemySpeed + level);
    enemy2Y -= 2 * (enemySpeed + level);
    
    //check if enemies are offscreen
    if (enemy1Y <= - carHeight) {
      resetEnemyPos(1);
    }
    if (enemy2Y <= - carHeight) {
      resetEnemyPos(2);
    }
  }

}

void resetEnemyPos(int enemyNum){
  if (enemyNum == 1) {
    enemy1X = random(carWidth, width - carWidth);
    
    if (alive) { //move enemy above the screen
      enemy1Y = random(respawnMaxHeight, 0 - carHeight);
    }
    else { //move enemy below the screen
      enemy1Y = random(height + carHeight, height - respawnMaxHeight);
    }
  }
  
  if (enemyNum == 2) {
    enemy2X = random(carWidth, width - carWidth);
    
    if (alive) { //move enemy above the screen
      enemy2Y = random(respawnMaxHeight, 0 - carHeight);
    }
    else { //move enemy below the screen
      enemy2Y = random(height + carHeight, height - respawnMaxHeight);
    }
  }
}

void updateScore(){
  scoreCurrent++;
  if (scoreCurrent >= scoreMax) {
    level++;
    println("LEVEL " + level);
    scoreMax += scoreIncrease;
    scoreCurrent = 0;
    overlayOpacity = 150;
  }
}

void drawRoad(){
  fill(255,255,0);
  for (int y = lineOffset; y < height; y+=30) {
    for (int x = 15; x < width; x+=75) {
      rect(x,y,3,5);
    }
  }
}