////////////////////////////////////////////////////////////////////////// // Interactive Toy - Crane Game Irvin Lam // // // // Press Left and Right arrow keys to // // move the crane on its horizontal axis // // // // Press Spacebar to take a chance at winning // // // ////////////////////////////////////////////////////////////////////////// void setup () { size (400, 400); frameRate(144); println("Press Left or Right arrow keys to move the crane"); println("Press Spacebar to take a chance at winning"); } boolean bun1here = true; boolean bun2here = true; boolean bun3here = true; float x_bpos1 = (int)(random(140, 175)); float x_bpos2 = (int)(random(200, 270)); float x_bpos3 = (int)(random(300, 350)); float y_bpos1 = 275; float y_bpos2 = 275; float y_bpos3 = 275; float moveSpeed = 2; float gravity = 1.7; boolean goLeft = false; boolean goRight = false; boolean space = false; boolean grapple = false; boolean grab1 = true; boolean grab2 = true; boolean grab3 = true; float defaultPosx = 75; float defaultPosy = 0; float p1Posx = defaultPosx; float p1Posy = defaultPosy; void draw() { background(79, 149, 216); noStroke(); ceiling(); arcadeSpawner(); door(100, 225, .4); crane(p1Posx, p1Posy); platform(); bunnySpawner(); dropZone(); glass(); pillar(0); pillar(370); controls(); instruction(); } // Additional visual cues of controls void instruction() { rectMode(CENTER); if (goRight == true) { fill(134, 11, 0); } else { fill(45); } //Right Arrow rect(145, 375, 30, 7); quad(140, 365, 155, 365, 170, 375, 160, 375); quad(170, 375, 160, 375, 140, 385, 155, 385); if (goLeft == true) { fill(134, 11, 0); } else { fill(45); } //Left arrow rect(55, 375, 30, 7); quad(60, 365, 45, 365, 30, 375, 40, 375); quad(30, 375, 40, 375, 60, 385, 45, 385); //Space bar fill(190); quad(285, 378, 360, 378, 365, 387, 281, 387); fill(240); quad(290, 375, 355, 375, 360, 380, 285, 380); fill(220); quad(285, 380, 360, 380, 362, 385, 283, 385); } void ceiling() { fill(100); rectMode(CORNER); rect(0, 0, 400, 50); } void door(int x, int y, float size) { fill(69, 67, 147); rectMode(CENTER); rect(x, y, 200*size, 400*size); fill(140); rect(x, y + (195*size), 200*size, 10*size); fill(25); rect(x, y-(190*size), 200*size, 20*size); rect(x-(100*size), y, 20*size, 400*size); rect(x+(100*size), y, 20*size, 400*size); fill(177, 11, 0); quad(x-(110*size), y+(200*size), x+(110*size), y+(200*size), x+(400*size), y+(800*size), x-(400*size), y+(800*size)); } // Spawns arcade machines in background void arcadeSpawner() { for (int i = 0; i<2; i++) { arcade_m(225+(i*125), 225, .5); } } // Draw base for arcade machine void arcade_m(int x, int y, float size) { fill(69, 67, 147); rectMode(CENTER); rect(x, y, 200*size, 400*size); fill(80); rect(x, y+(50*size), 200*size, 75*size); fill(25); rect(x-(100*size), y, 10*size, 400*size); rect(x+(100*size), y, 10*size, 400*size); rect(x, y-(160*size), 200*size, 75*size); fill(153, 152, 196); rect(x, y-(60*size), 150*size, 100*size); fill(25); rect(x, y+(125*size), 200*size, 145*size); } void platform() { noStroke(); fill(240); rectMode(CORNER); rect(0, 330, 400, 20); } void dropZone() { noStroke(); fill(220); rectMode(CORNER); rect(0, 310, 125, 100); } void glass() { noStroke(); rectMode(CORNER); fill(255, 50); rect(0, 0, 400, 400); // Draws the light reflections on glass pane for (int i = 0; i<3; i++) { quad(-100+i*400, -100, -130+i*400, -100, -670+i*400, 500, -700+i*400, 500); } } void pillar(int xpos) { noStroke(); rectMode(CORNER); fill(181, 219, 149); rect(xpos, 0, 30, 400); fill(245); rect(xpos+25, 0, 2, 400); rect(xpos+2, 0, 2, 400); } // Initiates control panel elements void controls() { noStroke(); rectMode(CORNER); fill(187, 233, 217); rect(0, 350, 400, 50); joyStick(380); d_button(); } // Joystick drawing and movement void joyStick(int y) { noStroke(); ellipseMode(CENTER); if (goLeft == true) { fill(200); quad(75, y-50, 85, y-50, 105, y, 95, y); fill(25); ellipse(100, y, 20, 10); fill(200); ellipse(99, y-5, 10, 7); fill(177, 11, 0); ellipse(80, y-50, 20, 20); } else if (goRight == true) { fill(200); quad(125, y-50, 115, y-50, 95, y, 105, y); fill(25); ellipse(100, y, 20, 10); fill(200); ellipse(102, y-5, 10, 7); fill(177, 11, 0); ellipse(120, y-50, 20, 20); } else { fill(200); rectMode(CENTER); rect(100, y-25, 10, 50); fill(25); ellipse(100, y, 20, 10); fill(200); ellipse(100, y-5, 10, 7); fill(177, 11, 0); ellipse(100, y-50, 20, 20); } } // Visual cue for when space button is pressed (depresses button) void d_button() { fill(130, 15, 0); ellipseMode(CENTER); ellipse(250, 380, 30, 15); //button reaction if (space == true) { fill(177, 11, 0); ellipseMode(CENTER); ellipse(250, 378, 20, 10); } else if (space == false) { ellipseMode(CENTER); fill(157, 15, 0); ellipse(250, 378, 20, 10); fill(177, 11, 0); ellipse(250, 375, 20, 10); } } // Crane movement void crane(float posX, float posY) { rectMode(CORNER); fill(240); rect(posX-10, posY-200, 20, 300); fill(150); rect(posX-25, posY+90, 50, 10); grappler(posX, posY); noFill(); stroke(100); ellipse(posX-23, posY+95, 10, 10); ellipse(posX+23, posY+95, 10, 10); // Descends the crane if (space == true) { if (p1Posy >= 0 && p1Posy <= 125) { p1Posy += moveSpeed; } else { space = false; grapple = true; grappler(posX, posY); } } // Ascends the crane and brings it back to its original (x and y) position if (space == false && p1Posy != defaultPosy) { p1Posy -= moveSpeed; if (p1Posx >= defaultPosx && p1Posx != defaultPosx) { p1Posx -= moveSpeed; } else if (p1Posx <= 100 && p1Posx != defaultPosx) { p1Posx += moveSpeed; } } // Re-opens the crane if (p1Posy == defaultPosy && p1Posx == defaultPosx) { grapple = false; } } // Draws the two different states of the grappler (open & close) void grappler(float posX, float posY) { if (grapple == false) { fill(177, 11, 0); ellipseMode(CENTER); ellipse(posX-23, posY+95, 14, 14); ellipse(posX+23, posY+95, 14, 14); quad(posX-30, posY+95, posX -16, posY+95, posX-16, posY+135, posX-30, posY+130); quad(posX+16, posY+95, posX+30, posY+95, posX+30, posY+130, posX+16, posY+135); } else if (grapple == true) { fill(177, 11, 0); ellipseMode(CENTER); ellipse(posX-23, posY+95, 14, 14); ellipse(posX+23, posY+95, 14, 14); quad(posX-30, posY+95, posX -16, posY+95, posX, posY+135, posX-15, posY+130); quad(posX+16, posY+95, posX+30, posY+95, posX+15, posY+130, posX, posY+135); } } // Spawns bunnies void bunnySpawner() { // initiates the bunnies and draws them in their respective starting positions bunny_1(x_bpos1, y_bpos1); bunny_2(x_bpos2, y_bpos2); bunny_3(x_bpos3, y_bpos3); // Makes it so that the grapple carries the bunnies upwards with the crane // // grab1,2,3 booleans are there to ensure that no more than one bunny can be moved at the same time if (grapple == true) { if (p1Posx < x_bpos1 + 10 && p1Posx > x_bpos1-10 && grab1 == true) { grab2 = false; grab3 = false; x_bpos1 = p1Posx; y_bpos1 = p1Posy+150; bunny_1(p1Posx, p1Posy + 150); bunny_2(x_bpos2, y_bpos2); bunny_3(x_bpos3, y_bpos3); } else if (p1Posx > x_bpos2-10 && p1Posx < x_bpos2 + 10 && grab2 == true) { grab1 = false; grab3 = false; x_bpos2 = p1Posx; y_bpos2 = p1Posy+150; bunny_1(x_bpos1, y_bpos1); bunny_2(p1Posx, p1Posy + 150); bunny_3(x_bpos3, y_bpos3); } else if (p1Posx > x_bpos3-10 && p1Posx < x_bpos3 + 10 && grab3 == true) { grab1 = false; grab2 = false; x_bpos3 = p1Posx; y_bpos3 = p1Posy+150; bunny_1(x_bpos1, y_bpos1); bunny_2(x_bpos2, y_bpos2); bunny_3(p1Posx, p1Posy+150); } } // Makes bunnies fall once the crane grappler is released // Also makes the bunny disappear if it goes beyond the height of the screen if (grapple == false) { if (x_bpos1 == defaultPosx) { y_bpos1 += gravity; bunny_1(x_bpos1, y_bpos1); if (y_bpos1 > 400) { bun1here = false; println("You Won a Bunny!"); grab2 = true; grab3 = true; } } if (x_bpos2 == defaultPosx) { y_bpos2 += gravity; bunny_2(x_bpos2, y_bpos2); if (y_bpos2 > 400) { bun2here = false; println("You Won a Bunny!"); grab1 = true; grab3 = true; } } if (x_bpos3 == defaultPosx) { y_bpos3 += gravity; bunny_3(x_bpos3, y_bpos3); if (y_bpos3 > 400) { bun3here = false; println("You Won a Bunny!"); grab1 = true; grab2 = true; } } } } // Drawing bunnies with seperate methods allows me to make individual bunnies disappear // after it reaches a certain threshold, that way it doesn't fall infinitely. void bunny_1(float x, float y) { if (bun1here == true) { bunny(x, y); } } void bunny_2(float x, float y) { if (bun2here == true) { bunny(x, y); } } void bunny_3(float x, float y) { if (bun3here == true) { bunny(x, y); } } // Draw function for the bunny base void bunny(float x, float y) { fill(237, 177, 230); ellipseMode(CENTER); //ears ellipse(x+10, y-10, 10, 40); ellipse(x-10, y-10, 10, 40); fill(255); ellipse(x+9, y-8, 10, 40); ellipse(x-9, y-8, 10, 40); //head fill(237, 177, 230); ellipse(x, y+10, 30, 35); //eyes fill(50); ellipse(x-7, y+4, 5, 5); ellipse(x+7, y+4, 5, 5); //nose triangle(x-2, y+7, x+2, y+7, x, y+11); //torso fill(237, 177, 230); ellipse(x, y+40, 35, 50); fill(255); ellipse(x, y+45, 30, 40); //feet fill(237, 177, 230); ellipse(x-10, y+65, 30, 10); ellipse(x+10, y+65, 30, 10); } // Controls of the toy void keyPressed() { //Left arrow if (keyCode == 37) { p1Posx -= moveSpeed; goLeft = true; } //Right arrow if (keyCode == 39) { p1Posx += moveSpeed; goRight = true; } //Space key if (keyCode == 32) { space = true; } } void keyReleased() { if (keyCode == 37) { goLeft = false; } if (keyCode == 39) { goRight = false; } }