/* Interactive Toy designed and created by Francesca Ramirez Class: Into to Media Comp PROG14498, Section P04 PROGRAM DESCRIPTION: This program will create an interactive toy similar to Taiko Osu or Guitar Hero! You play a girl waiting for her cute date to come. Don't get too nervous and let your heart beat too fast! INSTRUCTIONS Use the arrow keys on the keyboard Watch the arrows as they scroll by the screen Press the corresponding arrow key to its pose as it lines up with the hit box Try not to get 5 penalties! Some code referenced from these lovely programs: http://www-acad.sheridanc.on.ca/PROG14998/2017/interactive-toy/shayla_ly_interactive_toy/index.html http://www-acad.sheridanc.on.ca/PROG14998/2017/interactive-toy/victoria_palermo_interactive_toy/index.html */ //create variables for every hardcoded number in shapes/colours later //variable declaration and initialization float rectPosX = 0, circlePosX = 10; float poseLeftX = 400, poseUpX = 450, poseDownX = 500, poseRightX = 550; float poseSpeedLeft = random (1, 3), poseSpeedUp =random (1, 3), poseSpeedDown = random (1, 3), poseSpeedRight = random (1, 3); float randomNumber; float distHitLeft, distHitUp, distHitDown, distHitRight; int penalty = 0; float beatSpeed1 = 30, beatSpeed2 = 35; void setup() { //window size 400x400 pixels size(400, 400); //remove cursor noCursor(); //make frame rate 60fps frameRate(60); println("Use the arrow keys on the keyboard\nWatch the arrows as they scroll by the screen\nPress the corresponding arrow key to its pose as it lines up with the hit box\nTry not to get 5 penalties!" + "\nThe characters breathing will increase with each penalty (hence why this game is called Heart Beats"); println("Play https://listenonrepeat.com/?v=RALSyjNx_r4#elijah_who_-_a_cute_date to play to some cute beats!!!"); }//end setup void draw() { //initialize variables here to update distHitLeft = dist(poseLeftX, 50, 20, 0); distHitUp = dist(poseUpX, 20, 20, 0); distHitDown = dist(poseDownX, 80, 20, 0); distHitRight = dist(poseRightX, 50, 20, 0); randomNumber = random(0, 1); drawStage(); drawLights(); drawPlayer(); arrowIndicator(); drawLeft(); drawUp(); drawDown(); drawRight(); drawScore(); scoreIndicator(); endScreen(); }//end draw void drawStage() { //stage ground and wall strokeWeight(2); stroke(255); fill(255, 142, 114); rect(0, 240, width, 80); fill(218, 70, 74); rect(0, 340, width, 60); fill(237, 106, 94); rect(0, 100, 400, 120); //draw panel fill(218, 70, 74); rect(0, 0, 400, 100); fill(255); rect(20, 0, 80, 100); stroke(0); strokeWeight(2); line(60, 40, 60, 60); line(50, 50, 70, 50); }//end draw stage void drawLights() { //create a for loop to create multiple shapes strokeWeight(1); stroke(255); fill(76, 213, 153, 250); //loop for the width amount to draw the lights for (int i = 0; i < width/2; i++) { //top lights rect(rectPosX, 220, 20, 20); ellipse(circlePosX, 230, 20, 20); //bottom lights rect(rectPosX, 320, 20, 20); ellipse(circlePosX, 330, 20, 20); rectPosX = rectPosX + 20; circlePosX = circlePosX + 20; }//end for loop }//end drawing lights void drawPlayer() { //make player bob up and down a little stroke(255); fill(76, 224, 179, 200); triangle(width/2, 4 * cos(frameCount / beatSpeed1) + 180, 230, 4 * cos(frameCount / beatSpeed1) + 250, 170, 4 * cos(frameCount / beatSpeed1) + 250); triangle(205, 4 * cos(frameCount / beatSpeed1) + 180, 215, 4 * cos(frameCount / beatSpeed1) + 200, 240, 4 * cos(frameCount / beatSpeed1) + 220); triangle(195, 4 * cos(frameCount / beatSpeed1) +180, 185, 4 * cos(frameCount / beatSpeed1) +200, 160, 4 * cos(frameCount / beatSpeed1) +220); triangle(width/2, 255, width/2 + 10, 255, width/2 + 5, 300); triangle(width/2 - 10, 255, width/2, 255, width/2 - 5, 300); triangle(240, 3 * cos(frameCount / beatSpeed2) + 120, 235, 3 * cos(frameCount / beatSpeed2) + 150, 260, 3 * cos(frameCount / beatSpeed2) + 160); triangle(160, 3 * cos(frameCount / beatSpeed2) + 120, 165, 3 * cos(frameCount / beatSpeed2) + 150, 140, 3 * cos(frameCount / beatSpeed2) + 160); ellipse(width/2, 3 * cos(frameCount / beatSpeed2) + 150, 60, 60); }//end drawing void arrowIndicator() { stroke(76, 224, 179); fill(255); //left arrow triangle(70, 370, 100, 340, 100, 400); //up arrow triangle(150, 340, 180, 370, 120, 370); //down arrow triangle(200, 370, 230, 400, 260, 370); //right arrow triangle(280, 340, 310, 370, 280, 400); //highlight arrows when pressed stroke(255); fill(76, 224, 179); if (keyPressed && keyCode == LEFT) { triangle(70, 370, 100, 340, 100, 400); } else if (keyPressed && keyCode == UP) { triangle(150, 340, 180, 370, 120, 370); } else if (keyPressed && keyCode == DOWN) { triangle(200, 370, 230, 400, 260, 370); } else if (keyPressed && keyCode == RIGHT) { triangle(280, 340, 310, 370, 280, 400); } }//end arrow indicator void keyPressed() { //when player presses arrow key once the corresponding arrow crosses the hit box, they're safe if (keyCode == LEFT) { if (distHitLeft > 70) { penalty = penalty + 1; } } if (keyCode == UP) { if (distHitUp > 70) { penalty = penalty + 1; } } if (keyCode == DOWN) { if (distHitDown > 90) { penalty = penalty + 1; } } if (keyCode == RIGHT) { if (distHitRight > 70) { penalty = penalty + 1; } } }//end pose indicator //draw up arrow void drawUp() { stroke(255); fill(76, 224, 179, 200); triangle(poseUpX, 20, poseUpX - 30, 50, poseUpX + 30, 50); poseUpX = poseUpX - poseSpeedUp; if (poseUpX < 0) { poseUpX = 400; poseSpeedUp = random (1, 3); poseSpeedUp = poseSpeedUp + randomNumber; } }//end draw arrow //draw down arrow void drawDown() { stroke(255); fill(76, 224, 179, 200); triangle(poseDownX, 80, poseDownX - 30, 50, poseDownX + 30, 50); poseDownX = poseDownX - poseSpeedDown; if (poseDownX < 0) { poseDownX = 400; poseSpeedDown = random (1, 3); poseSpeedDown = poseSpeedDown + randomNumber; } }//end draw arrow //draw left arrow void drawLeft() { stroke(255); fill(76, 224, 179, 200); triangle(poseLeftX, 50, poseLeftX + 30, 20, poseLeftX + 30, 80); poseLeftX = poseLeftX - poseSpeedLeft; if (poseLeftX < 0) { poseLeftX = 400; poseSpeedLeft = random (1, 3); poseSpeedLeft = poseSpeedLeft + randomNumber; } }//end draw arrow void drawRight() { stroke(255); fill(76, 224, 179, 200); triangle(poseRightX + 60, 50, poseRightX + 30, 20, poseRightX + 30, 80); poseRightX = poseRightX - poseSpeedRight; if (poseRightX < 0) { poseRightX = 400; poseSpeedRight = random (1, 3); poseSpeedRight = poseSpeedRight + randomNumber; } }//end draw arrow void drawScore() { fill(255); rect(10, 110, 10, 20); rect(30, 110, 10, 20); rect(50, 110, 10, 20); rect(70, 110, 10, 20); rect(90, 110, 10, 20); }// end draw score void scoreIndicator() { if (penalty == 1) { beatSpeed1 = 25; beatSpeed2 = 30; fill(76, 224, 179); rect(10, 110, 10, 20); } else if (penalty == 2) { beatSpeed1 = 20; beatSpeed2 = 25; fill(76, 224, 179); rect(10, 110, 10, 20); rect(30, 110, 10, 20); } else if (penalty == 3) { beatSpeed1 = 15; beatSpeed2 = 20; fill(76, 224, 179); rect(10, 110, 10, 20); rect(30, 110, 10, 20); rect(50, 110, 10, 20); } else if (penalty == 4) { beatSpeed1 = 10; beatSpeed2 = 15; fill(76, 224, 179); rect(10, 110, 10, 20); rect(30, 110, 10, 20); rect(50, 110, 10, 20); rect(70, 110, 10, 20); } else if (penalty == 5) { beatSpeed1 = 5; beatSpeed2 = 10; fill(76, 224, 179); rect(10, 110, 10, 20); rect(30, 110, 10, 20); rect(50, 110, 10, 20); rect(70, 110, 10, 20); rect(90, 110, 10, 20); } }//end penalty checker void endScreen() { if (penalty > 5) { frameRate(2); fill(218, 70, 74, 200); triangle(240, 140, 200, 220, 300, 220); triangle(160, 140, 100, 220, 200, 220); triangle(300, 220, 100, 220, 200, 320); strokeWeight(2); line(200, 220, 230, 250); line(230, 250, 180, 260); line(180, 260, 200, 320); println("GAME OVER! Refresh to play again and keep your heart beat steady!"); } }// end end screen //end program