//Revenge on Cheese! Fly attack! //<>//
//Interactive toy by Gabriel Holtschlag
//
//command your worm squad and take control of operation "Revenge by Chomp".
//Avoid the pesky flies and chomp as much cheese as you can.
//
//CONTROLS:
//worm1 - "1" key
//worm2 - "2" key
//worm3 - "3" key
boolean gameStart;
//individual worm y values
float worm1Y;
float worm2Y;
float worm3Y;
//individual fly values
//a function for all flies could not be used
float fly1Y;
float fly2Y;
float fly3Y;
float fly4Y;
float fly1XPos= 0;
float fly2XPos= 0;
float fly3XPos= 0;
float fly4XPos= 0;
float flyBounce;// used to create a wave flying pattern
float yGenerator1;
float yGenerator2;
float yGenerator3;
float yGenerator4;
float xGenerator1;
float xGenerator2;
float xGenerator3;
float xGenerator4;
float stop1;
float stop2;
float stop3;
float stop4;
float speed;
//used to stop worm input individually
boolean worm1Dead;
boolean worm2Dead;
boolean worm3Dead;
//loading bar
float loading;// used as a visual timer
int score;
//individual checks to increase loading speed per worm
int worm1Eating;
int worm2Eating;
int worm3Eating;
//values used for animating the mouth(controls the wave size)
float chew1;
float chew2;
float chew3;
float endTimer;
float a;//timer
boolean isGameOver;
float b;//timer
int highScore;
void setup()
{
size(400, 400);
}
void draw()
{
//scoring system
eatAndScore();
towel();
grass();
drawCheese();
stroke(0);
//xposition,yposition,biteSize
drawWorm(80, worm1Y, chew1);
drawWorm(200, worm2Y, chew2);
drawWorm(320, worm3Y, chew3);
//turn off worm
wormDeath();
fill(0);
noStroke();
//score board
rect(0, 352, 400, 200);
//controlls, 1,2, & 3
wormInput();
//y axis movement
fliesXMov();
////draw flies////
fly1(0);
if (score >=1)
{
fly2(0);
}
if (score >=4)
{
fly3(0);
}
if (score >=8)
{
fly4(0);
}
//loading bar
stroke(0);
fill(0, 0, 0, 100);
rect(20, 10, 360, 20);
fill(250);
rect (20, 10, loading, 20);
//score visual
textSize(30);
text("Score: "+score, 20, 385);
//transition
endScreen();
//endScreen + reset condition
gameOver();
startingScreen();
}
/////////////////////
//Functions////
///////////////////
void startingScreen()
{
if (!gameStart)
{
fill(0);
rect(0,0,400,400);
fill(250);
textSize(34);
text("Revenge on Cheese!",30,140);
textSize(24);
text ("Fly attack!",140,185);
textSize(18);
text ("click the screen to start!",94,300);
text ("check source for game controls",60,340);
if (mousePressed)
{
gameStart= true;
}
}
}
void eatAndScore()
{
//highscore update
if (score>= highScore)
{
highScore = score;
}
//individual worm position check
if (worm1Y+340 <= 170)
{
worm1Eating = 1;
chew1=15;
}
else if (worm1Y+340 >=170)
{
worm1Eating = 0;
chew1 =0;
}
if (worm2Y+340 <= 170)
{
worm2Eating =1;
chew2 =15;
}
else if (worm2Y+340 >=170)
{
worm2Eating =0;
chew2 = 0;
}
if (worm3Y+340 <= 170)
{
worm3Eating = 1;
chew3 = 15;
}
else if (worm3Y+340 >=170)
{
worm3Eating = 0;
chew3 = 0;
}
//score count
if (worm1Eating + worm2Eating + worm3Eating >= 1)
{
if (loading <=360)
{
loading = loading + worm1Eating +worm2Eating +worm3Eating;
}
else if (loading >=360)
{
loading =0;
score = score +1;
println("Chomp!");
}
}
}
void towel()
{
//towel
background(230, 65, 40);
noStroke();
fill(220);
rect(40,140,20,100);
rect(340,140,20,100);
rect(140,140,20,100);
rect(240,140,20,100);
fill(0,0,0,80);
rect(0,140,400,30);
fill(0,0,0,40);
rect(0,140,400,40);
}
void grass()
{
noStroke();
fill(90, 200, 60);
rect(0, 200, 400, 200);
fill(0, 0, 0, 10);
rect(0, 210, 400, 200);
rect(0, 220, 400, 200);
rect(0, 230, 400, 200);
rect(0, 240, 400, 200);
rect(0, 250, 400, 200);
rect(0, 260, 400, 200);
rect(0, 270, 400, 200);
rect(0, 280, 400, 200);
rect(0, 290, 400, 200);
rect(0, 300, 400, 200);
rect(0, 310, 400, 200);
rect(0, 320, 400, 200);
rect(0, 330, 400, 200);
rect(0, 340, 400, 200);
rect(0, 350, 400, 200);
rect(0, 360, 400, 200);
//dirt
fill(180,115,90);
ellipse(200,350,400,70);
fill(175,105,85);
ellipse(200,360,400,70);
//holes
fill(30, 20, 10);
ellipse(80, 350, 80, 40);
ellipse(200, 350, 80, 40);
ellipse(320, 350, 80, 40);
}
void fliesXMov()
{
//movement and accelaration based on score
speed = 1 + (score/4);
//move only if random "stop" is under n
if (stop1 <= 120) // used to randomly delay flies
{
fly1XPos = fly1XPos+ speed;
}
if (stop2 <= 120)
{
fly2XPos= fly2XPos+ speed;
}
if (stop3 <= 120)
{
fly3XPos= fly3XPos+ speed;
}
if (stop4 <= 120)
{
fly4XPos= fly4XPos+ speed;
}
}
void endScreen()
{
if (isGameOver)
{
//use timer to create order with delays
a = a+0.05;
//repeat the same statement with delay, adding more lines each time
if (int(a) >=1)
{
for (int i =0; i<400; i= i+20)
{
line(0, i, 400, i);
}
}
if (int(a) >=1.5)
{
for (int i =0; i<400; i= i+15)
{
line(0, i, 400, i);
}
}
if (int(a) >=2)
{
for (int i =0; i<400; i= i+10)
{
line(0, i, 400, i);
}
}
if (int(a) >=2.5)
{
for (int i =0; i<400; i= i+5)
{
line(0, i, 400, i);
}
}
if (int(a) >=3)
{
for (int i =0; i<400; i= i+3)
{
line(0, i, 400, i);
}
}
if (int(a) >=3.5)
{
for (int i =0; i<400; i= i+1)
{
line(0, i, 400, i);
}
}
}
}
void wormInput()
{
if (keyPressed)
{
// worm goes up on players input + conditions
if (key == '1' && !worm1Dead && (worm1Y+340) > 20)
{
worm1Y = worm1Y -3;
}
if (key == '2' && !worm2Dead && (worm2Y+340) > 20)
{
worm2Y = worm2Y -3;
}
if (key == '3' && !worm3Dead && (worm3Y+340) > 20)
{
worm3Y = worm3Y -3;
}
}
//Worm gravity
if ( worm1Y <=0)
{
worm1Y++;
}
if (worm2Y <=0)
{
worm2Y++;
}
if (worm3Y <=0)
{
worm3Y++;
}
}
void wormDeath()
{
//draw dead face
if (worm1Dead)
{
stroke(0);
fill(250);
ellipse(80, worm1Y+337, 60, 60);
//left eye
line(80-25, worm1Y+335, 80-15, worm1Y+325);
line(80-15, worm1Y+335, 80-25, worm1Y+325);
//right eye
line(80+25, worm1Y+335, 80+15, worm1Y+325);
line(80+15, worm1Y+335, 80+25, worm1Y+325);
fill(0);
//mouth
ellipse(80, worm1Y+340, 20, 8);
}
//draw dead face
if (worm2Dead)
{
stroke(0);
fill(250);
ellipse(200, worm2Y+337, 60, 60);
//left eye
line(200-25, worm2Y+335, 200-15, worm2Y+325);
line(200-15, worm2Y+335, 200-25, worm2Y+325);
//right eye
line(200+25, worm2Y+335, 200+15, worm2Y+325);
line(200+15, worm2Y+335, 200+25, worm2Y+325);
fill(0);
//mouth
ellipse(200, worm2Y+340, 20, 8);
}
//draw dead face
if (worm3Dead)
{
stroke(0);
fill(250);
ellipse(320, worm3Y+337, 60, 60);
//left eye
line(320-25, worm3Y+335, 320-15, worm3Y+325);
line(320-15, worm3Y+335, 320-25, worm3Y+325);
//right eye
line(320+25, worm3Y+335, 320+15, worm3Y+325);
line(320+15, worm3Y+335, 320+25, worm3Y+325);
fill(0);
//mouth
ellipse(320, worm3Y+340, 20, 8);
}
// gameOver
if (worm1Dead && worm2Dead && worm3Dead)
{
isGameOver = true;
}
}
void gameOver()
{
if (isGameOver)
{
//timer used for text timed drawing
b= b+0.05;
//endScreen text
fill(250);
textSize(60);
if (b>=5)
text("G", 20+30, 200);
if (b>=6)
text("a", 60+30, 200);
if (b>=7)
text("m", 90+30, 200);
if (b>=8)
text("e", 142+30, 200);
if (b>=9)
text("o", 190+30, 200);
if (b>=10)
text("v", 225+30, 200);
if (b>=11)
text("e", 255+30, 200);
if (b>=12)
text("r", 285+30, 200);
if (b>=13)
{
textSize(20);
text("Press any key to restart", 80, 260);
text("score: "+ score, 160, 60);
text("Highscore: "+ highScore, 136, 35);
}
if (b>=15)
{
textSize(12);
text("(except \"esc\")", 155, 280);
}
// restart game
if (keyPressed && b>= 6)
{
worm1Y =0;
worm2Y =0;
worm3Y =0;
fly1Y =0;
fly2Y =0;
fly3Y =0;
fly4Y =0;
fly1XPos= 0;
fly2XPos= 0;
fly3XPos= 0;
fly4XPos= 0;
flyBounce= 0;
yGenerator1= 0;
yGenerator2= 0;
yGenerator3= 0;
yGenerator4= 0;
xGenerator1= 0;
xGenerator2= 0;
xGenerator3= 0;
xGenerator4= 0;
stop1= 0;
stop2= 0;
stop3= 0;
stop4= 0;
speed= 0;
worm1Dead= false;
worm2Dead= false;
worm3Dead= false;
loading= 0;
score= 0;
worm1Eating= 0;
worm2Eating =0;
worm3Eating= 0;
chew1= 0;
chew2= 0;
chew3= 0;
endTimer= 0;
a= 0;
isGameOver = false;
b= 0;
}
}
}
void fly1(float fly1X)
{
flyBounce = 80*sin(frameCount *0.007);
//set random y value, and delay xposition
if ((fly1XPos+fly1X)%500 == 450%500)
{
yGenerator1 = random(100, 160);
xGenerator1 = random(100, 2000);
}
fly1Y = yGenerator1;
stop1 = xGenerator1 ;
stop1 --;//used on draw as a condition for xmovement
////draw fly//////////
stroke(0);
//wing
fill(250, 250, 250, 180);
ellipse(((fly1XPos+fly1X)%500), fly1Y+flyBounce-15-5*sin(frameCount * 0.1), 10+3*sin(frameCount * 0.1), 25+10*sin(frameCount * 0.1));
fill(0);
//body
fill(240);
ellipse(((fly1XPos+fly1X)%500)+15, fly1Y+flyBounce, 5, 5);
fill(220);
ellipse((fly1XPos+fly1X)%500, fly1Y+flyBounce, 30, 20);
fill(240);
ellipse(((fly1XPos+fly1X)%500)+8, fly1Y+flyBounce, 5, 5);
//wing
fill(250, 250, 250, 180);
ellipse(((fly1XPos+fly1X)%500)-7, fly1Y+flyBounce-17-5*sin(frameCount * 0.1), 13+3*sin(frameCount * 0.1), 25+10*sin(frameCount * 0.1));
//set collision boxes
if ((fly1XPos+fly1X)%500 >= 80-25 && (fly1XPos+fly1X)%500 <= 80+25 && fly1Y+flyBounce >= worm1Y+340-25 && fly1Y+flyBounce <= worm1Y+340+25)
{
if (!worm1Dead)//stop interactions with dead worms;
{
worm1Dead = true;
}
}
if ((fly1XPos+fly1X)%500 >= 200-25 && (fly1XPos+fly1X)%500 <= 200+25 && fly1Y+flyBounce >= worm2Y+340-25 && fly1Y+flyBounce <= worm2Y+340+25)
{
if (!worm2Dead)//stop interactions with dead worms;
{
worm2Dead = true;
}
}
if ((fly1XPos+fly1X)%500 >= 320-25 && (fly1XPos+fly1X)%500 <= 320+25 && fly1Y+flyBounce >= worm3Y+340-25 && fly1Y+flyBounce <= worm3Y+340+25)
{
if (!worm3Dead)//stop interactions with dead worms;
{
worm3Dead = true;
}
}
}
void fly2(float fly2X)
{
flyBounce = 80*sin(frameCount *0.007);
//set random y value, and delay xposition
if ((fly2XPos+fly2X)%500 == 450%500)
{
yGenerator2 = random(170, 210);
xGenerator2 = random(100, 2000);
}
fly2Y = yGenerator2;
stop2 = xGenerator2 ;
stop2 --;//used on draw as a condition for xmovement
////draw fly//////////
stroke(0);
//wing
fill(250, 250, 250, 180);
ellipse(((fly2XPos+fly2X)%500), fly2Y+flyBounce-15-5*sin(frameCount * 0.1), 10+3*sin(frameCount * 0.1), 25+10*sin(frameCount * 0.1));
fill(0);
//body
fill(240);
ellipse(((fly2XPos+fly2X)%500)+15, fly2Y+flyBounce, 5, 5);
fill(50);
ellipse((fly2XPos+fly2X)%500, fly2Y+flyBounce, 30, 20);
fill(240);
ellipse(((fly2XPos+fly2X)%500)+8, fly2Y+flyBounce, 5, 5);
//wing
fill(250, 250, 250, 180);
ellipse(((fly2XPos+fly2X)%500)-7, fly2Y+flyBounce-17-5*sin(frameCount * 0.1), 13+3*sin(frameCount * 0.1), 25+10*sin(frameCount * 0.1));
//set collision boxes
if ((fly2XPos+fly2X)%500 >= 80-25 && (fly2XPos+fly2X)%500 <= 80+25 && fly2Y+flyBounce >= worm1Y+340-25 && fly2Y+flyBounce <= worm1Y+340+25)
{
if (!worm1Dead)//stop interactions with dead worms;
{
worm1Dead = true;
}
}
if ((fly2XPos+fly2X)%500 >= 200-25 && (fly2XPos+fly2X)%500 <= 200+25 && fly2Y+flyBounce >= worm2Y+340-25 && fly2Y+flyBounce <= worm2Y+340+25)
{
if (!worm2Dead)//stop interactions with dead worms;
{
worm2Dead = true;
}
}
if ((fly2XPos+fly2X)%500 >= 320-25 && (fly2XPos+fly2X)%500 <= 320+25 && fly2Y+flyBounce >= worm3Y+340-25 && fly2Y+flyBounce <= worm3Y+340+25)
{
if (!worm3Dead)//stop interactions with dead worms;
{
worm3Dead = true;
}
}
}
void fly3(float fly3X)
{
flyBounce = 80*sin(frameCount *0.007);
//set random y value, and delay xposition
if ((fly3XPos+fly3X)%500 == 450%500)
{
yGenerator3 = random(220, 290);
xGenerator3 = random(100, 2000);
}
fly3Y = yGenerator3;
stop3 = xGenerator3 ;
stop3 --;//used on draw as a condition for xmovement
////draw fly//////////
stroke(0);
//wing
fill(250, 250, 250, 180);
ellipse(((fly3XPos+fly3X)%500), fly3Y+flyBounce-15-5*sin(frameCount * 0.1), 10+3*sin(frameCount * 0.1), 25+10*sin(frameCount * 0.1));
fill(0);
//body
fill(240);
ellipse(((fly3XPos+fly3X)%500)+15, fly3Y+flyBounce, 5, 5);
fill(90);
ellipse((fly3XPos+fly3X)%500, fly3Y+flyBounce, 30, 20);
fill(240);
ellipse(((fly3XPos+fly3X)%500)+8, fly3Y+flyBounce, 5, 5);
//wing
fill(250, 250, 250, 180);
ellipse(((fly3XPos+fly3X)%500)-7, fly3Y+flyBounce-17-5*sin(frameCount * 0.1), 13+3*sin(frameCount * 0.1), 25+10*sin(frameCount * 0.1));
//set collision boxes
if ((fly3XPos+fly3X)%500 >= 80-25 && (fly3XPos+fly3X)%500 <= 80+25 && fly3Y+flyBounce >= worm1Y+340-25 && fly3Y+flyBounce <= worm1Y+340+25)
{
if (!worm1Dead)//stop interactions with dead worms;
{
worm1Dead = true;
}
}
if ((fly3XPos+fly3X)%500 >= 200-25 && (fly3XPos+fly3X)%500 <= 200+25 && fly3Y+flyBounce >= worm2Y+340-25 && fly3Y+flyBounce <= worm2Y+340+25)
{
if (!worm2Dead)//stop interactions with dead worms;
{
worm2Dead = true;
}
}
if ((fly3XPos+fly3X)%500 >= 320-25 && (fly3XPos+fly3X)%500 <= 320+25 && fly3Y+flyBounce >= worm3Y+340-25 && fly3Y+flyBounce <= worm3Y+340+25)
{
if (!worm3Dead)//stop interactions with dead worms;
{
worm3Dead = true;
}
}
}
void fly4(float fly4X)
{
flyBounce = 80*sin(frameCount *0.007);
//set random y value, and delay xposition
if ((fly4XPos+fly4X)%500 == 450%500)
{
yGenerator4 = random(60, 180);
xGenerator4 = random(100, 2000);
}
fly4Y = yGenerator4;
stop4 = xGenerator4;
stop4 --;//used on draw as a condition for xmovement
////draw fly//////////
stroke(0);
//wing
fill(250, 250, 250, 180);
ellipse(((fly4XPos+fly4X)%500), fly4Y+flyBounce-15-5*sin(frameCount * 0.1), 10+3*sin(frameCount * 0.1), 25+10*sin(frameCount * 0.1));
fill(0);
//body
fill(240);
ellipse(((fly4XPos+fly4X)%500)+15, fly4Y+flyBounce, 5, 5);
fill(170);
ellipse((fly4XPos+fly4X)%500, fly4Y+flyBounce, 30, 20);
fill(240);
ellipse(((fly4XPos+fly4X)%500)+8, fly4Y+flyBounce, 5, 5);
//wing
fill(250, 250, 250, 180);
ellipse(((fly4XPos+fly4X)%500)-7, fly4Y+flyBounce-17-5*sin(frameCount * 0.1), 13+3*sin(frameCount * 0.1), 25+10*sin(frameCount * 0.1));
//set collision boxes
if ((fly4XPos+fly4X)%500 >= 80-25 && (fly4XPos+fly4X)%500 <= 80+25 && fly4Y+flyBounce >= worm1Y+340-25 && fly4Y+flyBounce <= worm1Y+340+25)
{
if (!worm1Dead)//stop interactions with dead worms;
{
worm1Dead = true;
}
}
if ((fly4XPos+fly4X)%500 >= 200-25 && (fly4XPos+fly4X)%500 <= 200+25 && fly4Y+flyBounce >= worm2Y+340-25 && fly4Y+flyBounce <= worm2Y+340+25)
{
if (!worm2Dead)//stop interactions with dead worms;
{
worm2Dead = true;
}
}
if ((fly4XPos+fly4X)%500 >= 320-25 && (fly4XPos+fly4X)%500 <= 320+25 && fly4Y+flyBounce >= worm3Y+340-25 && fly4Y+flyBounce <= worm3Y+340+25)
{
if (!worm3Dead)//stop interactions with dead worms;
{
worm3Dead = true;
}
}
}
void drawCheese()
{
fill(250, 200, 50);
rect(0, 0, 400, 160);
//holes
fill(0, 0, 0, 80);
ellipse (47, 130, 40, 40);
ellipse (40, 40, 60, 60);
ellipse (110, 80, 50, 50);
ellipse (300, 60, 90, 90);
ellipse (180, 30, 70, 70);
ellipse (370, 120, 54, 54);
ellipse (380, 30, 30, 30);
ellipse (210, 120, 55, 55);
}
void drawWorm(float xPos, float yPos, float chew)
{
//worm body
fill(174);
ellipse(xPos-4*sin(frameCount * 0.05), yPos+710, 50, 50);
fill(176);
ellipse(xPos-4*sin(frameCount * 0.05), yPos+710, 50, 50);
fill(178);
ellipse(xPos-3*sin(frameCount * 0.05), yPos+700, 50, 50);
fill(180);
ellipse(xPos-2*sin(frameCount * 0.05), yPos+690, 50, 50);
fill(182);
ellipse(xPos, yPos+680, 50, 50);
fill(184);
ellipse(xPos+2*sin(frameCount * 0.05), yPos+670, 50, 50);
fill(186);
ellipse(xPos+3*sin(frameCount * 0.05), yPos+660, 50, 50);
fill(188);
ellipse(xPos+4*sin(frameCount * 0.05), yPos+650, 50, 50);
fill(190);
ellipse(xPos+3*sin(frameCount * 0.05), yPos+640, 50, 50);
fill(192);
ellipse(xPos+2*sin(frameCount * 0.05), yPos+630, 50, 50);
fill(194);
ellipse(xPos, yPos+620, 50, 50);
fill(196);
ellipse(xPos-2*sin(frameCount * 0.05), yPos+610, 50, 50);
fill(198);
ellipse(xPos-3*sin(frameCount * 0.05), yPos+600, 50, 50);
fill(200);
ellipse(xPos-4*sin(frameCount * 0.05), yPos+590, 50, 50);
fill(202);
ellipse(xPos-4*sin(frameCount * 0.05), yPos+580, 50, 50);
fill(204);
ellipse(xPos-3*sin(frameCount * 0.05), yPos+570, 50, 50);
fill(206);
ellipse(xPos-2*sin(frameCount * 0.05), yPos+560, 50, 50);
fill(208);
ellipse(xPos, yPos+550, 50, 50);
fill(210);
ellipse(xPos+2*sin(frameCount * 0.05), yPos+540, 50, 50);
fill(212);
ellipse(xPos+3*sin(frameCount * 0.05), yPos+530, 50, 50);
fill(214);
ellipse(xPos+4*sin(frameCount * 0.05), yPos+520, 50, 50);
fill(216);
ellipse(xPos+4*sin(frameCount * 0.05), yPos+510, 50, 50);
fill(218);
ellipse(xPos+3*sin(frameCount * 0.05), yPos+500, 50, 50);
fill(220);
ellipse(xPos+2*sin(frameCount * 0.05), yPos+490, 50, 50);
fill(222);
ellipse(xPos, yPos+480, 50, 50);
fill(224);
ellipse(xPos-2*sin(frameCount * 0.05), yPos+470, 50, 50);
fill(226);
ellipse(xPos-3*sin(frameCount * 0.05), yPos+460, 50, 50);
fill(228);
ellipse(xPos-4*sin(frameCount * 0.05), yPos+450, 50, 50);
fill(230);
ellipse(xPos-4*sin(frameCount * 0.05), yPos+440, 50, 50);
fill(232);
ellipse(xPos-3*sin(frameCount * 0.05), yPos+430, 50, 50);
fill(234);
ellipse(xPos-2*sin(frameCount * 0.05), yPos+420, 50, 50);
fill(236);
ellipse(xPos, yPos+410, 50, 50);
fill(238);
ellipse(xPos+2*sin(frameCount * 0.05), yPos+400, 50, 50);
fill(240);
ellipse(xPos+3*sin(frameCount * 0.05), yPos+390, 50, 50);
fill(242);
ellipse(xPos+4*sin(frameCount * 0.05), yPos+380, 50, 50);
fill(244);
ellipse(xPos+4*sin(frameCount * 0.05), yPos+370, 50, 50);
fill(246);
ellipse(xPos+3*sin(frameCount * 0.05), yPos+360, 50, 50);
fill(248);
ellipse(xPos+2*sin(frameCount * 0.05), yPos+350, 50, 50);
fill(250);
ellipse(xPos, yPos+340, 60, 60);
//left eye
line(xPos-25, yPos+330, xPos-20, yPos+325);
line(xPos-15, yPos+330, xPos-20, yPos+325);
//Right eye
line(xPos+25, yPos+330, xPos+20, yPos+325);
line(xPos+15, yPos+330, xPos+20, yPos+325);
//mouth
fill(0);
ellipse(xPos, yPos+340, 30, 15+chew*sin(frameCount* 0.05));
}