/////////////////////////////////////////////////////////////////////////
///// HURRICANE SIMULATOR //////
///// //////
///// Consume rain clouds to grow larger! //////
///// Normal Clouds make you weaker! //////
///// The special cloud will cut your strength down significantly! //////
///// //////
///// Gain strength and become the strongest hurricane! //////
///// //////
///// W,A,S,D to move, Space to print score & category. //////
///// //////
///// Special Controls: //////
///// "1" will increase score //////
///// "2" will decrease score //////
///// //////
///// Made by : Alexandre Bujold //////
/////////////////////////////////////////////////////////////////////////
//Player Variables
float playerX;
float playerY;
float playerSpeed = 4;
int playerCategory = 1; //Category of Hurricane the player has achieved
int playerScore = 300; //Generic Score to determine Category
float playerRadius = 20; //Used to draw player & check collisions
//Control Variables
boolean playerGoLeft;
boolean playerGoRight;
boolean playerGoUp;
boolean playerGoDown;
boolean showScore;
boolean increaseScore;
boolean decreaseScore;
//Global Variables
float gameDifficulty = 1; //Set to 1 by default
boolean gameStarted;
//Cloud Variables
//Normal Clouds
float normalCloud_X_1; //Position X
float normalCloud_Y_1; //Position Y
float normalCloudSpeed_1 = 1; //Cloud's movement speed
float normalCloud_X_2;
float normalCloud_Y_2;
float normalCloudSpeed_2 = 1;
float normalCloud_X_3;
float normalCloud_Y_3;
float normalCloudSpeed_3 = 1;
//Rain Clouds
float rainCloud_X_1;
float rainCloud_Y_1;
float rainCloudSpeed_1 = 1;
float rainCloud_X_2;
float rainCloud_Y_2;
float rainCloudSpeed_2 = 1;
float rainCloud_X_3;
float rainCloud_Y_3;
float rainCloudSpeed_3 = 1;
//Special Cloud
float specialCloud_X;
float specialCloud_Y;
float specialCloudSpeed;
int specialCloudDirection = 1; //Left to right by default
//General
float cloudRadius = 12.5; //Needed to calculate collisions & draw clouds
void setup()
{
size(400,400);
smooth();
frameRate(60);
gameStarted = false;
}
void draw()
{
background(125); //Set background to gray
//Initialize Game
if (gameStarted == false)
{
for (int i = 0; i < 7; i++)
{
resetCloud(i);
}
gameStarted = true;
playerScore = 300;
playerX = width/2;
playerY = height/2;
}
//Game Functions
checkCollisions();
scoreManager();
playerMovement();
moveClouds();
//Draw Functions
drawBackground();
drawClouds();
drawPlayer();
}
void checkCollisions() //Checks for collisions between player & clouds
{
if (playerCategory >= 4)
{
//Special Cloud (#0)
//get distance between circle's centers (player circle / cloud circle)
float distanceX_0 = playerX - specialCloud_X;
float distanceY_0 = playerY - specialCloud_Y;
float distance_0 = sqrt( (distanceX_0 * distanceX_0) + (distanceY_0 * distanceY_0) );
if (distance_0 <= playerRadius + cloudRadius) //if distance is inferior to radius of player & cloud added, circles are touching
{
resetCloud(0); //Reset cloud
playerScore-=5000; //Lower score by 5000
rectMode(CORNER);
fill(255,255,255,150);
rect(0,0,400,400); //Make the screen flash white to indicate player collided with special cloud
}
}
//Cloud #1
float distanceX_1 = playerX - normalCloud_X_1;
float distanceY_1 = playerY - normalCloud_Y_1;
float distance_1 = sqrt( (distanceX_1*distanceX_1) + (distanceY_1*distanceY_1));
if (distance_1 <= playerRadius + cloudRadius)
{
resetCloud(1);
playerScore-=100;
}
//Cloud #2
float distanceX_2 = playerX - normalCloud_X_2;
float distanceY_2 = playerY - normalCloud_Y_2;
float distance_2 = sqrt( (distanceX_2*distanceX_2) + (distanceY_2*distanceY_2));
if (distance_2 <= playerRadius + cloudRadius)
{
resetCloud(2);
playerScore-=100;
}
//Cloud #3
float distanceX_3 = playerX - normalCloud_X_3;
float distanceY_3 = playerY - normalCloud_Y_3;
float distance_3 = sqrt( (distanceX_3*distanceX_3) + (distanceY_3*distanceY_3));
if (distance_3 <= playerRadius + cloudRadius)
{
resetCloud(3);
playerScore-=100;
}
//Cloud #4
float distanceX_4 = playerX - rainCloud_X_1;
float distanceY_4 = playerY - rainCloud_Y_1;
float distance_4 = sqrt( (distanceX_4*distanceX_4) + (distanceY_4*distanceY_4));
if (distance_4 <= playerRadius + cloudRadius)
{
resetCloud(4);
playerScore+=200;
}
//Cloud #5
float distanceX_5 = playerX - rainCloud_X_2;
float distanceY_5 = playerY - rainCloud_Y_2;
float distance_5 = sqrt( (distanceX_5*distanceX_5) + (distanceY_5*distanceY_5));
if (distance_5 <= playerRadius + cloudRadius)
{
resetCloud(5);
playerScore+=200;
}
//Cloud #6
float distanceX_6 = playerX - rainCloud_X_3;
float distanceY_6 = playerY - rainCloud_Y_3;
float distance_6 = sqrt( (distanceX_6*distanceX_6) + (distanceY_6*distanceY_6));
if (distance_6 <= playerRadius + cloudRadius)
{
resetCloud(6);
playerScore+=200;
}
}
void playerMovement() //Actually moves player
{
if (playerGoLeft == true) //Left (Key = A)
{
if (playerX > 0)
{
playerX-=playerSpeed;
}
}
if (playerGoRight == true) //Right (Key = D)
{
if (playerX < width)
{
playerX+=playerSpeed;
}
}
if (playerGoUp == true) //Up (Key = W)
{
if (playerY > 0)
{
playerY-=playerSpeed;
}
}
if (playerGoDown == true) //Down (Key = S)
{
if (playerY < height)
{
playerY+=playerSpeed;
}
}
if (showScore == true) //Score (Key = Spacebar)
{
println("Player Score = " ,playerScore, " Player Category =" ,playerCategory);
}
}
void moveClouds() //Cloud Movement controller. Clouds slowly move from left or right to the opposite side
{
//Special Cloud (#0)
if (playerCategory >= 4)
{
//If cloud's X is inferior to value, increase or decrease until it reaches value.
//Determine if it's moving (left to right) or (right to left)
if (specialCloudDirection == 1) //left to right
{
if (specialCloud_X <= 450)
{
specialCloud_X += specialCloudSpeed;
}
else if (specialCloud_X > 450)
{
resetCloud(0);
}
}
else if (specialCloudDirection == 2) //right to left
{
if (specialCloud_X >= -50)
{
specialCloud_X -= specialCloudSpeed;
}
else if (specialCloud_X < -50)
{
resetCloud(0);
}
}
}
//Normal Cloud (#1)
if (normalCloud_X_1 <= 450) //left to right
{
normalCloud_X_1 += normalCloudSpeed_1;
}
else if (normalCloud_X_1 > 450)
{
resetCloud(1);
}
//Normal Cloud (#2)
if (normalCloud_X_2 >= -50) //right to left
{
normalCloud_X_2 -= normalCloudSpeed_2;
}
else if (normalCloud_X_2 < -50)
{
resetCloud(2);
}
//Normal Cloud (#3)
if (normalCloud_X_3 <= 450) //left to right
{
normalCloud_X_3 += normalCloudSpeed_3;
}
else if (normalCloud_X_3 > 450)
{
resetCloud(3);
}
//Rain Cloud (#4)
if (rainCloud_X_1 >= -50) // right to left
{
rainCloud_X_1 -= rainCloudSpeed_1;
}
else if (rainCloud_X_1 < - 50)
{
resetCloud(4);
}
//Rain Cloud (#5)
if (rainCloud_X_2 <= 450) // left to right
{
rainCloud_X_2 += rainCloudSpeed_2;
}
else if (rainCloud_X_2 > 450)
{
resetCloud(5);
}
//Rain Cloud (#6)
if (rainCloud_X_3 >= -50) // right to left
{
rainCloud_X_3 -= rainCloudSpeed_3;
}
else if (rainCloud_X_3 < - 50)
{
resetCloud(6);
}
}
void resetCloud(int cloudNumber) //Reset Clouds once off screen or collided with
{
//Special Cloud
if (cloudNumber == 0) // (#0)
{
if (specialCloudDirection == 1)
{
specialCloud_X = -50; //Reset Cloud back to start X position
specialCloud_Y = random(50,375); //Reset & randomize Y position
specialCloudSpeed = (random(2,4) * gameDifficulty) + 1; //Randomize speed based on difficulty player is currently at
specialCloudDirection = (int)random(1,3);
}
else if (specialCloudDirection == 2)
{
specialCloud_X = 450;
specialCloud_Y = random(50,375);
specialCloudSpeed = (random(2,4) * gameDifficulty) + 1;
specialCloudDirection = (int)random(1,3);
}
}
//Normal Cloud
else if (cloudNumber == 1) // (#1)
{
normalCloud_X_1 = -50;
normalCloud_Y_1 = random(50, 375);
normalCloudSpeed_1 = random(2,4)*gameDifficulty; //Randomize speed based on difficulty player is currently at
}
else if (cloudNumber == 2) // (#2)
{
normalCloud_X_2 = 450;
normalCloud_Y_2 = random(50, 375);
normalCloudSpeed_2 = random(2,4)*gameDifficulty;
}
else if (cloudNumber == 3) // (#3)
{
normalCloud_X_3 = -50;
normalCloud_Y_3 = random(50,375);
normalCloudSpeed_3 = random(2,4)*gameDifficulty;
}
else if (cloudNumber == 4) // (#4)
{
rainCloud_X_1 = 450;
rainCloud_Y_1 = random(50,375);
rainCloudSpeed_1 = random(1,3)*gameDifficulty;
}
else if (cloudNumber == 5) // (#5)
{
rainCloud_X_2 = -50;
rainCloud_Y_2 = random(50,375);
rainCloudSpeed_2 = random(1,3)*gameDifficulty;
}
else if (cloudNumber == 6) // (#6)
{
rainCloud_X_3 = 450;
rainCloud_Y_3 = random(50,375);
rainCloudSpeed_3 = random(1,3)*gameDifficulty;
}
else if (cloudNumber > 6)
{
println("cloud number exceeds 6");
}
}
void scoreManager() //Determines Category, playerSpeed & Difficulty (which changes Cloud's speeds)
{
//Score Manager
if (playerScore <= 0)
{
println("YOU ARE JUST A TROPICAL STORM NOW! BETTER LUCK NEXT TIME!");
playerCategory = 0;
rectMode(CORNER);
fill(255,0,0);
rect(0,0,400,400); //Screen Flashes Red
gameStarted = false; //Game will reset itself
}
else if (playerScore > 0 && playerScore < 1500)
{
gameDifficulty = 1;
playerCategory = 1;
playerSpeed = 5;
}
else if (playerScore >= 1500 && playerScore < 5000)
{
gameDifficulty = 1.5;
playerCategory = 2;
playerSpeed = 5.5;
}
else if (playerScore >= 5000 && playerScore < 10000)
{
gameDifficulty = 2;
playerCategory = 3;
playerSpeed = 6;
}
else if (playerScore >= 10000 && playerScore < 25000)
{
gameDifficulty = 2.2;
playerCategory = 4;
playerSpeed = 6.5;
}
else if (playerScore >= 25000)
{
gameDifficulty = 2.5;
playerCategory = 5;
playerSpeed = 7;
}
//Special Controls to adjust score
if (increaseScore == true)
{
playerScore += 1000;
}
else if (decreaseScore == true)
{
playerScore -=1000;
}
}
void drawBackground() //Draw Sky background
{
//Draw Sky (TOP to BOTTOM)
//Top
rectMode(CENTER);
noStroke();
fill(36,163,224,255-(playerCategory * 35)); //Lower Alpha level the higher category a player achieves
rect(200,50,400,100);
//Middle #2
rectMode(CENTER);
noStroke();
fill(72,175,224,255-(playerCategory * 35));
rect(200,150,400,100);
//Middle #1
rectMode(CENTER);
noStroke();
fill(143,208,240,255-(playerCategory * 35));
rect(200,250,400,100);
//Bottom
rectMode(CENTER);
noStroke();
fill(175,224,247,255-(playerCategory * 35));
rect(200,350,400,100);
//Draw Background Clouds
rectMode(CENTER);
noStroke();
fill(255,255,255,150);
rect(100,100,150,30,25);
fill(255,255,255,110);
rect(230,340,100,30,15);
fill(255,255,255,200);
rect(350,150,75,15,10);
}
void drawClouds() //Draw moving clouds (3 ellipses compose body of single cloud)
{
ellipseMode(CENTER);
float cloudDiameter = cloudRadius * 2;
noStroke();
if (playerCategory >= 4) //Only draw special cloud if player has reached minimum category
{
//Special Cloud
fill(222,65,65);
ellipse(specialCloud_X, specialCloud_Y - 5, cloudDiameter,cloudDiameter);
ellipse(specialCloud_X + 12, specialCloud_Y, cloudDiameter,cloudDiameter);
ellipse(specialCloud_X - 12, specialCloud_Y, cloudDiameter,cloudDiameter);
}
//Normal Cloud (#1)
fill(175);
ellipse(normalCloud_X_1, normalCloud_Y_1 - 5, cloudDiameter,cloudDiameter);
ellipse(normalCloud_X_1 + 12, normalCloud_Y_1, cloudDiameter,cloudDiameter);
ellipse(normalCloud_X_1 - 12, normalCloud_Y_1, cloudDiameter,cloudDiameter);
//Normal Cloud (#2)
fill(175);
ellipse(normalCloud_X_2, normalCloud_Y_2 - 5, cloudDiameter,cloudDiameter);
ellipse(normalCloud_X_2 + 12, normalCloud_Y_2, cloudDiameter,cloudDiameter);
ellipse(normalCloud_X_2 - 12, normalCloud_Y_2, cloudDiameter,cloudDiameter);
//Normal Cloud (#3)
fill(175);
ellipse(normalCloud_X_3, normalCloud_Y_3 - 5, cloudDiameter,cloudDiameter);
ellipse(normalCloud_X_3 + 12, normalCloud_Y_3, cloudDiameter,cloudDiameter);
ellipse(normalCloud_X_3 - 12, normalCloud_Y_3, cloudDiameter,cloudDiameter);
//Rain Cloud (#4)
fill(0,0,175);
ellipseMode(CENTER);
ellipse(rainCloud_X_1, rainCloud_Y_1 - 5, cloudDiameter,cloudDiameter);
ellipse(rainCloud_X_1 + 12, rainCloud_Y_1, cloudDiameter,cloudDiameter);
ellipse(rainCloud_X_1 - 12, rainCloud_Y_1, cloudDiameter,cloudDiameter);
//Rain Cloud (#5)
fill(0,0,175);
ellipse(rainCloud_X_2, rainCloud_Y_2 - 5, cloudDiameter,cloudDiameter);
ellipse(rainCloud_X_2 + 12, rainCloud_Y_2, cloudDiameter,cloudDiameter);
ellipse(rainCloud_X_2 - 12, rainCloud_Y_2, cloudDiameter,cloudDiameter);
//Rain Cloud (#6)
fill(0,0,175);
ellipse(rainCloud_X_3, rainCloud_Y_3 - 5, cloudDiameter,cloudDiameter);
ellipse(rainCloud_X_3 + 12, rainCloud_Y_3, cloudDiameter,cloudDiameter);
ellipse(rainCloud_X_3 - 12, rainCloud_Y_3, cloudDiameter,cloudDiameter);
}
void drawPlayer() //Draw player (hurricane)
{
float playerDiameter = (playerRadius * 2) + playerCategory * 3; //Player grows as category increases
ellipseMode(CENTER);
noStroke();
//Body
fill(20 - (playerCategory * 15),152 - (playerCategory * 15),216 + (playerCategory * 15)); //Player gets increasing blue as category increases
ellipse(playerX,playerY,playerDiameter,playerDiameter);
ellipse(playerX + 10,playerY,playerDiameter,playerDiameter);
ellipse(playerX - 10,playerY,playerDiameter,playerDiameter);
ellipse(playerX - 5,playerY + 10,playerDiameter,playerDiameter);
ellipse(playerX + 5,playerY + 10,playerDiameter,playerDiameter);
ellipse(playerX,playerY + 18,playerDiameter,playerDiameter);
//Eyes
if (playerCategory == 5) //Eyes glow red at category 5
{
fill(225,0,0);
}
else
{
fill(0);
}
if (playerCategory != 0) //If player is category 0, don't draw eyes
{
ellipse(playerX - 8, playerY + 3, playerDiameter/5, playerDiameter/5); //Left
ellipse(playerX + 8, playerY + 3, playerDiameter/5, playerDiameter/5); //Right
}
//Eyebrows
if (playerCategory >= 3) //Add eyebrows if above category 3
{
fill(0);
stroke(0);
line(playerX - 12, playerY - 8, playerX - 6, playerY - 5);
line(playerX + 12, playerY - 8, playerX + 6, playerY - 5);
}
//Mouth
if (playerCategory >= 4) //Add mouth if above category 4
{
fill(0);
noStroke();
ellipse(playerX,playerY + 20, playerDiameter/4.5, playerDiameter/4.5);
}
}
void keyPressed() //Register a key is pressed
{
if (key == 'a' || key == 'A')
{
playerGoLeft = true;
}
else if (key == 'd' || key == 'D')
{
playerGoRight = true;
}
else if (key == 'w' || key == 'W')
{
playerGoUp = true;
}
else if (key == 's' || key == 'S')
{
playerGoDown = true;
}
else if (keyCode == ' ')
{
showScore = true;
}
else if (keyCode == '1')
{
increaseScore = true;
}
else if (keyCode == '2')
{
decreaseScore = true;
}
}
void keyReleased() //Register a key has been released
{
if (key == 'a' || key == 'A')
{
playerGoLeft = false;
}
else if (key == 'd' || key == 'D')
{
playerGoRight = false;
}
else if (key == 'w' || key == 'W')
{
playerGoUp = false;
}
else if (key == 's' || key == 'S')
{
playerGoDown = false;
}
else if (keyCode == ' ')
{
showScore = false;
}
else if (keyCode == '1')
{
increaseScore = false;
}
else if (keyCode == '2')
{
decreaseScore = false;
}
}