Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/*
  Vending Machine
  Rowan Allcorn
  18/09/2017
  
  Interaction:
  Moving the mouse left and right moves you left and right respectively in the hall
  Moving the mouse up and down effects where the flies above the garbage are 
    and whether it's day or night outside (visible through the window)
  Clicking the left mouse button makes a can drop in the vending machine
*/


void setup() {
  size(400, 400); 
  rectMode(CORNERS);
  ellipseMode(CORNERS);
  noStroke();
}

void draw() {
  //base framerate  
  frameRate(60);  
  
  //wall
  background(108, 136, 156);
  
  //roof
  noStroke();
  fill(160);
  rect(0, 0, 400, 10);
  fill(130);
  rect(0, 10, 400, 15);
  fill(100);
  rect(0, 15, 400, 20);

  //floor
  noStroke();
  fill(100);
  rect(0, 320, 400, 340);
  fill(130);
  rect(0, 340, 400, 360);
  fill(160);
  rect(0, 360, 400, 380);
  fill(190);
  rect(0, 380, 400, 400);
  fill(255, 70+sin(millis()/200)*15);
  rect(mouseX+-80, 345, mouseX+80, 370);
  rect(mouseX+-100, 345, mouseX+100, 390);
  
  //window
  fill(100, 90, 255-mouseY/3);
  rect(mouseX+180, 100, mouseX+310, 210);
  
  //sun
  fill(255, 255-mouseY/3, 0);
  ellipse(mouseX+275, 125+sin(millis()/200)*1.3, mouseX+285, 115+sin(millis()/200)*1.3);
  
  //tree
  fill(100-mouseY/3, 200-mouseY/4, 0);
  rect(mouseX+170, 220, mouseX+230+sin(millis()/200)*1.3, 130, 30+sin(millis()/300)*10);
  rect(mouseX+220, 150, mouseX+250+sin(millis()/200)*1.3, 220, 20+sin(millis()/300)*10);
  rect(mouseX+290+sin(millis()/200)*1.3, 220, mouseX+315, 140, 20+sin(millis()/300)*10);
  
  //personinwindow
  fill(240-mouseY/1.5, 240-mouseY/1.5, 240-mouseY/1.5);
  ellipse(mouseX+220, 190+sin(millis()/200)*1.3, mouseX+260, 220);
  ellipse(mouseX+200, 205, mouseX+220, 220);
  ellipse(mouseX+260, 205, mouseX+280, 220);
  fill(0+mouseY/1.5, 0+mouseY/1.5, 0+mouseY/1.5);
  ellipse(mouseX+225, 200+sin(millis()/200)*1.3, mouseX+230, 205+sin(millis()/200)*1.3);
  ellipse(mouseX+250, 200+sin(millis()/200)*1.3, mouseX+255, 205+sin(millis()/200)*1.3);
  
  //windowframe
  fill(255);
  rect(mouseX+170, 90, mouseX+320, 100);
  rect(mouseX+170, 90, mouseX+180, 220);
  rect(mouseX+180, 220, mouseX+320, 210);
  rect(mouseX+320, 210, mouseX+310, 100);

  //water fountain
  fill(255);
  rect(mouseX+340, 220, mouseX+410, 255);
  fill(180);
  rect(mouseX+345, 220, mouseX+350, 210);
  rect(mouseX+350, 220, mouseX+352, 215);
  rect(mouseX+380, 255, mouseX+390, 270);
  fill(150, 190, 255);
  rect(mouseX+370, 220, mouseX+375, 235+sin(millis()/200)*1.3);
  rect(mouseX+380, 220, mouseX+385, 227+sin(millis()/200)*1.3);
  rect(mouseX+350, 330, mouseX+390, 345, 50);
  rect(mouseX+380, 340, mouseX+400, 350, 50);

  //poster
  fill(255);
  rect(mouseX+-115, 95, mouseX+-195, 200);
  fill(255, 150, 150);
  rect(mouseX+-125, 105, mouseX+-185, 190);
  fill(255);
  ellipse(mouseX+-145, 130, mouseX+-165, 150);
  rect(mouseX+-135, 175, mouseX+-175, 155, 50);
  rect(mouseX+-130, 110, mouseX+-180, 112);
  rect(mouseX+-140, 114, mouseX+-170, 116);
  rect(mouseX+-130, 185, mouseX+-180, 183);

  //vending machine
  fill(255, 60, 60);
  rect(mouseX+-80, 80, mouseX+80, 330);
  
  //drawer
  fill(150, 10, 10);
  rect(mouseX+-60, 330, mouseX+-40, 340);
  rect(mouseX+40, 330, mouseX+60, 340);
  rect(mouseX+-60, 285, mouseX+40, 310);
  stroke(255, 60, 60);
  rect(mouseX+-55, 290, mouseX+35, 305);
  
  //light
  noStroke();
  fill(255, 40+sin(millis()/200)*15);
  rect(mouseX+-100, 60, mouseX+100, 300);
  rect(mouseX+-90, 70, mouseX+90, 280);  

  //number pads
  fill(100);
  stroke(0);
  rect(mouseX+50, 120, mouseX+70, 140);
  fill(0);
  rect(mouseX+50, 132, mouseX+70, 130);
  line(mouseX+50, 134, mouseX+70, 134);
  line(mouseX+50, 136, mouseX+70, 136);
  rect(mouseX+50, 150, mouseX+70, 155);
  rect(mouseX+50, 160, mouseX+70, 165);
  rect(mouseX+50, 170, mouseX+70, 175);
  rect(mouseX+50, 180, mouseX+70, 185);
  fill(50);
  rect(mouseX+50, 195, mouseX+70, 230); 
  fill(150);
  rect(mouseX+52, 198, mouseX+68, 205);
  fill(150, 90, 90);
  rect(mouseX+52, 210, mouseX+68, 225);

  //inside
  noStroke();
  fill(255);
  rect(mouseX+-60, 100, mouseX+40, 270);
  fill(120);
  rect(mouseX+-55, 105, mouseX+35, 260);
  fill(190);
  rect(mouseX+-50, 250, mouseX+30, 246);
  rect(mouseX+-50, 211, mouseX+30, 215);
  rect(mouseX+-50, 176, mouseX+30, 180);
  rect(mouseX+-50, 141, mouseX+30, 145);
  fill(150);
  rect(mouseX+-52, 255, mouseX+32, 260);

  //bottles
  //shelfone
  stroke(255, 255, 0);
  fill(240, 210, 0);
  rect(mouseX+-45, 120, mouseX+-35, 140);  
  rect(mouseX+-30, 120, mouseX+-20, 140);
  rect(mouseX+15, 120, mouseX+25, 140);
  stroke(255, 0, 0);
  fill(200, 0, 0);
  rect(mouseX+-15, 120, mouseX+-5, 140);
  rect(mouseX+0, 120, mouseX+10, 140);
  fill(255, 125, 0);
  stroke(255, 125, 0);
  rect(mouseX+-45, 125, mouseX+-35, 135); 
  rect(mouseX+-30, 125, mouseX+-20, 135);
  rect(mouseX+15, 125, mouseX+25, 135);
  fill(255, 0, 0);
  stroke(255, 0, 0);
  rect(mouseX+-15, 125, mouseX+-5, 135);
  rect(mouseX+0, 125, mouseX+10, 135);

  //shelftwo
  stroke(0, 255, 255);
  fill(0, 240, 40);
  rect(mouseX+-45, 155, mouseX+-35, 175);  
  rect(mouseX+-30, 155, mouseX+-20, 175);
  fill(150, 150, 255);
  stroke(150, 150, 255);
  rect(mouseX+-15, 155, mouseX+-5, 175);
  rect(mouseX+0, 155, mouseX+10, 175);
  rect(mouseX+15, 155, mouseX+25, 175);
  fill(0, 200, 0);
  stroke(0, 200, 0);
  rect(mouseX+-45, 160, mouseX+-35, 170); 
  rect(mouseX+-30, 160, mouseX+-20, 170);
  stroke(100, 100, 250);
  fill(100, 100, 250);
  rect(mouseX+-15, 160, mouseX+-5, 170);
  rect(mouseX+0, 160, mouseX+10, 170);
  rect(mouseX+15, 160, mouseX+25, 170);

  //shelfthree
  stroke(255, 0, 255);
  fill(255, 0, 255);
  rect(mouseX+-30, 190, mouseX+-20, 210);
  rect(mouseX+0, 190, mouseX+10, 210);
  stroke(255, 0, 0);
  fill(255, 0, 0);
  rect(mouseX+-45, 190, mouseX+-35, 210);  
  rect(mouseX+-15, 190, mouseX+-5, 210);
  rect(mouseX+15, 190, mouseX+25, 210);
  fill(190, 0, 190);
  stroke(190, 0, 190);
  rect(mouseX+-30, 195, mouseX+-20, 205);
  rect(mouseX+0, 195, mouseX+10, 205);
  fill(200, 0, 0);
  stroke(200, 0, 0);
  rect(mouseX+-15, 195, mouseX+-5, 205);
  rect(mouseX+15, 195, mouseX+25, 205);  
  rect(mouseX+-45, 195, mouseX+-35, 205); 

  //shelffour
  stroke(0, 255, 0);
  fill(0, 240, 0);
  rect(mouseX+-45, 225, mouseX+-35, 245);  
  rect(mouseX+15, 225, mouseX+25, 245);
  stroke(255, 255, 0);
  fill(240, 210, 0);
  rect(mouseX+-15, 225, mouseX+-5, 245);
  rect(mouseX+0, 225, mouseX+10, 245);
  rect(mouseX+-30, 225, mouseX+-20, 245);
  fill(0, 200, 0);
  stroke(0, 200, 0);
  rect(mouseX+-45, 230, mouseX+-35, 240); 
  rect(mouseX+15, 230, mouseX+25, 240);
  fill(255, 125, 0);
  stroke(255, 125, 0);
  rect(mouseX+-15, 230, mouseX+-5, 240);
  rect(mouseX+0, 230, mouseX+10, 240);
  rect(mouseX+-30, 230, mouseX+-20, 240);

  //grate
  noStroke();
  fill(50);
  rect(mouseX+-210, 290, mouseX+-170, 310);

  //tree inside
  fill(86, 60, 31);
  rect(mouseX+-400, 300, mouseX+-387, 150);
  fill(100, 200, 0);
  rect(mouseX+-430, 80, mouseX+-360, 170, 40+sin(millis()/300)*10);
  rect(mouseX+-430, 140, mouseX+-350, 170, 20+sin(millis()/300)*7);
  fill(176, 90, 81);
  rect(mouseX+-430, 300, mouseX+-370, 335);

  //garbage can
  noStroke();
  fill(0);
  rect(mouseX+-280, 170+sin(millis()/200)*1.3, mouseX+-300, 200+sin(millis()/200)*1.3);
  ellipse(mouseX+-245, 180+sin(millis()/200)*1.3, mouseX+-335, 270);
  fill(50);
  rect(mouseX+-240, 345, mouseX+-340, 230);
  fill(30);
  rect(mouseX+-230, 220, mouseX+-350, 230);
  
  //flys
  ellipse(mouseX+-280, 140+sin(millis()/200)*1.3-mouseY/9, mouseX+-284, 144+sin(millis()/200)*1.3-mouseY/9);
  ellipse(mouseX+-310, 130+cos(millis()/200)*1.3-mouseY/11, mouseX+-314, 134+cos(millis()/200)*1.3-mouseY/11);
  ellipse(mouseX+-240, 150+sin(millis()/200)*1.3+mouseY/11, mouseX+-244, 154+sin(millis()/200)*1.3+mouseY/11);
  ellipse(mouseX+-340, 170+sin(millis()/200)*1.3-mouseY/13, mouseX+-344, 174+sin(millis()/200)*1.3-mouseY/13);
  ellipse(mouseX+-290, 120+sin(millis()/200)*1.3+mouseY/15, mouseX+-294, 124+sin(millis()/200)*1.3+mouseY/15);
  ellipse(mouseX+-220, 180+cos(millis()/200)*1.3-mouseY/9, mouseX+-224, 184+cos(millis()/200)*1.3-mouseY/9);
}
void mousePressed() {
  //open drawer
  frameRate(2);
  fill(0);
  rect(mouseX+-60, 285, mouseX+40, 310);
  
  //suprised face
  //noStroke();
  //fill(0+mouseY/1.5, 0+mouseY/1.5, 0+mouseY/1.5);
  //ellipse(mouseX+237, 202+sin(millis()/200)*1.3, mouseX+243, 207+sin(millis()/200)*1.3);
  
  //soda can dissapears
  stroke(120);
  fill(120);
  rect(mouseX+0, 155, mouseX+10, 175);
  
  //can drops
  noStroke();
  fill(150, 150, 255);
  rect(mouseX+9, 295, mouseX+20, 309);
  fill(100, 100, 250);
  rect(mouseX+9, 300, mouseX+20, 309);
}