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