/*
Interactive Toy: Flappy fly
Assignment 2
Intro to Media Computation
Nicolas Hesler
Made by Baker Albach
Play as a fly trying to get as much food as possible without falling into deadly spikes!
Crawl on and over the platforms to move around and stop yourself from falling!
Use the arrow keys to move around
TIP: tapping provides more control!
Shout out to Jasper for all the much needed assistance
*/
float playerX = 200; // declaring global variables before setup
float playerY = 0;
float playerMoveX;
float playerMoveY;
float gravity = 0.3;
boolean onPlatform = false;
float playerSize = 25;
boolean doSpawnFood = true;
float foodX;
float foodY;
float foodSize = 8;
float p1X, p1Y, p2X, p2Y, p3X, p3Y; // x and y coordiantes for platforms 1 2 &3
float platformSizeX = 85, platformSizeY = 5;
boolean platform1Spawn = false;
boolean platform2Spawn = false;
boolean platform3Spawn = false;
boolean isGameOver = false;
int score = 0;
void setup() {
size(400, 400);
rectMode(CENTER);
}
void draw() {
if (isGameOver == true) { //game over loop
gameOver();
if (keyPressed) {
reset();
}
} else {
background(66, 165, 255);
randomizePlatforms();
spawnFood();
scoreDisplay();
foodTouch();
updatePlayer();
updateGravity();
spikeTouch();
platformTouch();
drawTrees();
drawPlatforms();
drawFood();
drawSpikes();
drawPlayer();
}
}
void drawSpikes() { //draw loop for the spikes along the bottom of the screen
for (int i = 0; i<400; i+= 25) { // increments distance between each triangle so they don't overlap
stroke(0);
fill(170);
triangle(i, 350, i+12.5, 300, i+25, 350);
}
}
void spikeTouch() { // didn't need to code collision for each shape, just noted when playerY goes below spike line
if (playerY >= 300) {
isGameOver = true;
}
}
void gameOver() {
fill(0);
textSize(50);
text("GAME OVER", 65, 200);
if (keyPressed) { // resets game when a key is pressed
isGameOver = false;
}
}
void scoreDisplay(){
fill(0);
textSize(13);
text("SCORE: " + score, 335, 370);
}
void reset() { //resets player to starting position, returns booleans to starting states
playerX = 200;
playerY = 0;
onPlatform = false;
doSpawnFood = true;
score = 0;
}
void updateGravity() { // implements gravity on player's Y movement
if (playerY <= 300 && onPlatform == false) {
playerMoveY += gravity;
}
}
void updatePlayer() { // updates player location, as well as constrains player to the boundaries of the screen
playerX += playerMoveX;
playerY += playerMoveY;
playerX = constrain(playerX, 0+playerSize/2, 400-playerSize/2);
playerY = constrain(playerY, 0+playerSize/2, 350-playerSize/2);
}
void drawPlayer() {
fill(0);
ellipse(playerX, playerY, playerSize-5, playerSize);
strokeWeight(1);
stroke(200);
fill(180);
ellipse(playerX-7*(sin(radians(frameCount*5))), playerY+3, 8*(sin(radians(frameCount*5))), 16); //flapping wing animation
ellipse(playerX+7*(sin(radians(frameCount*5))), playerY+3, 8*(sin(radians(frameCount*5))), 16);
}
void drawTrees() {
for (int i = 0; i<400; i+= 80) {
stroke(0);
fill(92, 71, 32);
rect(i+40, 320, 20, 60);
}
for (int i = 0; i<400; i+= 80) { // increments distance between each tree so they don't overlap
stroke(0);
fill(26, 138, 51);
triangle(i, 290, i+40, 175, i+80, 290);
}
}
void drawFood() {
strokeWeight(1);
stroke(0);
fill(255, 0, 0);
ellipse(foodX, foodY, foodSize, foodSize);
}
void spawnFood() { // spawns food in a random location, while limiting the spawn area to above the spikes
if (doSpawnFood) {
foodX = (round(random(399)));
foodY = (round(random (0, 250)));
doSpawnFood = false;
}
}
void foodTouch() { // detects collision with food & spawns another instance of food
if (playerX + playerSize/2 >= foodX - foodSize/2 && playerY - playerSize/2 <= foodY + foodSize/2 && playerX - playerSize/2 <= foodX + foodSize/2 && playerY + playerSize/2 >= foodY - foodSize/2) {
score = score+1;
doSpawnFood = true;
}
}
void randomizePlatforms() { // randomizes spawn location of each platform while limiting them to certian areas of the screen
if (platform1Spawn == false) {
p1X = random(200 + platformSizeX/2, 400 - platformSizeX/2);
p1Y = random(100 + platformSizeY/2, 300 - platformSizeY/2);
platform1Spawn = true;
}
if (platform2Spawn == false) {
p2X = random(0 + platformSizeX/2, 200 - platformSizeX/2);
p2Y = random(100 + platformSizeY/2, 300 - platformSizeY/2);
platform2Spawn = true;
}
if (platform3Spawn == false) {
p3X = width/2; // constrains platform's X to avoid player losing on spawn
p3Y = random(100 + platformSizeY/2, 200 - platformSizeY/2);
platform3Spawn = true;
}
}
void drawPlatforms() {
rectMode(CENTER);
fill(175);
rect(p1X, p1Y, platformSizeX, platformSizeY);
rect(p2X, p2Y, platformSizeX, platformSizeY);
rect(p3X, p3Y, platformSizeX, platformSizeY);
}
void platformTouch() {
// Right platform
if (playerX + playerSize/2 >= p1X - platformSizeX/2 && playerY - playerSize/2 <= p1Y + platformSizeY/2 && playerX - playerSize/2 <= p1X + platformSizeX/2 && playerY + playerSize/2 >= p1Y - platformSizeY/2) {
if (playerY <= p1Y) { //collision for top of platform
playerMoveY = 0;
playerMoveX *= 0.95;
onPlatform = true;
} else if (playerY >= p1Y) { //collision for bottom of platform
playerMoveY = 0;
playerMoveX *= 0.95;
} else if (playerX >= p1X) { //collision for side of platform
playerMoveX = 0;
} else if (playerX <= p1X) { //collision for side of platform
playerMoveX = 0;
}
} else {
onPlatform = false;
}
// Left platform
if (playerX + playerSize/2 >= p2X - platformSizeX/2 && playerY - playerSize/2 <= p2Y + platformSizeY/2 && playerX - playerSize/2 <= p2X + platformSizeX/2 && playerY + playerSize/2 >= p2Y - platformSizeY/2) {
if (playerY <= p2Y) { //collision for top of platform
playerMoveY = 0;
playerMoveX *= 0.95;
onPlatform = true;
} else if (playerY >= p2Y) { //collision for bottom of platform
playerMoveY = 0;
playerMoveX *= 0.95;
} else if (playerX >= p2X) { //collision for side of platform
playerMoveX = 0;
} else if (playerX <= p2X) { //collision for side of platform
playerMoveX = 0;
}
} else {
onPlatform = false;
}
// middle platform
if (playerX + playerSize/2 >= p3X - platformSizeX/2 && playerY - playerSize/2 <= p3Y + platformSizeY/2 && playerX - playerSize/2 <= p3X + platformSizeX/2 && playerY + playerSize/2 >= p3Y - platformSizeY/2) {
if (playerY <= p3Y) { //collision for top of platform
playerMoveY = 0;
playerMoveX *= 0.95;
onPlatform = true;
} else if (playerY >= p3Y) { //collision for bottom of platform
playerMoveY = 0;
playerMoveX *= 0.95;
} else if (playerX >= p3X) { //collision for side of platform
playerMoveX = 0;
} else if (playerX <= p3X) { //collision for side of platform
playerMoveX = 0;
}
} else {
onPlatform = false;
}
}
void keyPressed() { // controls for player
if (isGameOver == false) {
if (key == CODED) {
if (keyCode == UP) {
playerMoveY = -5;
}
if (keyCode == DOWN) {
playerMoveY = 5;
}
if (keyCode == LEFT) {
playerMoveX = - 5;
}
if (keyCode == RIGHT) {
playerMoveX = 5;
}
}
}
}
void keyReleased() {
if (isGameOver == false) {
playerMoveX = playerMoveX*0.5;
}
}