/*
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);
}