/* Spitball Frenzy By: Porter Crease Become the bully and launch spitballs, or become the nerd and deflect it with your textbooks! Play against friends. WS keys to move the textbook up and down. Arrow keys to move the Bully up and down. Spacebar to shoot! */ //score int score=0; int scoreLine=90; //positioning of objects int strawX=240; int strawY=170; int bookX=125; int bookY=110; int headX=50; int headY=100; int geekBodyX=headX-30; int geekBodyY=headY+70; //size of objects int bookHeight=70; int headSize=60; int geekBodyWidth=40; //movement of objects float geekMovement=1.7; float bullyMovement=2; int ballSpeed=0; int ballSpeed2=0; int ballSpeed3=0; int ballSpeed4=0; //spitball variables int spitballX=245; int spitballY=175; int spitballX2=254; int spitballY2=175; int spitballX3=264; int spitballY3=175; int spitballX4=274; int spitballY4=175; int ballSize=9; //keycommands boolean shootBall=false; boolean shootBall2=false; boolean shootBall3=false; boolean shootBall4=false; boolean bullyUp=false; boolean bullyDown=false; boolean bookUp=false; boolean bookDown=false; void setup() { size(400, 400); println("Become the bully and launch spitballs, or become the nerd and deflect it with your textbooks!"); println("Play against friends. WS keys to move the textbook up and down."); println("Arrow keys to move the Bully up and down."); println("Spacebar to shoot!"); } void draw() { background (250,225,200); //set a speed to the spitballs spitballX2-=ballSpeed2; spitballX-=ballSpeed; spitballX3-=ballSpeed3; spitballX4-=ballSpeed4; keepBallInStraw(); limitBullyMovement(); limitGeekMovement(); spitballMove(); bullyMove(); bookMove(); //if the spitball hasn't been shot yet, keep the ball in the straw as it moves. //if the spitball has been shot, check it's collisions scoring(); if (shootBall==false) { keepBallInStraw(); } if (shootBall) { checkSpitballCollision(); } if (shootBall2) { checkSpitball2Collision(); } if (shootBall3) { checkSpitball3Collision(); } if (shootBall4) { checkSpitball4Collision(); } //DRAW chalkboard(); drawScore(); //draw geek with book geek(); //desk fill(180, 130, 80); rect(0, 340, width, 60); //draw bully with spitballs bully(); } void chalkboard() { fill(230, 180, 125); rect(35, 55, 330, 250, 3); fill(40,65, 40); rect(40, 60, 320, 240, 10); } //score goes up by 1 every time a spitball makes it past the book and under his head. void drawScore() { // used the gone fishing coding examples from http://prog14998.sheridanc.on.ca/assignments/2-interactive-toy/ as reference //puts a tallymark on the screen every time the score goes up. rectMode(CORNERS); for (int chalk=0; chalk<score; chalk++) { fill(255); rect(-chalk*15+320, 75, -chalk*15+325, 100, 5); } rectMode(CORNER); } //draw bully void bully() { noStroke(); //DRAW SPITBALLS spitball(); fill(200, 50, 100); //Left Shoulder ellipse(strawX+55, strawY+67, 30, 30); //left bicep quad(strawX+42, strawY+70, strawX+80, strawY+70, strawX+10, strawY+115, strawX+10, strawY+100); //left forearm quad(strawX+17, strawY+20, strawX+27, strawY+20, strawX+10, strawY+115, strawX-10, strawY+115); //left fist rect(strawX+5, strawY-5, 30, 30); //neck fill(180, 30, 80); quad(strawX+60, strawY+30, strawX+80, strawY+30, strawX+110, strawY+60, strawX+90, strawY+60); //body fill(100); quad(strawX+50, strawY+55, strawX+120, strawY+55, strawX+200, 340, strawX+110, 340); //arms fill(200, 50, 100); //Right bicep quad(strawX+105, strawY+60, strawX+125, strawY+60, strawX+100, strawY+145, strawX+85, strawY+130); //right forearm quad(strawX+85, strawY+129, strawX+100, strawY+144, strawX+45, strawY+180, strawX+35, strawY+167); //fist rect(strawX+5, strawY+146, 25, 39, 7); quad(strawX+15, strawY+145, strawX+60, strawY+165, strawX+45, strawY+180, strawX+15, strawY+185); //Right Shoulder ellipse(strawX+115, strawY+60, 30, 30); //ear quad(strawX+97, strawY-5, strawX+110, strawY, strawX+102, strawY+25, strawX+90, strawY+20); //Earrings fill(100); quad(strawX+105, strawY+7, strawX+113, strawY+12, strawX+110, strawY+19, strawX+102, strawY+15); quad(strawX+93, strawY+17, strawX+100, strawY+20, strawX+97, strawY+30, strawX+90, strawY+27); //hair stroke(0); line(strawX+95, strawY-37, strawX+100, strawY-49); line(strawX+80, strawY-43, strawX+82, strawY-55); line(strawX+72, strawY-46, strawX+72, strawY-60); noStroke(); //head fill(200, 50, 100); quad(strawX+60, strawY-50, strawX+105, strawY-33, strawX+85, strawY+40, strawX+30, strawY+35); //draw Straw fill(255); quad(strawX+50, strawY+12, strawX+50, strawY+3, strawX, strawY, strawX, strawY+10); //Left fingers fill(200, 50, 100); arc(strawX+20, strawY-4, 30, 30, 0, PI); //eyes //make eyes follow Geek== make eyes move slower than rest of body float eye1=strawY+(strawY*-0.04)-25; float eye2=strawY+(strawY*-0.04)-18; fill(255); //left eye ellipse(strawX+55, strawY-30, 20, 20); //NOSE fill(100, 0, 0); triangle(strawX+67, strawY-28, strawX+60, strawY-4, strawX+38, strawY-10); //cheek fill(150, 25, 60); ellipse(strawX+65, strawY+10, 40, 40); // right eye and pupils fill(255); ellipse(strawX+75, strawY-23, 20, 20); fill(10, 0, 0); ellipse(strawX+50, eye1, 5, 5); ellipse(strawX+70, eye2, 5, 5); //eyebrows stroke(0); strokeWeight(5); line(strawX+50, strawY-49, strawX+65, strawY-33); line(strawX+65, strawY-33, strawX+87, strawY-34); noStroke(); //head stubble ellipse(strawX+100, strawY-30, 3, 3); ellipse(strawX+98, strawY-24, 3, 3); ellipse(strawX+94, strawY-28, 3, 3); } void spitball() { fill(230,230,200); ellipse(spitballX, spitballY, ballSize, ballSize); ellipse(spitballX2, spitballY2, ballSize, ballSize); ellipse(spitballX3, spitballY3, ballSize, ballSize); ellipse(spitballX4, spitballY4, ballSize, ballSize); } void geek() { fill(100, 100, 200); //neck quad(geekBodyX, geekBodyY, geekBodyX+geekBodyWidth, geekBodyY, geekBodyX+geekBodyWidth/2, geekBodyY-40, geekBodyX, geekBodyY-40); //body rect(geekBodyX, geekBodyY, geekBodyWidth, 90); fill(200, 150, 170); //hair ellipse(headX+5, headY-35, 10, 20); ellipse(headX-5, headY-32, 20, 10); //ear fill(125, 125, 175); ellipse(headX+32, headY+20, 20, 30); //head fill(150, 150, 200); ellipse(headX, headY, headSize, headSize); ellipse(headX-10, headY+20, 70, 60); //eyes noFill(); stroke(50, 50, 100); strokeWeight(2); arc(headX-23, headY-5, 10, 20, PI, TWO_PI-0.3); arc(headX+5, headY+3, 10, 20, PI+0.3, TWO_PI); //eyebrows arc(headX+7, headY-22, 20, 25, 1.2, PI); arc(headX-23, headY-27, 14, 20, 0, PI-1); //glasses noFill(); stroke(0); ellipse(headX-23, headY-10, 25, 25); ellipse(headX+5, headY, 25, 25); line(headX-10, headY-7, headX-7, headY-5); //mouth stroke(50, 50, 100); arc(headX-25, headY+30, 10, 5, PI, TWO_PI-0.3); noStroke(); //nose fill(200, 200, 250); ellipse(headX-15, headY, 10, 15); //legs fill(75, 75, 125); noStroke(); quad(geekBodyX, geekBodyY+90, geekBodyX+40, geekBodyY+90, geekBodyX+80, height, geekBodyX+40, height); stroke(50, 50, 100); line(geekBodyX, geekBodyY+90, 60, 341); noStroke(); book(); //shoulders fill(100, 100, 200); ellipse(geekBodyX, geekBodyY-10, 35, 35); } //draw book void book() { //make Geek's hands/books tremble float shake= random(bookX-1.5, bookX+1.5); //book fill(75, 75, 200); rect(shake, bookY, 10, 70); quad(shake, bookY, shake+20, bookY+10, shake+20, bookY+60, shake, bookY+70); //arm fill(150, 150, 200); quad(geekBodyX, geekBodyY-15, shake, bookY+40, shake, bookY+60, geekBodyX, geekBodyY); //hand ellipse(shake, bookY+50, 30, 30); } void keepBallInStraw() { //if spitball is not moving and hasn't been shot yet if (spitballX>240 && ballSpeed==0) { spitballY=strawY+5; } if (spitballX2>240 && ballSpeed2==0) { spitballY2=strawY+5; } if (spitballX3>240 && ballSpeed3==0) { spitballY3=strawY+5; } if (spitballX4>240 && ballSpeed4==0) { spitballY4=strawY+5; } } void bullyMove() { //all variables associated with strawY (all of bully) moves when the arrow keys are pressed if (bullyUp==true) { strawY+=-bullyMovement; } if (bullyDown==true) { strawY+=bullyMovement; } } void bookMove() { //book (and hands and arms) moves when the WS keys are pressed if (bookUp==true) { bookY+=-geekMovement; } if (bookDown== true) { bookY+=geekMovement; } } void spitballMove() { //spitball gets assigned a speed and moves when spacebar is pressed. if (shootBall==true) { ballSpeed=5; } if (shootBall2==true) { ballSpeed2=5; } if (shootBall3==true) { ballSpeed3=5; } if (shootBall4==true) { ballSpeed4=5; } } void checkSpitballCollision() { //if spitball hits book if (spitballY>bookY && spitballY<bookY+70 && spitballX==bookX+10) { //spitball moves backwards shootBall=false; ballSpeed= ballSpeed*-1; } //if spitball hits body, spitball sticks to Geek if (spitballY>geekBodyY && spitballX<geekBodyX+geekBodyWidth+ballSize/2) { shootBall=false; ballSpeed=0; } //if spitball hits head, spitball sticks to Geek //online coding forum https://forum.processing.org/two/discussion/4246/how-to-detect-ellipse-collision if (dist(headX, headY, spitballX, spitballY)<headSize/2) { shootBall=false; ballSpeed=0; } if (dist(headX-10, headY+20, spitballX, spitballY)<60/2) { shootBall=false; ballSpeed=0; } //if spitball hits shoulders, spitball sticks to Geek if (dist(geekBodyX, geekBodyY-10, spitballX, spitballY)<35/2) { shootBall=false; ballSpeed=0; } } void checkSpitball2Collision() { //if spitball moves outside of frame, stop it if (spitballX2<0-10 || spitballX2>width+10) { shootBall2=false; ballSpeed2=0; } //if spitball hits book if (spitballY2>bookY && spitballY2<bookY+70 && spitballX2<=bookX+10) { //spitball moves backwards shootBall2=false; ballSpeed2=ballSpeed2*-1; } //if spitball hits body, spitball sticks to Geek if (spitballY2>geekBodyY && spitballX2<geekBodyX+geekBodyWidth+ballSize/2) { shootBall2=false; ballSpeed2=0; } //if spitball hits head, spitball sticks to Geek //online coding forum https://forum.processing.org/two/discussion/4246/how-to-detect-ellipse-collision if (dist(headX, headY, spitballX2, spitballY2)<headSize/2) { shootBall2=false; ballSpeed2=0; } if (dist(headX-10, headY+20, spitballX2, spitballY2)<60/2) { shootBall2=false; ballSpeed2=0; } //if spitball hits shoulders, spitball sticks to Geek if (dist(geekBodyX, geekBodyY-10, spitballX2, spitballY2)<35/2) { ballSpeed2=0; shootBall2=false; } } void checkSpitball3Collision() { if (spitballX3<0-10 || spitballX3>width+10) { shootBall3=false; ballSpeed3=0; } //if spitball hits book if (spitballY3>bookY && spitballY3<bookY+70 && spitballX3<=bookX+10) { //spitball moves backwards shootBall3=false; ballSpeed3= ballSpeed3*-1; } //if spitball hits body, spitball sticks to Geek if (spitballY3>geekBodyY && spitballX3<geekBodyX+geekBodyWidth+ballSize/2) { shootBall3=false; ballSpeed3=0; } //if spitball hits head, spitball sticks to Geek //online coding forum https://forum.processing.org/two/discussion/4246/how-to-detect-ellipse-collision if (dist(headX, headY, spitballX3, spitballY3)<headSize/2) { shootBall3=false; ballSpeed3=0; } if (dist(headX-10, headY+20, spitballX3, spitballY3)<60/2) { shootBall3=false; ballSpeed3=0; } //if spitball hits shoulders, spitball sticks to Geek if (dist(geekBodyX, geekBodyY-10, spitballX3, spitballY3)<35/2) { shootBall3=false; ballSpeed3=0; } } void checkSpitball4Collision() { //if spitball moves outside of frame, stop it if (spitballX4<0-10 || spitballX4>width+10) { shootBall4=false; ballSpeed4=0; } //if spitball hits book if (spitballY4>bookY && spitballY4<bookY+70 && spitballX4<=bookX+10) { //spitball moves backwards shootBall4=false; ballSpeed4=ballSpeed4*-1; } //if spitball hits body, spitball sticks to Geek if (spitballY4>geekBodyY && spitballX4<geekBodyX+geekBodyWidth+ballSize/2) { shootBall4=false; ballSpeed4=0; } //if spitball hits head, spitball sticks to Geek //online coding forum https://forum.processing.org/two/discussion/4246/how-to-detect-ellipse-collision if (dist(headX, headY, spitballX4, spitballY4)<headSize/2) { shootBall4=false; ballSpeed4=0; } if (dist(headX-10, headY+20, spitballX4, spitballY4)<60/2) { shootBall4=false; ballSpeed4=0; } //if spitball hits shoulders, spitball sticks to Geek if (dist(geekBodyX, geekBodyY-10, spitballX4, spitballY4)<35/2) { ballSpeed4=0; shootBall4=false; } } void scoring() { //if the spitball gets past the book, and doesn't go over the Geek's head, the score goes up if (spitballX==scoreLine && spitballY>71 ) { score++; } //for some reason spitballX won't register as == scoreline, so i made the scoreline wider if (spitballX2<scoreLine&& spitballX2>scoreLine-5 && spitballY2>71) { score++; } if (spitballX3<scoreLine&& spitballX3>scoreLine-5 && spitballY3>71) { score++; } if (spitballX4<scoreLine&& spitballX4>scoreLine-5 && spitballY4>71) { score++; } } void limitBullyMovement() { //restrains bully movement if (strawY<61) { bullyUp=false; } if (strawY>230) { bullyDown=false; } } void limitGeekMovement() { //restrains geek movement if (bookY<61-ballSize) { bookUp=false; } if (bookY>240-bookHeight) { bookDown=false; } } void keyPressed() { //used keyboard controls template if (key==' ' ) { //if the ball hasn't been shot yet if (ballSpeed==0) { shootBall=true; } //if spacebar is pressed and first spitball is launched if (spitballX<243 || spitballX>250) { if (ballSpeed2==0) { shootBall2=true; } } //if spacebar is pressed and first two spitballs are launched if (spitballX2<253 || spitballX2>260) { if (ballSpeed3==0) { shootBall3=true; } } if (spitballX3<263 || spitballX3>270) { if (ballSpeed4==0) { shootBall4=true; } } } //move book up when W key is pressed if (key=='w') { bookUp=true; } if (key=='s') { bookDown=true; } //used https://processing.org/reference/keyCode.html if (key==CODED) { if (keyCode==UP) { bullyUp=true; } if (keyCode==DOWN) { bullyDown=true; } } } void keyReleased() { if (key=='w') { bookUp=false; } if (key=='s') { bookDown=false; } if (key==CODED) { if (keyCode==UP) { bullyUp=false; } if (keyCode==DOWN) { bullyDown=false; } } }