/*
Introduction to Media Computation -- Interactive Image project
Prof: Nicholas Hesler
Created by: Nathan Arcari
"The Boogy Man"
When the player takes a look at his shadow, all seems okay,
but as soon as he looks away, out comes the monster to play.
The Boogy Man will strike, and when the time is just right,
attempting to strangle his victim with his eyes glowing bright.
*/
void setup() {
size(400, 400);
frameRate(30);
}
void draw() {
//set framerate
frameRate(40);
//set background
background((-mouseY/15)+140, 105, (mouseX/15)+120);
fill((-mouseY/15)+160, 130, (mouseX/15)+150);
rect(0, 287.5, 400, 287.5);
colorMode(RGB, 255, 255, 255, 400);
noStroke();
//shadow trail
fill(100, 0, 100);
quad(227.5, 287.5, 302.5, 287.5, 140, 350, 90, 350);
//draw the man
fill(200, 200, 255);
ellipse(115, 300, 50, 50);
rect(90, 300, 50, 50);
ellipse(115, 250, 50, 50);
//draw the face
fill(255);
quad((mouseX/25)+94, 247, (mouseX/22)+102, 250, (mouseX/23)+105, 257, (mouseX/25)+97, 255);
quad((mouseX/25)+123, 247, (mouseX/23)+112, 250, (mouseX/23)+109, 257, (mouseX/25)+117, 255);
//draw normal shadow
fill(100, 0, 100);
ellipse(265, 137.5, 75, 75);
ellipse(265, 212.5, 75, 75);
rect(227.5, 212.5, 75, 75);
//draw monster shadow
fill(100, 0, 100, abs(400-mouseX));
triangle(152.5, 125, 177.5, 150, 152.5, 100);
triangle(mouseY/80+138, mouseY/40+65, 152.5, 125, 152.5, 100);
triangle(152.5, 150, 177.5, 150, 152.5, 125);
triangle(mouseY/80+138, mouseY/40+102.5, 152.5, 150, 152.5, 125);
triangle(165, 150, 152.5, 150, 165, 162.5);
triangle(165, 150, 177.5, 150, 177.5, 162.5);
quad(mouseY/160+177.5, mouseY/30+40, 165, 62.5, 152.5, 87.5, 171.25, 75);
quad(171.25, 75, 152.5, 87.5, 152.5, 100, 177.5, 87.5);
triangle(177.5, 87.5, 152.5, 100, 177.5, 150);
quad(177.5, 100, 177.5, 137.5, 190, 162.5, 190, 125);
quad(177.5, 100, 177.5, 87.5, 190, 62.5, 215, mouseY/80+45);
triangle(abs(400-mouseY)/80+230, mouseY/40+35, 215, mouseY/80+45, 215, 60);
triangle(215, mouseY/80+45, 177.5, 100, 215, 137.5);
triangle(177.5, 100, 202.5, 150, 202.5, 125);
quad(215, 62.5, 215, 112.5, 252.5, 75, 240, 62.5);
triangle(abs(400-mouseY)/80+265, mouseY/40+52.5, 240, 62.5, 252.5, 75);
triangle(215, 62.5, 240, 62.5, abs(400-mouseY)/80+252.5, mouseY/40+40);
triangle(240, 87.5, 252.5, 75, 265, 87.5);
triangle(abs(400-mouseY)/80+290, mouseY/40+82.5, 265, 87.5, 252.5, 75);
quad(240, 87.5, 265, 87.5, 227.5, 175, 215, 112.5);
quad(265, 87.5, 227.5, 175, 215, 200, 265, 200);
quad(277.5, 125, 265, 185, 302.5, 190, 302.5, 175);
triangle(abs(400-mouseY)/80+315, mouseY/40+190, 302.5, 190, 302.5, 175);
triangle(265, 87.5, 265, 125, 302.5, 125);
triangle(265, 87.5, abs(400-mouseY)/80+315, mouseY/40+115, 302.5, 125);
triangle(277.5, 125, 302.5, 125, 302.5, 175);
triangle(302.5, 125, 302.5, 150, abs(400-mouseY)/80+327.5, mouseY/40+152.5);
triangle(302.5, 150, 302.5, 175, abs(400-mouseY)/80+315, mouseY/40+177.5);
quad(290, 187.5, 283.75, 200, 302.5, 212.5, 302.5, 190);
triangle(abs(400-mouseY)/80+308.75, mouseY/40+205.5, 302.5, 190, 302.5, 205);
triangle(252.5, 200, 202.5, 200, 227.5, 250);
triangle(215, 200, 202.5, 175, 202.5, 200);
triangle(202.5, 200, 190, 187.5, 190, 175);
triangle(202.5, 200, 177.5, 175, 177.5, 200);
triangle(202.5, 225, 177.5, 225, 165, 187.5);
triangle(177.5, 225, 202.5, 237.5, 215, 225);
quad(202.5, 200, 177.5, 200, 202.5, 225, 215, 225);
//draw shadow eye
noStroke();
fill(140, 105, 120, abs(400-mouseX));
triangle(165, 112.5+mouseY/50, 165, 125, 202.5, 87.5);
fill(255, 130, 150, abs(400-mouseX));
ellipse(171, 116, mouseY/50-12, mouseY/50-12);
/*flying particles with random values (plugged in from an RNG on google)
two colours of particles (pinkish and purple) with the opacity set to change according to mouseX with the shadow
the x values are:
"phase shift" +sin(framecount*"horizontal speed")*"horizontal distance range"
the y values are:
abs[<--to reverse the direction]("starting y axis"-((("speed"*abs(400-mouseY)*framecount)/"second speed value")%"distance travelled before looping back to starting y axis")) */
fill(200, 20, 150, abs(400-mouseX)/5.8);
ellipse(100+sin(frameCount*0.07)*20, abs(653-(((3*abs(400-mouseY)*frameCount)/202)%653)), 12, 12);
ellipse(200+sin(frameCount*0.06)*22, abs(759-(((3.5*abs(400-mouseY)*frameCount)/111)%759)), 17, 17);
ellipse(300+sin(frameCount*0.07)*13, abs(571-(((2.8*abs(400-mouseY)*frameCount)/286)%571)), 29, 29);
ellipse(400+sin(frameCount*0.07)*19, abs(710-(((3.1*abs(400-mouseY)*frameCount)/187)%710)), 25, 25);
ellipse(150+sin(frameCount*0.06)*22, abs(699-(((2.4*abs(400-mouseY)*frameCount)/112)%699)), 11, 11);
ellipse(250+sin(frameCount*0.07)*20, abs(523-(((3.1*abs(400-mouseY)*frameCount)/214)%523)), 20, 20);
ellipse(350+sin(frameCount*0.08)*14, abs(491-(((2.9*abs(400-mouseY)*frameCount)/54)%491)), 28, 28);
ellipse(50+sin(frameCount*0.07)*19, abs(622-(((3.4*abs(400-mouseY)*frameCount)/172)%622)), 21, 21);
ellipse(sin(frameCount*0.05)*11, abs(469-(((2.5*abs(400-mouseY)*frameCount)/264)%469)), 24, 24);
//switching the colour slightly
fill(240, 20, 120, abs(400-mouseX)/5.6);
ellipse(125+sin(frameCount*0.06)*18, abs(650-(((3.2*abs(400-mouseY)*frameCount)/106)%650)), 50, 50);
ellipse(225+sin(frameCount*0.06)*15, abs(500-(((3*abs(400-mouseY)*frameCount)/288)%500)), 11, 11);
ellipse(325+sin(frameCount*0.07)*18, abs(755-(((2.7*abs(400-mouseY)*frameCount)/208)%755)), 44, 44);
ellipse(425+sin(frameCount*0.06)*12, abs(535-(((3*abs(400-mouseY)*frameCount)/131)%535)), 32, 32);
ellipse(175+sin(frameCount*0.08)*21, abs(468-(((3.5*abs(400-mouseY)*frameCount)/56)%468)), 10, 10);
ellipse(275+sin(frameCount*0.06)*16, abs(622-(((2.6*abs(400-mouseY)*frameCount)/140)%622)), 38, 38);
ellipse(375+sin(frameCount*0.05)*23, abs(485-(((3.4*abs(400-mouseY)*frameCount)/57)%485)), 43, 43);
ellipse(75+sin(frameCount*0.06)*18, abs(533-(((2.8*abs(400-mouseY)*frameCount)/115)%533)), 18, 18);
ellipse(25+sin(frameCount*0.06)*10, abs(743-(((2.5*abs(400-mouseY)*frameCount)/93)%743)), 21, 21);
//switching the colour slightly
fill(180, 20, 150, abs(400-mouseX)/5.4);
ellipse(112+sin(frameCount*0.05)*20, abs(441-(((2.5*abs(400-mouseY)*frameCount)/174)%441)), 30, 30);
ellipse(212+sin(frameCount*0.07)*22, abs(505-(((2.6*abs(400-mouseY)*frameCount)/157)%505)), 16, 16);
ellipse(312+sin(frameCount*0.09)*13, abs(772-(((3.2*abs(400-mouseY)*frameCount)/283)%772)), 24, 24);
ellipse(412+sin(frameCount*0.04)*19, abs(496-(((2.6*abs(400-mouseY)*frameCount)/62)%496)), 16, 16);
ellipse(162+sin(frameCount*0.06)*22, abs(793-(((3.5*abs(400-mouseY)*frameCount)/186)%793)), 29, 29);
ellipse(262+sin(frameCount*0.09)*20, abs(612-(((3.1*abs(400-mouseY)*frameCount)/284)%612)), 11, 11);
ellipse(362+sin(frameCount*0.05)*14, abs(654-(((2.9*abs(400-mouseY)*frameCount)/109)%654)), 15, 15);
ellipse(62+sin(frameCount*0.10)*19, abs(473-(((2.7*abs(400-mouseY)*frameCount)/232)%473)), 11, 11);
ellipse(12+sin(frameCount*0.04)*11, abs(772-(((3.1*abs(400-mouseY)*frameCount)/264)%772)), 19, 19);
//switching the colour slightly
fill(200, 20, 180, abs(400-mouseX)/5.2);
ellipse(137+sin(frameCount*0.07)*18, abs(482-(((2.9*abs(400-mouseY)*frameCount)/236)%482)), 20, 20);
ellipse(237+sin(frameCount*0.10)*15, abs(636-(((3*abs(400-mouseY)*frameCount)/113)%636)), 27, 27);
ellipse(337+sin(frameCount*0.07)*18, abs(411-(((3.4*abs(400-mouseY)*frameCount)/222)%411)), 28, 28);
ellipse(437+sin(frameCount*0.08)*12, abs(534-(((2.6*abs(400-mouseY)*frameCount)/202)%534)), 25, 25);
ellipse(187+sin(frameCount*0.05)*21, abs(697-(((2.5*abs(400-mouseY)*frameCount)/260)%697)), 31, 31);
ellipse(287+sin(frameCount*0.09)*16, abs(581-(((3.6*abs(400-mouseY)*frameCount)/108)%581)), 20, 20);
ellipse(387+sin(frameCount*0.08)*23, abs(733-(((3*abs(400-mouseY)*frameCount)/185)%733)), 12, 12);
ellipse(87+sin(frameCount*0.09)*18, abs(675-(((2.6*abs(400-mouseY)*frameCount)/138)%675)), 26, 26);
ellipse(37+sin(frameCount*0.05)*10, abs(506-(((2.9*abs(400-mouseY)*frameCount)/300)%506)), 19, 19);
}
//set the mouse click to create tentacles and a glow for the eye. The hair will also raise
void mousePressed() {
//set framerate hack
frameRate(0.9);
//set background with lighter colour to represent a flash of light
background((-mouseY/15)+170, 135, (mouseX/15)+150);
fill((-mouseY/15)+190, 155, (mouseX/15)+170);
rect(0, 287.5, 400, 287.5);
//shadow trail with darker colour
fill(80, 0, 80);
quad(227.5, 287.5, 302.5, 287.5, 140, 350, 90, 350);
//draw normal shadow with darker colour
fill(80, 0, 80);
stroke(80, 0, 80);
ellipse(265, 137.5, 75, 75);
ellipse(265, 212.5, 75, 75);
rect(227.5, 212.5, 75, 75);
/*draw shadow tentacles*/
//first from the left
quad(170, 325, 115, 350, 65, 237.5, 90, 237.5);
quad(90, 237.5, 65, 237.5, 78, 188, 90, 200);
quad(78, 188, 90, 200, 98, 177, 90, 163);
quad(98, 177, 90, 163, 115, 175, 115, 188);
triangle(115, 175, 115, 188, 128, 200);
//second from the left
quad(202, 312, 170, 325, 140, 287.5, 165, 287.5);
quad(140, 287.5, 165, 287.5, 177.5, 250, 152.5, 250);
quad(177.5, 250, 152.5, 250, 127.5, 212.5, 140, 212.5);
triangle(127.5, 212.5, 140, 212.5, 152.5, 187.5);
//third from the left
quad(227.5, 300, 202.5, 312.5, 182, 287.5, 202.5, 287.5);
quad(182, 287, 202.5, 287.5, 215, 262.5, 204, 262.5);
triangle(215, 262.5, 204, 262.5, 200, 250);
//first to the right
quad(290, 288, 290, 256, 328, 235, 340, 238);
quad(328, 235, 340, 238, 347, 194, 340, 200);
triangle(347, 194, 340, 200, 323, 188);
//second to the right
quad(270, 290, 160, 340, 303, 320, 315, 287.5);
quad(303, 320, 315, 287.5, 353, 263, 365, 287.5);
quad(353, 263, 365, 287.5, 390, 238, 365, 238);
quad(390, 238, 365, 238, 365, 188, 379, 190);
quad(365, 188, 379, 190, 390, 150, 378, 157);
quad(390, 150, 378, 157, 353, 125, 353, 112);
quad(353, 125, 353, 112, 328, 138, 340, 138);
triangle(328, 138, 340, 138, 346, 150);
//first bottom tentacle from the right
quad(353, 290, 315, 300, 378, 325, 390, 313);
quad(390, 313, 378, 325, 385, 331, 400, 338);
quad(385, 331, 400, 338, 378, 363, 378, 350);
triangle(378, 363, 378, 350, 353, 350);
//second bottom tentacle from the right
quad(315, 300, 265, 313, 253, 350, 290, 350);
quad(253, 350, 290, 350, 290, 363, 265, 375);
quad(290, 363, 265, 375, 303, 388, 303, 365);
quad(303, 388, 303, 365, 328, 350, 328, 364);
quad(328, 350, 328, 364, 340, 375, 354, 375);
triangle(340, 375, 354, 375, 340, 388);
//third bottom tentacle from the right
quad(215, 313, 153, 325, 203, 350, 240, 350);
quad(203, 350, 240, 350, 193, 390, 178, 375);
quad(193, 390, 178, 375, 115, 375, 103, 388);
quad(115, 375, 103, 388, 66, 365, 78, 363);
triangle(66, 365, 78, 363, 78, 338);
//draw monster shadow with hair up and darker colour
triangle(152.5, 125, 177.5, 150, 152.5, 100);
triangle(mouseY/80+138, mouseY/20+55, 152.5, 125, 152.5, 100);
triangle(152.5, 150, 177.5, 150, 152.5, 125);
triangle(mouseY/80+138, mouseY/20+92.5, 152.5, 150, 152.5, 125);
triangle(165, 150, 152.5, 150, 165, 162.5);
triangle(165, 150, 177.5, 150, 177.5, 162.5);
quad(mouseY/160+177.5, mouseY/15+27, 165, 62.5, 152.5, 87.5, 171.25, 75);
quad(171.25, 75, 152.5, 87.5, 152.5, 100, 177.5, 87.5);
triangle(177.5, 87.5, 152.5, 100, 177.5, 150);
quad(177.5, 100, 177.5, 137.5, 190, 162.5, 190, 125);
quad(177.5, 100, 177.5, 87.5, 190, 62.5, 215, mouseY/40+40);
triangle(abs(400-mouseY)/80+230, mouseY/20+25, 215, mouseY/40+40, 215, 60);
triangle(215, mouseY/40+40, 177.5, 100, 215, 137.5);
triangle(177.5, 100, 202.5, 150, 202.5, 125);
quad(215, 62.5, 215, 112.5, 252.5, 75, 240, 62.5);
triangle(abs(400-mouseY)/80+265, mouseY/20+42.5, 240, 62.5, 252.5, 75);
triangle(215, 62.5, 240, 62.5, abs(400-mouseY)/80+252.5, mouseY/20+30);
triangle(240, 87.5, 252.5, 75, 265, 87.5);
triangle(abs(400-mouseY)/80+290, mouseY/20+72.5, 265, 87.5, 252.5, 75);
quad(240, 87.5, 265, 87.5, 227.5, 175, 215, 112.5);
quad(265, 87.5, 227.5, 175, 215, 200, 265, 200);
quad(277.5, 125, 265, 185, 302.5, 190, 302.5, 175);
triangle(abs(400-mouseY)/80+315, mouseY/20+180, 302.5, 190, 302.5, 175);
triangle(265, 87.5, 265, 125, 302.5, 125);
triangle(265, 87.5, abs(400-mouseY)/80+315, mouseY/20+105, 302.5, 125);
triangle(277.5, 125, 302.5, 125, 302.5, 175);
triangle(302.5, 125, 302.5, 150, abs(400-mouseY)/80+327.5, mouseY/20+142.5);
triangle(302.5, 150, 302.5, 175, abs(400-mouseY)/80+315, mouseY/20+167.5);
quad(290, 187.5, 283.75, 200, 302.5, 212.5, 302.5, 190);
triangle(abs(400-mouseY)/80+308.75, mouseY/20+195.5, 302.5, 190, 302.5, 205);
triangle(252.5, 200, 202.5, 200, 227.5, 250);
triangle(215, 200, 202.5, 175, 202.5, 200);
triangle(202.5, 200, 190, 187.5, 190, 175);
triangle(202.5, 200, 177.5, 175, 177.5, 200);
triangle(202.5, 225, 177.5, 225, 165, 187.5);
triangle(177.5, 225, 202.5, 237.5, 215, 225);
quad(202.5, 200, 177.5, 200, 202.5, 225, 215, 225);
//draw shadow eye
noStroke();
fill(200, 165, 180);
triangle(165, 112.5+mouseY/50, 165, 125, 202.5, 87.5);
fill(255, 130, 150);
ellipse(171, 116, mouseY/70-12, mouseY/70-12);
//draw the man with a lighter colour
fill(210, 210, 255);
ellipse(115, 300, 50, 50);
rect(90, 300, 50, 50);
ellipse(115, 250, 50, 50);
//draw the face
fill(0);
quad((mouseX/40)+94, 250, (mouseX/38)+102, 255, (mouseX/38)+105, 257, (mouseX/40)+97, 253);
quad((mouseX/40)+123, 249, (mouseX/38)+112, 255, (mouseX/38)+109, 257, (mouseX/40)+117, 253);
//eye glowing
fill(255, 35, 0, abs((400-mouseY)+50)/10);
noStroke();
ellipse(171, 116, 15, 15);
ellipse(171, 116, 45, 45);
ellipse(171, 116, 75, 75);
ellipse(171, 116, 110, 110);
ellipse(171, 116, 160, 160);
ellipse(171, 116, 192, 192);
ellipse(171, 116, 230, 230);
ellipse(171, 116, 276, 276);
ellipse(171, 116, 331, 331);
}