//player related variables
float playerX;
float playerY;
float playerH;
float playerW;
float playerOpacity;
boolean invincible = false;
float hitTime;
int playerLives = 3;
float speed;
float road1 = 1;
//menu related variables
boolean gameStart = false;
int menuTime;
boolean isSpawned = false;
float carX;
float carY;
float carH = 55;
float carW = 28;
float carX2;
float carY2;
float carH2 = 50;
float carW2 = 25;
//car spawn locations
float carSpawnX1 = 287;
float carY1= 402;
float carSpawnX2 = 237;
float carSpawnX3 = 187;
float carSpawnX4 = 137;
float carSpawnX5= 87;
int score;
int highScore = 0;
float preSpawn = 0;
float carSpawn;
void setup () {
size (400, 400);
frameRate = 30;
score = 0;
playerX = 187;
playerY = 320;
playerH = 50;
playerW= 26;
speed = 10;
}
void draw () {
noStroke();
//Upate
updatePlayer ();
updateScore();
speed = score * 0.0001;
//Draw
drawTerrain();
drawCar1();
drawCar2();
drawPlayer();
drawScore();
if (gameStart == false ) {
gameMenu();
}
}
void gameMenu () {
fill(255);
textSize (60);
text ( "Desert Racer", 20, 150);
fill ( 255, 255, 255, 125 * sin(0.3 * frameCount) + 125);
textSize(20);
menuTime = millis();
text ("Click to start", 150, 200);
if (mousePressed ==true ) {
gameStart = true;
}
}
void updateScore() {
if ( gameStart) {
score = (millis() - menuTime)/2;
}
}
void drawScore() {
fill(255, 0, 0);
textSize ( 13);
text ( "score " + score, 10, 10);
text ("Highscore " +highScore, 250, 10);
}
void drawTerrain() {
background (180, 125, 70);
fill (100, 100, 100);
rect ( 75, 0, 250, 400);
stroke ( 200, 200, 50 ) ;
strokeWeight(3);
//road line 1
road1 = road1 + 2 + (1 *speed);
if (road1 >= 400) {
road1 = 1;
}
for ( int i = 1; i < 21; i++) {
float f = -400 + (i * 20);
line ( 125, road1 + f, 125, road1 + f + 10);
}
for ( int i = 1; i < 20; i++) {
float f = (i * 20);
line ( 125, road1 + f, 125, road1 + f + 10);
}
//road line 2
if (road1 >= 400) {
road1 = 1;
}
for ( int i = 1; i < 21; i++) {
float f = -400 + (i * 20);
line ( 175, road1 + f, 175, road1 + f + 10);
}
for ( int i = 1; i < 20; i++) {
float f = (i * 20);
line ( 175, road1 + f, 175, road1 + f + 10);
}
//road line 3
if (road1 >= 400) {
road1 = 1;
}
for ( int i = 1; i < 21; i++) {
float f = -400 + (i * 20);
line ( 225, road1 + f, 225, road1 + f + 10);
}
for ( int i = 1; i < 20; i++) {
float f = (i * 20);
line ( 225, road1 + f, 225, road1 + f + 10);
}
//road line 3
if (road1 >= 400) {
road1 = 1;
}
for ( int i = 1; i < 21; i++) {
float f = -400 + (i * 20);
line ( 275, road1 + f, 275, road1 + f + 10);
}
for ( int i = 1; i < 20; i++) {
float f = (i * 20);
line ( 275, road1 + f, 275, road1 + f + 10);
}
stroke(255);
strokeWeight(2);
line (80, 0, 80, 400);
line ( 320, 0, 320, 400);
noStroke();
}
void updatePlayer () {
if ( mouseX > playerX + 30) {
playerX = playerX +( 0.005 * (mouseX - playerX));
}
if ( mouseX < playerX -5) {
playerX = playerX - (0.005 * (playerX - mouseX));
}
if ( mousePressed && mouseButton == LEFT) {
playerY = playerY - 1;
}
if (mousePressed && mouseButton == RIGHT) {
playerY = playerY + 1;
}
if (invincible == true && millis() - hitTime > 3000) {
invincible = false;
}
}
void hit() {
println ("hit");
//set play to be invincible when hit
if (invincible == false ) {
if ( playerLives == 1 ) {
reset();
} else {
invincible = true;
speed = 1;
playerLives = playerLives - 1;
hitTime = millis();
}
}
}
void reset () {
highScore = score;
score = 0;
gameStart = false;
playerLives = 3;
}
void drawPlayer () {
noStroke();
if ( invincible == true && gameStart) {
playerOpacity = 127 * sin ( 20 * frameCount )+ 127;
} else {
playerOpacity = 255;
}
//tires
fill ( 60, 60, 60, playerOpacity);
rect ( playerX - 2, playerY + 8, 3, 12);
rect ( playerX - 2, playerY + 36, 3, 12);
rect ( playerX + 25, playerY + 8, 3, 12);
rect (playerX + 25, playerY + 36, 3, 12);
fill (130, 0, 0, playerOpacity );
//body
rect (playerX, playerY, playerW, playerH);
fill (100, 0, 0, playerOpacity);
rect (playerX, playerY + 45, 26, 5);
fill (130, 0, 0, playerOpacity);
rect ( playerX, playerY + 42, 26, 3);
rect ( playerX + 4, playerY + 18, 18, 12);
fill (120, 0, 0, playerOpacity);
quad ( playerX, playerY +14, playerX, playerY +42, playerX + 4, playerY + 30, playerX + 4, playerY + 18);
quad ( playerX + 26, playerY + 14, playerX + 26, playerY + 42, playerX + 22, playerY + 30, playerX + 22, playerY + 18);
//windows
fill (145, 190, 240, playerOpacity);
quad ( playerX+1, playerY + 14, playerX + 4, playerY + 18, playerX + 22, playerY + 18, playerX + 25, playerY + 14);
quad ( playerX+1, playerY + 42, playerX + 25, playerY + 42, playerX + 22, playerY + 32, playerX + 4, playerY + 32);
//lights
//triangle ( playerX +8, playerY + 10, playerX -15, playerY - 60, playerX + 31, playerY - 60);
}
//determine car spawn location
void spawnCar () {
//place car in random lane
float r = random(1, 5);
int f = round(r);
if ( f == 1) {
carSpawn = carSpawnX1;
} else if (f==2) {
carSpawn= carSpawnX2;
} else if (f == 3) {
carSpawn = carSpawnX3;
} else if ( f == 4) {
carSpawn = carSpawnX4;
} else if ( f == 5) {
carSpawn = carSpawnX5;
}
// stop cars from spawning in the same lane
if ( preSpawn == carSpawn) {
spawnCar();
}
preSpawn = carSpawn;
}
void drawCar1() {
if (rectRect (carX, carY1, carW, carW, playerX, playerY, playerW, playerH) == true && invincible == false && gameStart) {
hit();
}
if (isSpawned == false ) {
carX = 87;
isSpawned = true;
}
carY1 = carY1 + (1 *speed);
//fill(120);
// rect ( carX + 2 , carY1-10, 24, 10);
fill(240);
//float carPosX = carX1;
//stroke(0);
rect ( carX, carY1, 28, 45);
fill(200);
rect (carX, carY1 + 30, 28, 25);
fill ( 200, 0, 0 );
rect ( carX, carY1 + 45, 28, 3);
fill(60);
rect ( carX + 5, carY1 + 35, 18, 20);
fill(80) ;
rect ( carX -1, carY1 + 54, 30, 3);
fill (100);
rect (carX - 1, carY1 + 53, 30, 1);
if (carY1 >= 400) {
spawnCar ();
carX = carSpawn;
carY1 = -20;
}
}
void drawCar2() {
carY2 = carY2 + 1;
if (carY2 >= 400) {
spawnCar();
carX2 = carSpawn;
carY2 = -60;
}
//tires
fill (60);
rect ( carX2 - 2, carY2 +10 , 3, 10);
rect ( carX2 + 25, carY2 +10 , 2 , 10);
rect ( carX2 - 2, carY2 + 37, 2 , 10);
rect ( carX2 + 25, carY2 + 37, 2 ,10);
//body
fill ( 0, 100, 0);
rect ( carX2, carY2, 25, 50);
fill (0, 115, 0);
rect (carX2, carY2 + 10, 25, 15 );
fill ( 0, 60, 0 );
rect( carX2 + 3, carY2 + 34, 19, 8);
fill ( 0, 80, 0 ) ;
rect ( carX2, carY2 + 43, 25, 7);
rect ( carX2, carY2 + 25, 25, 7);
rect ( carX2 + 3, carY2 + 32, 19, 2);
}
//collision system from http://www.jeffreythompson.org/collision-detection/rect-rect.php
boolean rectRect(float r1x, float r1y, float r1w, float r1h, float r2x, float r2y, float r2w, float r2h) {
// are the sides of one rectangle touching the other?
if (r1x + r1w >= r2x && // r1 right edge past r2 left
r1x <= r2x + r2w && // r1 left edge past r2 right
r1y + r1h >= r2y && // r1 top edge past r2 bottom
r1y <= r2y + r2h) { // r1 bottom edge past r2 top
return true;
}
return false;
}