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);
}
}
}