Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/*
Robot Interactive Design
 Author: Jonathon Klassen
 Date: September 18, 2015
 */
int blink=0; //blinking randomizer
int r=0; //redness value
int w=200; //robot's main colour
float aY=170; //antenna Y coordinate
boolean deploy=false; //whether antenna is deployed
boolean heatUp=false; //whether robot is heating up
void setup() {
  size(500, 500);
  frameRate(10);
  rectMode(CENTER);
}

void draw() {
  drawBackground(); //function which draws background
  stroke(r, r/2, 0);
  drawBody(); //function which draws the body
  blinking(); //function which handles blinking
  mouth(); //function which handles opening/closing mouth
  antenna(); //function which handles the antenna
  overheat(); //function which handles the overheating aesthetic
  openClose(); //function which handles opening/closing the body door
}

void drawBackground() {
  background(120); //background
  fill(80);
  stroke(0);
  rect(250, 460, 500, 100); //draw the ground
  for (int i=1; i<8; i++) {
    ellipse(70*i-25, 370, 20, 20); //draw background bolts
  }
}

void drawBody() {
  fill(w); //robot colour
  strokeWeight(6);
  rect(175, 360, 25, 90, 20); //draw arms
  rect(275, 360, 25, 90, 20);
  for (int i=0; i<3; i++) { //repeats the lines along the arms
    line(162.5, 330+i*20, 287, 330+i*20); //lines on arms
  }
  ellipse(175, 405, 30, 30); //draw hands
  ellipse(275, 405, 30, 30); 
  rect(225, 380, 90, 170, 10); //draw body
  rect(225, aY, 10, 100); //draw antenna
  fill(0, 131, 180);
  ellipse(225, aY-35, 30, 10);
  fill(w);
  rect(225, 200, 200, 200, 50); //draw head
  rect(225, 380, 60, 80, 10); //draw body door
  ellipse(180, 450, 50, 50); //draw feet
  ellipse(270, 450, 50, 50);
  strokeWeight(4);
  fill(w-140);
  ellipse(205, 380, 10, 10); //draw door knob
  for (int i=0; i<5; i++) { //for loop which draws the eyes/ gradient
    stroke(r, 0, 0, 255-i*50);
    fill(255);
    ellipse(150, 200, 100-i*8, 100-i*8); //draw eyes
    ellipse(300, 200, 100-i*8, 100-i*8);
    textSize(20);
    fill(w-90);
    text("ARCHOS", 185, 140); //add name text
  }

  fill(w);
}

void blinking() {
  if (blink == 0) { //if the blink randomizer is 0
    ellipse (150, 200, 100, 100); //draw closed eyes over the eyes
    ellipse (300, 200, 100, 100);
    line (100, 200, 200, 200);
    line (250, 200, 350, 200);
    blink =int(random(0, 20)); //after which randomize the blink variable
  } else {
    blink = int(random(0, 20)); //if inequal to 0, keep randomizing the blink
  }
}

void mouth() {
  stroke(r, r/2, 0);
  //if the mouth is clicked
  if (mousePressed && mouseX >=200 && mouseX <=250 && mouseY >=260 && mouseY <=280) {
    fill(0);
    rect(225, 270, 45, 15); //draw the mouth open
    textSize(20);
    fill(5, 134, 10);
    text("Feed me Seymour!", 310, 400); //print referential text
  } else {
    line(202.5, 270, 247.5, 270); //draw the mouth closed
  }
  //if the body door is clicked
  if (mousePressed && mouseX >=195 && mouseX <= 255 && mouseY >=340 && mouseY <=420) {
    line(202.5, 270, 182.5, 260); //draw the mouth smiling
    line(247.5, 270, 267.5, 260);
  }
}

void antenna() {
  fill(0, 131, 180);
  ellipse(210, 320, 10, 10); //draw antenna button
  //if the antenna button is clicked
  if (mousePressed && mouseX >=200 && mouseX <=220 && mouseY >=310 && mouseY <=330) {
    deploy = !deploy; //deploy or retract antenna
  }
  //if the antenna should deploy and isn't at max. length
  if (deploy == true && aY >=100) {
    aY-=3; //extend the antenna
    //if the antenna should retract and isn't at min. length
  } else if (deploy == false && aY <=170) {
    aY+=3; //retract the antenna
  }
  //if the antenna is fully deployed
  if (aY <=100) {
    //for loop which draws antenna waves
    for (int i=0; i<10; i++) {
      noFill();
      stroke(0, 131, 180, 150-i*30);
      ellipse(225, aY-35, 30+i*20, 10+i*20); //draw antenna waves
      textSize(20);
      fill(4, 95, 196);
      text("I wonder how", 10, 60); //print text
      text("much bandwith", 10, 80);
      text("I get...", 10, 100);
      stroke(r, r/2, 0);
    }
  }
}

void overheat() {
  constrain(r, 0, 260); //ensure redness remains within 0 and 260
  constrain(w, 200, 252); //ensure robot colour remains within 200 and 252
  fill(255, 163, 13);
  ellipse(240, 320, 10, 10); //draw overheat button
  //if the overheat button is pressed
  if (mousePressed && mouseX >=230 && mouseX <=250 && mouseY >=310 && mouseY <=330) {
    heatUp = !heatUp; //overheat or cool robot
  }
  if (w >=252) { //if the robot is hot
    textSize(30);
    text("Hot! Hot! Hot!", 290, 70); //print text
  }
  //if the robot should overheat
  if (heatUp == true && r<260 && w<252) {
    //change colours to overheated ones
    r+=10;
    w+=2;
  }
  //if the robot should cool down
  if (heatUp == false && r>0 & w>200) {
    //restore default colours
    r-=10;
    w-=2;
  }
}

void openClose() {
  //if the body door is clicked
  if (mousePressed && mouseX >=195 && mouseX <= 255 && mouseY >=340 && mouseY <=420) {
    fill(w-100);
    rect(225, 380, 60, 80, 10); //draw body cavity space
    fill(w);
    ellipse(260, 380, 10, 10); //draw body door knob open
    rect(255, 380, 10, 80, 10); //draw body door open
    textSize(20);
    fill(193, 8, 8);
    //print ominous text
    text("That's not where I hid the bodies, tee hee.", 40, 30);
  }
}