//Assignment 2 Project //WARNING: RISK OF SEIZURE PLEASE PLAY WITH CAUTION //Interactive Toy by Wulusi Zhang 2017 //Introduction to Media Computation //Press "ENTER" to fire, WASD controls, beat Ridley before the reactor blows out and survive the bombs he drop //Establish Global Parameters float shapeVaria; float shapeHeight; float shapeWidth; float gravity = 1.2; float ridleyHealth; float ridleyX = 300; float ridleyY = 150; float enemyFireX = 80; float enemyFireY = 50; float enemyFireX2 = 150; float enemyFireY2 = 100; float enemyFireX3 = 300; float enemyFireY3 = 100; float rocketX = 0; float rocketY = 0; float rocketSpeed = 2; float rocketSize = 10; float damage; float playerHealth = 200; float playerDamage = 30; float playerX =100; float playerY =200; float playerSpeedX = 4.0; float playerSpeedY = 5; float randomMovementX; float randomMovementY; float lights; float y; float z; float time = millis(); boolean dLeft = false; boolean dRight= false; boolean dUp= false; boolean dShoot= false; boolean dHit= false; boolean dExplosion = false; boolean wingUp= false; //Setp up Canvas void setup() { size (400, 400); background (0); lights =50; y =60; z =80; ridleyHealth = 300; damage = 10; } //Draw boss on map void drawRidley() { fill(163, 182, 126); frameRate(60); randomMovementX = cos(frameCount/19.0)*50; randomMovementY = sin(frameCount/19.0)*50; shapeVaria = 3; shapeHeight = sin(frameCount/7.0)*5+60; shapeWidth = cos(frameCount/5.0)*5+70; fill(#380142); stroke(0); quad(262+ randomMovementX, 122+ randomMovementY, 228+ randomMovementX, 152+ randomMovementY, 284+ randomMovementX, 143+ randomMovementY, 289+ randomMovementX, 125+ randomMovementY); quad(267+ randomMovementX, 120+ randomMovementY, 280+ randomMovementX, 130+ randomMovementY, 306+ randomMovementX, 104+ randomMovementY, 303+ randomMovementX, 99+ randomMovementY); quad(268+ randomMovementX, 144+ randomMovementY, 238+ randomMovementX, 162+ randomMovementY, 282+ randomMovementX, 156+ randomMovementY, 287+ randomMovementX, 135+ randomMovementY); quad(286+ randomMovementX, 154+ randomMovementY, 306+ randomMovementX, 183+ randomMovementY, 314+ randomMovementX, 174+ randomMovementY, 291+ randomMovementX, 136+ randomMovementY); quad(309+ randomMovementX, 125+ randomMovementY, 291+ randomMovementX, 135+ randomMovementY, 306+ randomMovementX, 156+ randomMovementY, 320+ randomMovementX, 125+ randomMovementY); quad(302+ randomMovementX, 172+ randomMovementY, 292+ randomMovementX, 196+ randomMovementY, 313+ randomMovementX, 189+ randomMovementY, 313+ randomMovementX, 164+ randomMovementY); quad(292+ randomMovementX, 195+ randomMovementY, 298+ randomMovementX, 221+ randomMovementY, 300+ randomMovementX, 218+ randomMovementY, 307+ randomMovementX, 190+ randomMovementY); quad(297+ randomMovementX, 218+ randomMovementY, 302+ randomMovementX, 214+ randomMovementY, 318+ randomMovementX, 235+ randomMovementY, 315+ randomMovementX, 242+ randomMovementY); quad(318+ randomMovementX, 235+ randomMovementY, 315+ randomMovementX, 242+ randomMovementY, 333+ randomMovementX, 242+ randomMovementY, 328+ randomMovementX, 235+ randomMovementY); quad(331+ randomMovementX, 236+ randomMovementY, 329+ randomMovementX, 241+ randomMovementY, 336+ randomMovementX, 250+ randomMovementY, 342+ randomMovementX, 249+ randomMovementY); quad(336+ randomMovementX, 250+ randomMovementY, 342+ randomMovementX, 249+ randomMovementY, 339+ randomMovementX, 263+ randomMovementY, 336+ randomMovementX, 259+ randomMovementY); quad(339+ randomMovementX, 263+ randomMovementY, 336+ randomMovementX, 259+ randomMovementY, 330+ randomMovementX, 266+ randomMovementY, 331+ randomMovementX, 271+ randomMovementY); quad(330+ randomMovementX, 266+ randomMovementY, 331+ randomMovementX, 271+ randomMovementY, 319+ randomMovementX, 273+ randomMovementY, 319+ randomMovementX, 268+ randomMovementY); quad(319+ randomMovementX, 273+ randomMovementY, 319+ randomMovementX, 268+ randomMovementY, 309+ randomMovementX, 263+ randomMovementY, 309+ randomMovementX, 267+ randomMovementY); triangle(309+ randomMovementX, 263+ randomMovementY, 309+ randomMovementX, 267+ randomMovementY, 301+ randomMovementX, 260+ randomMovementY); triangle(302+ randomMovementX, 251+ randomMovementY, 300+ randomMovementX, 258+ randomMovementY, 302+ randomMovementX, 261+ randomMovementY); ellipse(ridleyX+ randomMovementX, ridleyY+ randomMovementY, 25, 25); fill(244, random(60, 200), 66); triangle(255+randomMovementX, 140+randomMovementY, 272+randomMovementX, 136+randomMovementY, 268+randomMovementX, 132+randomMovementY); ellipse (ridleyX + randomMovementX, ridleyY + randomMovementY, 20, 20); //Ridley Heart //wingbeats fill(#380142); frameRate(60); if (wingUp == false) { quad(313+randomMovementX, 127+randomMovementY, 319+randomMovementX, 164+randomMovementY, 386+randomMovementX, 118+randomMovementY, 379+randomMovementX, 62+randomMovementY); wingUp = true; } else { quad(313+randomMovementX, 201+randomMovementY, 319+randomMovementX, 164+randomMovementY, 386+randomMovementX, 210+randomMovementY, 379+randomMovementX, 266+randomMovementY); wingUp = false; } } //draw enemy projectiles void drawEnemyfire() { frameRate(60); stroke(0); fill(#ff2e00); ellipse(enemyFireX, enemyFireY-10, 10, 30+sin(frameCount/2.0)*rocketSize*2); fill(#e8b017); ellipse(enemyFireX, enemyFireY-10, 10, 15+sin(frameCount/2.0)*rocketSize*2); fill(#401660); ellipse(enemyFireX, enemyFireY, 10, 30); fill(255); rect(enemyFireX, enemyFireY-5, 10, 18); enemyFireY = enemyFireY+6; if (enemyFireY > 450) { enemyFireY = random(-200, -100); enemyFireX = random(100, 350); } if (enemyFireX >= playerX && enemyFireX <= playerX+20 && enemyFireY >= playerY && enemyFireY <= playerY+20) { frameRate(30); fill(#ff9d00); stroke(0); ellipse(playerX, playerY, cos(frameCount/5.0)*30, cos(frameCount/5.0)*40); playerHealth = playerHealth - playerDamage; //println(playerHealth); } } //draw enemy projectiles void drawEnemyfire2() { frameRate(60); stroke(0); fill(#ff2e00); ellipse(enemyFireX2, enemyFireY2-10, 10, 30+sin(frameCount/2.0)*rocketSize*2); fill(#e8b017); ellipse(enemyFireX2, enemyFireY2-10, 10, 15+sin(frameCount/2.0)*rocketSize*2); fill(#401660); ellipse(enemyFireX2, enemyFireY2, 10, 30); fill(255); rect(enemyFireX2, enemyFireY2-5, 10, 18); enemyFireY2 = enemyFireY2+6; if (enemyFireY2 > 450) { enemyFireY2 = random(-300, -200); enemyFireX2 = random(100, 350); } if (enemyFireX2 >= playerX && enemyFireX2 <= playerX+20 && enemyFireY2 >= playerY && enemyFireY2 <= playerY+20) { frameRate(30); fill(#ff9d00); stroke(0); ellipse(playerX, playerY, cos(frameCount/5.0)*30, cos(frameCount/5.0)*40); playerHealth = playerHealth - playerDamage; //println(playerHealth); } } //draw enemy projectiles void drawEnemyfire3() { frameRate(60); stroke(0); fill(#ff2e00); ellipse(enemyFireX3, enemyFireY3-10, 10, 30+sin(frameCount/2.0)*rocketSize*2); fill(#e8b017); ellipse(enemyFireX3, enemyFireY3-10, 10, 15+sin(frameCount/2.0)*rocketSize*2); fill(#401660); ellipse(enemyFireX3, enemyFireY3, 10, 30); fill(255); rect(enemyFireX3, enemyFireY3-5, 10, 18); enemyFireY3 = enemyFireY3+6; if (enemyFireY3 > 450) { enemyFireY3 = random(-300, -200); enemyFireX3 = random(100, 350); } if (enemyFireX3 >= playerX && enemyFireX3 <= playerX+20 && enemyFireY3 >= playerY && enemyFireY3 <= playerY+20) { frameRate(30); fill(#ff9d00); stroke(0); ellipse(playerX, playerY, cos(frameCount/5.0)*30, cos(frameCount/5.0)*40); playerHealth = playerHealth - playerDamage; //println(playerHealth); } } //Draw player spaceship on Map void drawPlayer() { stroke(0); fill(#2baf36); ellipse(playerX+8, playerY-12, 10, 8); fill(255); frameRate(60); ellipse(playerX, playerY, 4*sin(frameCount/6.0)+45, 4*sin(frameCount/6.0)+25); fill(#f90000); ellipse(playerX-25, playerY, 4*sin(frameCount/1.0)+35, 15); fill(#f9cf00); ellipse(playerX-20, playerY, 4*sin(frameCount/1.0)+25, 15); fill(#ff6a00); ellipse(playerX, playerY, 12, 10); quad(playerX-50, playerY-20, playerX-20, playerY, playerX, playerY, playerX-30, playerY-20); quad(playerX-20, playerY, playerX-50, playerY+20, playerX-30, playerY+20, playerX, playerY); quad(playerX+10, playerY+10, playerX+10, playerY-10, playerX+40, playerY, playerX+40, playerY+1); fill(#ff6a00); ellipse(playerX-12, playerY, 25, 10); //Gravity playerY = (playerY+gravity); //Player Vertical Jump Speed if (dRight == true) { playerX = playerX + playerSpeedX; } if (dLeft==true) { playerX = playerX - playerSpeedX; } if (dUp==true) { playerY+=-playerSpeedY; } playerX = constrain(playerX, 65, 335); playerY = constrain(playerY, 14, 365); } //Draw Rocket from player //Press enter to fire rocket at a straight line to the right, rocket will travel offscreen before another rocket can be fired void drawRocket() { if (dShoot==true) { if (key==ENTER) { if (rocketX <= width) { stroke(0); fill(#ffb71c); ellipse((rocketX +=(rocketSpeed-1))-5, rocketY, cos(frameCount/2.0)*rocketSize+20, rocketSize-2); fill(#db5c02); ellipse((rocketX +=(rocketSpeed-1))-3, rocketY, cos(frameCount/1.0)*rocketSize+17, rocketSize-2); rect(rocketX +=rocketSpeed, rocketY, rocketSize+10, rocketSize, 2); fill(255); ellipse(rocketX +=(rocketSpeed-1), rocketY, rocketSize+15, rocketSize); fill(#ff0000); ellipse(rocketX +=(rocketSpeed-1), rocketY, rocketSize+5, rocketSize); } } } else { rocketX = playerX + 8; rocketY = playerY; } //replaces the rocket at the location of the player if rocket went offscreen if (rocketX >= 400) { rocketX = playerX; rocketY = playerY; dShoot = false; //resets Shoot state to false until dShoot is true again } // Rocket hit detection (not sure if hitbox is correctly coded) if (rocketX >= (ridleyX) && rocketX <= (ridleyX+ randomMovementX) && rocketY <= (ridleyY+ randomMovementY+10) && rocketY >= (ridleyY+randomMovementY-10) && ridleyHealth>0 ) //rocket must be within hitbox to damage ridley { frameRate(80); fill(#ff9d00); stroke(0); ellipse(ridleyX+ randomMovementX, ridleyY+ randomMovementY, cos(frameCount/5.0)*30, cos(frameCount/5.0)*40); //println(ridleyHealth); ridleyHealth = ridleyHealth - damage; dShoot = true; if (damage > 25) { damage = 25; } } } //Draw HP Bar for Ridley void drawhpCounter() { stroke(0); fill(#ff4830); rect(ridleyX+randomMovementX, ridleyY+randomMovementY-60, (ridleyHealth/5), 10); } //Draw HP Bar for Player void drawPlayerhpCounter() { stroke(0); fill(#2db201); rect(playerX, playerY-30, (playerHealth/5), 10); } //Key Pressed controls for player void keyPressed() { if (key == 'w') { dUp=true; //println("w"); } else if (key == 'a') { dLeft=true; //println("a"); } else if (key == 'd') { dRight=true; //println("d"); } else if (key == ENTER) { dShoot=true; //println("shoot"); } } //Confirm keyPressed release to make sure controls do not lock void keyReleased() { if (key == 'w') { dUp=false; } else if (key == 'a') { dLeft=false; } else if (key == 'd') { dRight=false; } } //Draws Background elements and planet destroying giant beam void drawElevator() { for (float i=0; i<400; i+=4) { float lights; lights = random(0, 50); stroke(150); fill(#f7ff0f); rect(lights, (5*i)+lights, 1, 16, 3); rect(400-lights, (5*i)+lights, 1, 16, 3); lights = lights+1; } float section1 =0; noStroke(); fill(#dadbce); rect(section1+lights, section1+lights+150, 5, 400); rect(width-(section1+lights), section1+lights+150, 5, 400); //Background Elevator assets fill(#ffd800); rect(195, 200, 150+sin(frameCount/10.0)*130, 500, 6); fill(#ff5900); rect(195, 200, 60+sin(frameCount/10.0)*40, 500, 6); //Back Panel for Other lights fill(#e2e2e2, 80); ellipse(200, z+520, 290, 200); fill(#c4c4c4, 80); ellipse(200, z+500, 290, 200); fill(#878787, 50); ellipse(200, z+480, 290, 200); fill(random(200, 220), random(80, 206), 21, 50); ellipse(200, z+460, 290, 200); fill(#e2e2e2, 80); ellipse(200, z+440, 290, 200); fill(#c4c4c4, 80); ellipse(200, z+420, 290, 200); fill(#878787, 50); ellipse(200, z+400, 290, 200); fill(random(200, 220), random(80, 206), 21, 50); ellipse(200, z+380, 290, 200); fill(#e2e2e2, 80); ellipse(200, z+360, 290, 200); fill(#c4c4c4, 80); ellipse(200, z+340, 290, 200); fill(#878787, 50); ellipse(200, z+320, 290, 200); fill(random(200, 220), random(80, 206), 21, 50); ellipse(200, z+300, 290, 200); fill(#e2e2e2, 80); ellipse(200, z+280, 290, 200); fill(#c4c4c4, 80); ellipse(200, z+260, 290, 200); fill(#878787, 50); ellipse(200, z+240, 290, 200); fill(random(200, 220), random(80, 206), 21, 50); ellipse(200, z+220, 290, 200); fill(#e2e2e2, 80); ellipse(200, z+200, 290, 200); fill(#c4c4c4, 80); ellipse(200, z+180, 290, 200); fill(#878787, 50); ellipse(200, z+160, 290, 200); fill(random(200, 220), random(80, 206), 21, 50); ellipse(200, z+140, 290, 200); fill(#e2e2e2, 80); ellipse(200, z+120, 290, 200); fill(#c4c4c4, 80); ellipse(200, z+100, 290, 200); fill(#878787, 50); ellipse(200, z+80, 290, 200); fill(random(200, 220), random(80, 206), 21, 50); ellipse(200, z+60, 290, 200); fill(#e2e2e2, 80); ellipse(200, z+40, 290, 200); fill(#c4c4c4, 80); ellipse(200, z+20, 290, 200); fill(#878787, 50); ellipse(200, z, 290, 200); fill(random(200, 220), random(80, 206), 21, 50); ellipse(200, z-20, 290, 200); fill(#e2e2e2, 80); ellipse(200, z-40, 290, 200); fill(#c4c4c4, 80); ellipse(200, z-60, 290, 200); fill(#878787, 50); ellipse(200, z-80, 290, 200); fill(random(200, 220), random(80, 206), 21, 50); ellipse(200, z-100, 290, 200); fill(#e2e2e2, 80); ellipse(200, z-120, 290, 200); fill(#c4c4c4, 80); ellipse(200, z-140, 290, 200); fill(#878787, 50); ellipse(200, z-160, 290, 200); fill(random(200, 220), random(80, 206), 21, 50); ellipse(200, z-180, 290, 200); fill(#e2e2e2, 80); ellipse(200, z-200, 290, 200); fill(#c4c4c4, 80); ellipse(200, z-220, 290, 200); fill(#878787, 50); ellipse(200, z-240, 290, 200); fill(random(200, 220), random(80, 206), 21, 50); ellipse(200, z-260, 290, 200); z-=6; if (z<-100) { z = 200; } } //Game Over Screen once conditions are met, condition in void draw section below void drawGameOver() { fill(random(200, 250), random(120), 30); noStroke(); background(0); rect(200, 200, 160, 160); stroke(0); strokeWeight(4); line(170, 170, 150, 190); line(230, 170, 250, 190); line(150, 217, 150, 237); line(250, 217, 250, 237); line(150, 217, 250, 217); line(150, 237, 250, 237); } //Game Won Screen once conditions are met, condition in void draw section below void drawGameWon() { fill(random(0, 50), random(200, 250), 30); stroke(0); background(0); rect(200, 200, 160, 160); fill(0); strokeWeight(4); line(170, 170, 170, 190); line(230, 170, 230, 190); line(150, 217, 150, 237); line(250, 217, 250, 237); line(150, 237, 250, 237); } //Time Counter for game void drawTimeCounter() { stroke(0); fill(0, 255, 255); rect(200, 20, 300-(time/200), 5); //TIME strokeWeight(2.5); line(150,4,158,4); line(154,4,154,12); line(179,4,179,12); line(200,4,210,4); line(200,4,200,12); line(205,4,205,12); line(210,4,210,12); line(225,4,233,4); line(225,4,225,12); line(225,8,232,8); line(225,13,233,13); strokeWeight(1.5); } //draw all elements in project void draw() { background (0); fill(255); rectMode(CENTER); drawElevator(); if (playerHealth >0) { drawPlayer(); drawPlayerhpCounter(); } if (ridleyHealth > 0) { drawRidley(); drawhpCounter(); } drawRocket(); drawEnemyfire(); drawEnemyfire2(); drawEnemyfire3(); time = millis(); //set timer if (playerHealth<0 || time > 60000) { drawGameOver(); } if (time<60000 && playerHealth>0 && time > 0) { drawTimeCounter(); } if (ridleyHealth == 0) { drawGameWon(); } }