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