/* Smashed by Suraj Sirohi Use arrrow keys, left and right to move the hook horizontally and up and down for vertical movement. Try to hook the reddish box, once hooked the box will turn dark. Press Shift to drop the box anywhere (Once Hooked). Dropping the box directly aboive the person will smash the person. After the person is crushed under the box you can pick up the box again, the person will respawn. */ float cranePosX = 200 ; float craneSpeed = 6; float craneStringEndPoint = 150; float boxPosX = 300, boxPosY = 340; float fallingSpeed = 2; float personPosX = 200, personPosY = 350; float boomEffectRadius; float boomEffectAlpha = 255; float bloodDropPosX, bloodDropPosY; float bloodDropRadius = 15; float bloodPoolRadius, bloodPoolRadiusExpandSpeed = 2; float unitsMoved; float personHeight = 20; float randomNumber; float personSpeed = 0.5; int bloodPoolAlpha = 255; int hookedColor = 166; boolean checkForHook = true, Hooked; boolean doGenerateRandomNumber; boolean personAlreadySmashed; boolean movePersonBool; boolean createBloodPoolBool; boolean randomNumberGenerated; boolean speak; void setup() { size(400, 400); } void draw() { background(124, 225, 255); //Make cloud pattern makeClouds(); //Draw Ground drawGround(); //Draw Crane Rod drawCraneRod(); //Draw Crane String drawCraneString(); //Draw Person drawPerson(); //Hook the PickUpBox to Crane String when close enough lookForHook(); //Move the PickUpBox wth crane when Hooked postHooked(); //Generate a random number once generateRandomNumber(); //Make the PickUpBox Fall boxDrop(); //Reset The smash bool resetSmashingBooleans(); //Animate Respawning respawnPerson(); //Call screateBloodPool function if (createBloodPoolBool) { createBloodPool(); } //Spread The Blood spreadBlood(); //Draw Crane Box Crane(); //Draw Blue Box drawPickUpBox(); //Constraint Y-position of PickUpBox constraintBoxPosition(); //Smash the person when box falls directly on it. startSmashPersonProcess(); //Reset Smashing resetSmash(); //Move Person In Random Directions if (movePersonBool && unitsMoved < 40) { movePerson(); unitsMoved+=0.1; } //Make Person Speak makePersonSpeak(); } void keyPressed() { if (key == CODED) { if (keyCode == LEFT && cranePosX > 169) { cranePosX -= craneSpeed; } else if ( keyCode == RIGHT) { cranePosX += craneSpeed; } if (keyCode == UP && craneStringEndPoint > 120) { craneStringEndPoint -= craneSpeed; } else if (keyCode == DOWN && craneStringEndPoint < 340) { craneStringEndPoint += craneSpeed; } if (keyCode == SHIFT) { Hooked =false; hookedColor=166; } } } //Draw Ground void drawGround() { rectMode(CORNER); fill(100, 100, 0); rect(0, 360, 400, 50); } //Draw Crane Long rod void drawCraneRod() { strokeWeight(9); stroke(252, 237, 79); line(64, 324, cranePosX, 70); } //Draw Crane Strings void drawCraneString() { //Strings strokeWeight(2); line(cranePosX -3, 70, cranePosX-3, craneStringEndPoint - 20); line(cranePosX +3, 70, cranePosX+3, craneStringEndPoint - 20); noStroke(); //Joint Circle fill(252, 237, 79); ellipse(cranePosX -2, 72, 15, 15); //Hook Base quad(cranePosX -2, craneStringEndPoint -22, cranePosX +2, craneStringEndPoint -22, cranePosX +5, craneStringEndPoint -16, cranePosX -5, craneStringEndPoint-16); quad(cranePosX -5, craneStringEndPoint - 16, cranePosX + 5, craneStringEndPoint -16, cranePosX + 2, craneStringEndPoint - 1, cranePosX - 2, craneStringEndPoint - 1); //Hook stroke(252, 237, 79); noFill(); arc(cranePosX, craneStringEndPoint + 7, 15, 15, PI + 1.6, 2*PI + 2); } //Draw the Crane Box void Crane() { rectMode(CORNER); noStroke(); //Yellow Back Box fill(252, 237, 79); rect(20, 312, 50, 40); //Black Front Box fill(40); rect(30, 302, 40, 40); //Sky Color Window fill(149, 231, 255); rect(35, 307, 30, 30); //Black Wheels strokeWeight(15); stroke(40); line(20, 355, 70, 355); //Inner Wheels strokeWeight(7); stroke(100); line(20, 355, 70, 355); noStroke(); } //Draw Box to be picked up by Crane void drawPickUpBox() { //Main Box rectMode(CENTER); fill(hookedColor, 113, 142); rect(boxPosX, boxPosY, 50, 40); //In-Between Lines stroke(hookedColor, 59, 126); strokeWeight(4); line(boxPosX - 24, boxPosY -18, boxPosX - 24, boxPosY +18); line(boxPosX - 12, boxPosY -18, boxPosX - 12, boxPosY +18); line(boxPosX - 2, boxPosY -18, boxPosX - 2, boxPosY +18); line(boxPosX + 8, boxPosY -18, boxPosX + 8, boxPosY +18); line(boxPosX + 22, boxPosY -18, boxPosX + 22, boxPosY +18); noStroke(); } //Draw Humanoid Character void drawPerson() { noStroke(); //Main Rect fill(153, 188, 104); rectMode(CENTER); rect(personPosX, personPosY, 15, personHeight); //Pants fill(245, 128, 70); rect(personPosX, personPosY + 6, 15, 10); stroke(126, 66, 38); line(personPosX, personPosY, personPosX, personPosY +10); noStroke(); //Head fill(255, 227, 82); ellipse(personPosX, personPosY - 15, personHeight/1.2, personHeight/1.2); fill(103, 76, 19); arc(personPosX, personPosY - 18, personHeight/1.2, personHeight/1.2, PI, 2*PI); } //Mask the reddish blood pool void drawBloodPoolMask() { fill(124, 225, 255); rect(personPosX, personPosY, 220, 20); } //Crush the person under the box void smashPerson() { personHeight = 0; fill(250, 130, 80, boomEffectAlpha); ellipse(personPosX, personPosY, boomEffectRadius, boomEffectRadius); boomEffectRadius += 10; boomEffectAlpha -= 10; fill(255, 0, 0); ellipse(personPosX + bloodDropPosX, personPosY + bloodDropPosY, bloodDropRadius, bloodDropRadius); ellipse(personPosX + bloodDropPosX + 20, personPosY + bloodDropPosY + 7, bloodDropRadius, bloodDropRadius); ellipse(personPosX + bloodDropPosX - 20, personPosY + bloodDropPosY + 2, bloodDropRadius, bloodDropRadius); bloodDropPosY -= 4; bloodDropRadius -= 0.7; } //Create Blood pool that spreads after person is smashed void createBloodPool() { fill(232, 93, 75, bloodPoolAlpha); ellipse(personPosX, personPosY + 10, bloodPoolRadius, 10); if (bloodPoolRadiusExpandSpeed > 0) { bloodPoolRadius += bloodPoolRadiusExpandSpeed; } bloodPoolRadiusExpandSpeed -= 0.01; } //Reset values after smashing void resetSmashing() { personAlreadySmashed = true; boomEffectAlpha = 255; boomEffectRadius = 0; bloodDropRadius = 15; bloodDropPosY = 0; unitsMoved = 0; randomNumberGenerated=false; } //Make person move in random direction void movePerson() { if (personPosX > 149 && personPosX < 385) { if (randomNumber > 1) { personPosX += personSpeed; } else { personPosX -= personSpeed; } } else if (personPosX <= 149) { personPosX += personSpeed; } else if (personPosX >= 185) { personPosX -= personSpeed; } } //Print a statement when perons is crushed void personSpeak() { println("Ouch!"); } //Make CLoud Pattern void makeClouds() { for (int k = 0; k < 9; k++) { for (int j =0; j < 4; j++) { for (int i = 0; i < 4; i++) { fill(152, 251, 255); ellipse(40 * i/1.7 + k *120 + j*35 - 90, 20 + j * 50, 30, 25); } } } } void lookForHook() { if (abs(boxPosX - cranePosX) < 4 && abs(craneStringEndPoint - boxPosY) < 4 && checkForHook) { hookedColor = 120; Hooked = true; checkForHook =false; } } void postHooked() { if (Hooked) { boxPosX = cranePosX; boxPosY = craneStringEndPoint; if (!randomNumberGenerated) { doGenerateRandomNumber = true; } } } void generateRandomNumber() { if (doGenerateRandomNumber) { randomNumber = random(2); doGenerateRandomNumber = false; randomNumberGenerated = true; } } void boxDrop() { if (!Hooked && boxPosY < 338) { boxPosY += fallingSpeed; fallingSpeed += 0.25; } } void resetSmashingBooleans() { if (boxPosY < 300) { personAlreadySmashed = false; movePersonBool = true; if (bloodPoolAlpha >0) { bloodPoolAlpha -= 8; } else { bloodPoolRadius = 0; bloodPoolRadiusExpandSpeed = 2; } } } void respawnPerson() { if (personHeight < 20 && boxPosY < 300) { personHeight++; } } void constraintBoxPosition() { if (boxPosY >= 338) { checkForHook =true; fallingSpeed =2; boxPosY =340; movePersonBool =false; } } void startSmashPersonProcess() { if (abs(personPosX - boxPosX) < 26 && abs(personPosY - boxPosY) < 15 && !personAlreadySmashed && !Hooked) { bloodPoolAlpha=255; smashPerson(); personSpeak(); } } void resetSmash() { if (boomEffectAlpha < 5) { resetSmashing(); } } void makePersonSpeak() { if (speak) { personSpeak(); speak = false; } } void spreadBlood() { if (personAlreadySmashed) { createBloodPoolBool =true; drawBloodPoolMask(); } }