Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/////////////////////////
///Mad Science Machine///
/////by Devan Boone//////
/////////////////////////


///////////////////////////////////////////////////////
//////far left lever controlls power and lightbulb/////
/////////second from left powers up tesla coil/////////
//purple button releases rainbow bubbles from exhaust//
//////////green button reveals small claw//////////////
///////////////////////////////////////////////////////

//variables for lightbulb colour
float filamentR = 0;
float filamentG = 0;
float bulbB = 180;

// variables dictating Claw location and dropped bottle
float clawSpring1X = 120;
float clawSpring2X = 115;
float clawBladeX;
float clawBlade1Y=255;
float clawBlade2Y=245;
float bottleY;
float bottleX;
float doorCorner1X = 100;
float doorCorner2X = 120;
boolean doorOpen = false;
//variables for exhaust bubbles
float bubble1X = random(70, 110);
float bubble1Y = random(310, 350);
float bubble2X = random(70, 110);
float bubble2Y = random(310, 350);
float bubble3X = random(70, 110);
float bubble3Y = random(310, 350);
float bubble4X = random(70, 110);
float bubble4Y = random(310, 350);
float bubbleMovement1Y = random(-3, 0);
    float bubbleMovement2Y = random(-4, 0);
    float bubbleMovement3Y = random(-4, 0);
    float bubbleMovement4Y = random(-4, 0);

//universal timer variables
float startTimeBubble = 0;
float startTimeLever = 0;
float startTimeClaw = 0;
float startTimeBolt = 0;


//variables dictating tesla coil
float teslaBolt1X;
float teslaBolt2X;
float teslaBolt1Y;
float teslaBolt2Y;
float teslaBoltVariance1X;
float teslaBoltVariance2X;
float teslaBoltVariance1Y;
float teslaBoltVariance2Y;
float teslaOrigin;


//on off boolean

boolean machineActive = false;
boolean teslaIsOn = false;
boolean bubbleOut = false;

//location variables for use in activatable buttons
float exhaustButtonCorner1X = 150;
float exhaustButtonCorner1Y = 130;
float exhaustButtonCorner2X = 160;
float exhaustButtonCorner2Y = 140;
float doorButtonCorner1X = 150;
float doorButtonCorner1Y = 160;
float doorButtonCorner2X = 160;
float doorButtonCorner2Y = 170;
float teslaLeverCorner1X = 120;
float teslaLeverCorner1Y = 130;
float teslaLeverCorner2X = 140;
float teslaLeverCorner2Y = 170;
float teslaLeverY = 12.5;
float activationLeverCorner1X = 100;
float activationLeverCorner1Y = 130;
float activationLeverCorner2X = 110;
float activationLeverCorner2Y = 170;
float activationLeverOrientationY = -20;


void setup() {
  size(400, 400);

  //define bolts random start positions
  teslaBolt1X = random(165, 265);
  teslaBolt2X = random(165, 265);
  teslaBolt1Y = random(25, 105);
  teslaBolt2Y = random(25, 105);
  teslaBoltVariance1X = random(-5, 5);
  teslaBoltVariance2X = random(-5, 5);
  teslaBoltVariance1Y = random(-5, 5);
  teslaBoltVariance2Y = random(-5, 5);
}

void draw() {
  background(30, 23, 18);
  drawMachine();
  machineActivate();  
  teslaLever();
  exhaustButton();
  doorButton();
}



void drawMachine() {
  //remove stroke
  noStroke();
  // define colour for Exhaust pipes
  fill(125, 114, 92);
  // draw Exhaust pipes
  quad(300, 240, 280, 220, 310, 160, 340, 160);
  quad(250, 220, 260, 220, 260, 200, 250, 190);
  //define colour for exaust opening
  fill(110, 102, 80);
  //draw exhaust opening
  quad(340, 160, 310, 160, 300, 140, 360, 120);  
  //define colour for main machine body
  fill(86, 107, 135);
  //define Shapes for main body
  rectMode(CORNERS);
  rect(100, 220, 200, 320);
  rect(220, 220, 300, 320);
  rect(80, 120, 180, 180);
  rect(100, 320, 300, 400);
  triangle(100, 320, 20, 400, 100, 400);
  triangle(300, 320, 300, 400, 380, 400);
  //define colour for tesla coil rod and control panel stands
  fill(158, 171, 189);
  //draw tesla coil rod
  rect(210, 90, 220, 320);
  //draw control panel stands
  rect(100, 180, 105, 220);
  rect(115, 180, 120, 220);
  rect(140, 180, 145, 220);
  rect(155, 180, 160, 220);
  quad(165, 220, 170, 220, 180, 180, 175, 180);
  quad(100, 230, 100, 240, 80, 180, 85, 180);
  //define Tesla coil colour 1
  fill(174, 164, 143);
  //draw tesla coil part 1
  ellipseMode(CORNERS);
  ellipse(170, 70, 260, 100);
  ellipse(170, 30, 260, 60);
  // define Tesla coil colour 2
  fill(194, 183, 163);
  //draw tesla coil part 2  
  ellipse(160, 50, 270, 80);
  //define coil pattern colour
  fill(145, 124, 112);
  //draw coil pattern using simple loop
  for (int n = 110; n<210; n+=20) {
    ellipse(200, n, 230, n+10);
  }


  //////Draw Opening Door////////  

  //define shadow colour
  fill(46, 57, 65);
  //draw door shadow
  rect(100, 240, 120, 260);
  //draw open door if door open boolean is true
  if (doorOpen == true) {
    fill( 106, 127, 155);
    rect(doorCorner1X, 240, doorCorner2X, 260);
  }
  //define claw spring colour
  fill(131, 123, 94);
  //draw Claw spring
  quad(clawSpring1X, 250, clawSpring1X-2, 250, clawSpring1X-((clawSpring1X-clawSpring2X)/4)-2, 240, clawSpring1X-((clawSpring1X-clawSpring2X)/4), 240);
  quad(clawSpring1X, 250, clawSpring1X-2, 250, clawSpring1X-((clawSpring1X-clawSpring2X)/4)-2, 260, clawSpring1X-((clawSpring1X-clawSpring2X)/4), 260);
  quad(clawSpring1X-((clawSpring1X-clawSpring2X)/4), 240, clawSpring1X-((clawSpring1X-clawSpring2X)/4)-2, 240, clawSpring1X-((clawSpring1X-clawSpring2X)/2)-2, 250, clawSpring1X-((clawSpring1X-clawSpring2X)/2), 250);
  quad(clawSpring1X-((clawSpring1X-clawSpring2X)/4), 260, clawSpring1X-((clawSpring1X-clawSpring2X)/4)-2, 260, clawSpring1X-((clawSpring1X-clawSpring2X)/2)-2, 250, clawSpring1X-((clawSpring1X-clawSpring2X)/2), 250);
  quad(clawSpring1X-((clawSpring1X-clawSpring2X)/2)-2, 250, clawSpring1X-((clawSpring1X-clawSpring2X)/2), 250, (clawSpring1X-((clawSpring1X-clawSpring2X)/2)-((clawSpring1X-clawSpring2X)/4)), 240, (clawSpring1X-((clawSpring1X-clawSpring2X)/2)-((clawSpring1X-clawSpring2X)/4))-2, 240);
  quad(clawSpring1X-((clawSpring1X-clawSpring2X)/2)-2, 250, clawSpring1X-((clawSpring1X-clawSpring2X)/2), 250, (clawSpring1X-((clawSpring1X-clawSpring2X)/2)-((clawSpring1X-clawSpring2X)/4)), 260, (clawSpring1X-((clawSpring1X-clawSpring2X)/2)-((clawSpring1X-clawSpring2X)/4))-2, 260);
  quad((clawSpring1X-((clawSpring1X-clawSpring2X)/2)-((clawSpring1X-clawSpring2X)/4)), 240, (clawSpring1X-((clawSpring1X-clawSpring2X)/2)-((clawSpring1X-clawSpring2X)/4))-2, 240, clawSpring2X-2, 250, clawSpring2X, 250);
  quad((clawSpring1X-((clawSpring1X-clawSpring2X)/2)-((clawSpring1X-clawSpring2X)/4)), 260, (clawSpring1X-((clawSpring1X-clawSpring2X)/2)-((clawSpring1X-clawSpring2X)/4))-2, 260, clawSpring2X-2, 250, clawSpring2X, 250);
  //define claw colour
  fill(192, 208, 229);  
  //keep clawBlade linked to spring
  clawBladeX = clawSpring2X-15;
  //draw claw
  triangle(clawBladeX, clawBlade1Y, clawBladeX+10, 260, clawSpring2X, 250);
  triangle(clawBladeX, clawBlade2Y, clawBladeX+10, 240, clawSpring2X, 250);
  //draw closed door if doorOpen boolean is false
  if (doorOpen == false) {
    fill( 106, 127, 155);
    rect(doorCorner1X, 240, doorCorner2X, 260);
  }


  //////Draw Lightbulb////////



  // define colour for lightbulb connection
  fill(100);
  //drawlightbulb conection
  rect(100, 110, 110, 120);
  //define filament stroke
  stroke(filamentR, filamentG, 0);
  strokeWeight(2);
  //draw filaments
  line(105, 100, 105, 110);
  line(105, 100, 95, 100);
  line(95, 100, 95, 90);
  line(95, 90, 102, 90);
  line(102, 90, 102, 95);
  line(102, 95, 107, 95);
  line(107, 95, 107, 90);
  line(115, 90, 107, 90);
  line(115, 90, 115, 95);
  //define bulb colour
  noStroke();
  fill(255, 200, bulbB, 120);
  //draw bulb
  ellipse(85, 75, 125, 115);

  /////Draw Controls///////

  //define colour for the activation Lever base
  fill(72, 87, 105);
  //define stroke for the activation Lever base
  stroke(165, 0, 0);
  strokeWeight(1);
  //draw activation Lever base
  rect(activationLeverCorner1X, activationLeverCorner1Y, activationLeverCorner2X, activationLeverCorner2Y);
  //define stroke for lever
  stroke(163, 176, 194);
  strokeWeight(2);
  //draw activation lever
  line(105, 150+activationLeverOrientationY, 105, 150+(activationLeverOrientationY/2));
  line(101, 150+(activationLeverOrientationY/2), 109, 150+(activationLeverOrientationY/2));
  line(101, 150+(activationLeverOrientationY/2), 101, 150);
  line(109, 150+(activationLeverOrientationY/2), 109, 150);

  //define colour for Tesla Lever Base
  fill(72, 87, 105);
  //define stroke for Tesla Lever Base
  strokeWeight(1);
  stroke(165, 165, 0);
  //draw Lever Base
  rect(teslaLeverCorner1X, teslaLeverCorner1Y, teslaLeverCorner2X, teslaLeverCorner2Y);
  //define lever track colour
  noStroke();
  fill(42, 57, 75);
  //draw tesla lever track
  rect(128, 135, 132, 165);
  // define tesla Lever Colour
  fill(0, 0, 165);
  //draw tesla Lever
  rect(121, 147.5+teslaLeverY, 139, 147.5+(teslaLeverY+5));
  //define Exhaust button colour
  fill(165, 0, 165);
  // define button stroke
  stroke(50);
  strokeWeight(1);
  //draw Exhaust button
  rect(exhaustButtonCorner1X, exhaustButtonCorner1Y, exhaustButtonCorner2X, exhaustButtonCorner2Y);
  //define door button colour
  fill(0, 165, 0);
  //draw door button
  rect(doorButtonCorner1X, doorButtonCorner1Y, doorButtonCorner2X, doorButtonCorner2Y);
}

void machineActivate() {
//debug tool
  println("machineActive = " + machineActive);
//check mouse is pressing the activation lever
  if (mousePressed) {
    if (mouseX >= activationLeverCorner1X && mouseX<=activationLeverCorner2X) {
      if (mouseY >= activationLeverCorner1Y && mouseY<=activationLeverCorner2Y) {
        //if the machine is off do inside
        if (machineActive == false) {
          
          //prevent rapid reading
            if (millis()>startTimeLever+100) {
              //turn on bulb by changing colour variables
            bulbB = 0;
            filamentR=255;
            filamentG=150;
            //flip lever down for on
            activationLeverOrientationY=20;
            //reset timer to keep track of next button press
              resetTimerLever();
              //store machine state
              machineActive = true;
            }
          
        } else {
           //prevent rapid reading
            if (millis()>startTimeLever+100) {
              //turn off bulb by manipulating colour
            bulbB=120;
            filamentR=0;
            filamentG=0;
            //flip lever up for off
            activationLeverOrientationY=-20;
           //reset timer to keep track of next button press
              resetTimerLever();
              //store machine state
              machineActive = false;
            }
          }
        }
      } else {
      }
    }
  
}

void teslaLever() {
//debug tool
  println("teslaLeverY = " + teslaLeverY+" teslaIsOn = " + teslaIsOn);
  //check mouse is over tesla Lever

  if (mousePressed) {
    if (mouseX >= teslaLeverCorner1X && mouseX <= teslaLeverCorner2X) {
      if (mouseY >= teslaLeverCorner1Y && mouseY <= teslaLeverCorner2Y) {
        if (teslaIsOn == false) {
          //prevent rapid reading
          if (millis()>startTimeLever+100) {
            //reorient Lever
            teslaLeverY = -12.5;
            
 //reset timer for preventing rapid read
            resetTimerLever();
            //store Tesla State
            teslaIsOn = true;
          }
        } else if (teslaIsOn) {
          //prevent rapid reading
         if (millis()>startTimeLever+100) {
            //reorient Lever
            teslaLeverY = 12.5;
            
 //reset timer for preventing rapid read
             resetTimerLever();
             //store tesla State
            teslaIsOn = false;
          }
        }
      }
    }
  }
  //only run code if both machine and tesla are on
  if (machineActive) {
    if (teslaIsOn) {

      fill(200, 140, 255, random(50, 150));
      noStroke();

      //draw tesla coil part 1
      ellipseMode(CORNERS);
      ellipse(160, 30, 270, 100);


      //draw coil pattern using simple loop
      for (int n = 110; n<210; n+=20) {
        ellipse(200, n, 230, n+10);
      }

      if (millis()>startTimeBolt+200) {
        //every 200 millis vary the position of the bolts
        teslaBolt1X = random(165, 265);
        teslaBolt2X = random(165, 265);
        teslaBolt1Y = random(25, 105);
        teslaBolt2Y = random(25, 105);
        resetTimerBolt();
      }
      //keep the center of the bolts moving
      teslaBoltVariance1X = random(-15, 15);
      teslaBoltVariance2X = random(-15, 15);
      teslaBoltVariance1Y = random(-15, 15);
      teslaBoltVariance2Y = random(-15, 15);

      //define bolt colour
      stroke(240, 220, 255);
      strokeWeight(2);

      //draw bolt
      line(teslaBolt1X, teslaBolt1Y, ((teslaBolt1X+((teslaBolt2X-teslaBolt1X)/2))+teslaBoltVariance1X), ((teslaBolt1Y+((teslaBolt2Y-teslaBolt1Y)/2))+teslaBoltVariance1Y));
      line(teslaBolt2X, teslaBolt2Y, ((teslaBolt2X-((teslaBolt2X-teslaBolt1X)/2))+teslaBoltVariance2X), ((teslaBolt2Y-((teslaBolt2Y-teslaBolt1Y)/2))+teslaBoltVariance2Y));
      line(((teslaBolt1X+((teslaBolt2X-teslaBolt1X)/2))+teslaBoltVariance1X), ((teslaBolt1Y+((teslaBolt2Y-teslaBolt1Y)/2))+teslaBoltVariance1Y), ((teslaBolt2X-((teslaBolt2X-teslaBolt1X)/2))+teslaBoltVariance2X), ((teslaBolt2Y-((teslaBolt2Y-teslaBolt1Y)/2))+teslaBoltVariance2Y));
    }
  }
}


void exhaustButton() {
  //make sure to only work when the machine lever is up
  if (machineActive) {
    //create variable for pseudo gravity
    float bubbleMovementChange1Y = random(0,0.2);
    float bubbleMovementChange2Y = random(0,0.2);
    float bubbleMovementChange3Y = random(0,0.2);
    float bubbleMovementChange4Y = random(0,0.2);

    //bubble X movement defined
    if (bubbleOut) {
      
      if (bubble1X>20) {
        bubble1X-=random(5);
      }
      
      if (bubble1X>70) {
        bubble2X-=random(5);
      }
      
      if (bubble1X>230) {
       bubble3X-=random(5);
      }
     
      if (bubble1X>150) {
         bubble4X-=random(5);
      }
//define bubble y movement
      bubble1Y+=bubbleMovement1Y;
      bubble2Y+=bubbleMovement2Y;
      bubble3Y+=bubbleMovement3Y;
      bubble4Y+=bubbleMovement4Y;
//pseudo gravity effect
      bubbleMovement1Y+=bubbleMovementChange1Y;
      bubbleMovement2Y+=bubbleMovementChange2Y;
      bubbleMovement3Y+=bubbleMovementChange3Y;
      bubbleMovement4Y+=bubbleMovementChange4Y;
//create warping colour
      fill(random(100,255), random(100,255), random(100,255), 150);
      noStroke();
      //draw bubbles
      ellipseMode(CENTER);
      ellipse(bubble1X, bubble1Y, 50, 50);
      ellipse(bubble2X, bubble2Y, 50, 50);
      ellipse(bubble3X, bubble3Y, 50, 50);
      ellipse(bubble4X, bubble4Y, 50, 50);
      if (millis()>startTimeBubble+5000) {
        resetTimerBubble();
        bubbleOut = false;
      }
    }
    if (mousePressed) {
      if (mouseX >= exhaustButtonCorner1X && mouseX<=exhaustButtonCorner2X) {
        if (mouseY >= exhaustButtonCorner1Y && mouseY<=exhaustButtonCorner2Y) {  
          if (bubbleOut==false) {
            resetTimerBubble();
            bubbleOut = true;
            bubbleMovementChange1Y = random(5);
            bubbleMovementChange2Y = random(5);
            bubbleMovementChange3Y = random(5);
            bubbleMovementChange4Y = random(5);
            bubbleMovement1Y = random(-10, 0);
            bubbleMovement2Y = random(-10, 0);
            bubbleMovement3Y = random(-10, 0);
            bubbleMovement4Y = random(-10, 0);
            bubble1Y = random(70, 110);
            bubble1X = random(310, 350);
            bubble2Y = random(70, 110);
            bubble2X = random(310, 350);
            bubble3Y = random(70, 110);
            bubble3X = random(310, 350);
            bubble4Y = random(70, 110);
            bubble4X = random(310, 350);
          }
        }
      }
    }
  }
}

void doorButton() {
  float clawSpringMovement = -1;
  
  if (machineActive) {
    if (doorOpen) {
      doorCorner2X = 80;
      if(millis()<startTimeClaw+3000){
      if (clawSpring2X>70) {
        clawSpring2X +=clawSpringMovement;
      }
      }


      if (millis()>startTimeClaw+3000) {
         
        
        if (clawSpring2X<115){
         clawSpring2X-=(clawSpringMovement)*2; 
        }
        if(millis()>startTimeClaw+3500){
          resetTimerClaw();
          doorOpen = false;
        doorCorner2X = 120;
        clawSpring2X = 115;
        }
      }
    }  


    if (mousePressed) {
      if (mouseX >= doorButtonCorner1X && mouseX<=doorButtonCorner2X) {
        if (mouseY >= doorButtonCorner1Y && mouseY<=doorButtonCorner2Y) {  
          if (doorOpen == false) {
              doorOpen = true;
              resetTimerClaw();
          }
        }
      }
    }
  }
}



void resetTimerBubble() {
  startTimeBubble = millis();
}

void resetTimerLever() {
  startTimeLever = millis();
}

void resetTimerClaw() {
  startTimeClaw = millis();
}
void resetTimerBolt() {
  startTimeBolt = millis();
}