/* spell at midnight by jessica peng a witch floats around in her laboratory. her potions bubble away. eyes follow wherever she goes. use the mouse to move her up, down, back, and forth, and click to cast the spell! */ void setup() { size(600, 400); noStroke(); noCursor(); smooth(); } void draw() { background(41, 255, 207); ellipseMode(CENTER); //must set frameRate to 60 to prevent the frameRate(5) from void mousePressed from carrying over frameRate(60); //windows - 3 sections, colours change by tying opacity to mouseX fill(0, 80, 80); triangle(600, 0, 600, 200, 400, 0); triangle(0, 0, 0, 200, 300, 0); fill(86, 208, 174, mouseX/3); triangle(400, 0, 600, 200, 400, 200); fill(236, 251, 119, mouseY/3); triangle (300, 0, 200, 200, 0, 200); //floor fill(0, 80, 80, 200); rect(0, 200, 600, 300); //potion bubbles - use trig functions and frameCount to generate bobbing movement fill(11, 175, 200, mouseX/3); ellipse(95, 3*cos(frameCount * 0.05) + 100, 10, 10); ellipse(98, 5*cos(frameCount * 0.01) + 80, 7, 7); ellipse(80, 50*cos(frameCount * 0.01) + 60, 5, 6); ellipse(50, 8*sin(frameCount * 0.01) + 100, 20, 20); ellipse(50, 3*cos(frameCount * 0.01) + 65, 25, 5); ellipse(50, 2*cos(frameCount * 0.01) + 75, 20, 5); ellipse(575, 3*cos(frameCount * 0.01)+ 50, 10, 10); //potion bottles - reduced opacity to emulate glass fill(236, 251, 119, 150); rect(85, 55, 20, 70, 100); rect(525, 100, 10, 60, 10); fill(193, 218, 214, 100); rect(75, 15, 10, 110, 100); fill(183, 175, 163, 150); rect(25, 80, 50, 50, 50); rect(45, 28, 10, 30, 50); rect(560, 40, 30, 30, 10); //blocks - 5th value in rect() to round the corners fill(86, 208, 174); rect(0, 120, 150, 100, 10); fill(52, 221, 221); rect(550, 65, 50, 150, 10); fill(67, 174, 183); rect(500, 155, 40, 60, 10); fill(0, 0, 100, 80); rect(75, 145, 100, 75, 10); fill(150, 194, 97); rect(80, 150, 100, 70, 10); //more potion bottles - in front of blocks ellipse(150, 132, 30, 30); rect(145, 95, 10, 20, 10); rect(505, 135, 20, 20, 10); rect(512, 125, 6, 10, 10); //more bubbles fill(255, 255, 255, mouseX/3); ellipse(150, 20*cos(frameCount * 0.01) + 120, 8, 5); ellipse(530, 3*sin(frameCount * 0.02) + 115, 5, 6); //block shadows - two thin rectangles per block to emulate shadows fill(0, 0, 100, 80); rect(0, 220, 175, 10, 5); rect(0, 230, 165, 10, 5); rect(555, 215, 60, 10, 5); rect(565, 225, 60, 10, 5); rect(505, 215, 40, 10, 5); rect(520, 225, 30, 10, 5); //background eyes //scleras fill(240, 240, 240); ellipse(120, 175, 25, 25); ellipse(70, 200, 28, 28); ellipse(535, 80, 25, 25); //irises - tied to mouseX and mouseY in order to follow movement fill(245, 225, 0); ellipse(mouseX/100 + 120, mouseY/100 + 175, 15, 15); ellipse(mouseX/100 + 70, mouseY/100 + 200, 18, 18); ellipse(mouseX/100 + 530, mouseY/100 + 80, 13, 13); //pupils - same as irises fill(0, 0, 0); ellipse(mouseX/100 + 121, mouseY/100 + 175, 5, 5); ellipse(mouseX/100 + 72, mouseY/100 + 202, 6, 6); ellipse(mouseX/100 + 530, mouseY/100 + 82, 5, 5); //witch's shadow - shrinks and grows depending on mouse movement, follows mouse fill(0, 0, 100, 100); ellipse(mouseX + 50, 370, mouseY/2 + 30, 20); //witch - moves with the mouse fill(0, 0, 60); //head triangle(mouseX + 40, (mouseY - 210)/1.5, mouseX + 60, (mouseY - 170)/1.5, mouseX + 40, (mouseY - 170)/1.5); rect(mouseX, (mouseY - 210)/1.5, 40, 40); //dress triangle(mouseX, mouseY/1.5, mouseX + 100, (mouseY + 50)/1.5, mouseX, (mouseY - 200)/1.5); //hair fill(100, 100, 100, 200); rect(mouseX, (mouseY - 210)/1.5, 40, 80); triangle(mouseX + 40, (mouseY - 210.4)/1.5 + 80, mouseX, (mouseY - 210.4)/1.5 + 80, mouseX + 40, (mouseY - 211)/1.5 + 110); //hat fill(0, 0, 60); triangle(mouseX, (mouseY - 210)/1.5 + 3, mouseX - 40, (mouseY - 210)/1.5 - 80, mouseX + 40, (mouseY - 210)/1.5); stroke(0, 0, 60); strokeWeight(10); line(mouseX - 60, (mouseY - 210)/1.5 + 10, mouseX + 95, (mouseY - 210)/1.5 - 10); //foreground potion bubbles noStroke(); fill(255, 255, 255, mouseX/3); ellipse(60, 10*cos(frameCount * 0.01) + 327, 20, 20); ellipse(145, 5*sin(frameCount * 0.01) + 280, 20, 10); //foreground eyes //scleras fill(240, 240, 240); ellipse(210, 350, 40, 40); ellipse(170, 280, 30, 30); ellipse(570, 390, 50, 50); ellipse(595, 345, 40, 40); //irises fill(245, 225, 0); ellipse(mouseX/100 + 212, mouseY/100 + 340, 19, 15); ellipse(mouseX/100 + 170, mouseY/100 + 275, 18, 16); ellipse(mouseX/100 + 560, mouseY/100 + 380, 20, 20); ellipse(mouseX/100 + 585, mouseY/100 + 340, 15, 15); //pupils fill(0, 0, 0); ellipse(mouseX/100 + 212, mouseY/100 + 338, 7, 4); ellipse(mouseX/100 + 170, mouseY/100 + 273, 5, 5); ellipse(mouseX/100 + 556, mouseY/100 + 378, 8, 8); ellipse(mouseX/100 + 582, mouseY/100 + 338, 6, 6); //foreground potion bottles fill(236, 251, 119, 150); ellipse(60, 327, 50, 50); rect(53, 260, 15, 40, 20); fill(232, 208, 169, 150); rect(120, 270, 50, 30, 10); //foreground blocks fill(20, 85, 85); rect(-10, 350, 125, 50, 10); fill(20, 56, 70); rect(100, 300, 100, 200, 10); //magic lights - 3 ellipses on top of one another, increasing in size, decreasing in transparency fill(255, 255, 255, 80); ellipse(500, 3*sin(frameCount * 0.05) + 200, 70, 70); fill (255, 255, 255, 200); ellipse(500, 3* sin(frameCount * 0.05) + 200, 50, 50); fill(255, 255, 255); ellipse(500, 3* sin(frameCount * 0.05) + 200, 30, 30); //magic light's shadow fill(0, 0, 100, 80); ellipse(500, 370, 3* sin(frameCount * 0.05) + 40, 10); } void mousePressed() { frameRate(5); //set magic light colour change fill(250, 250, 10, 100); ellipse(500, 3*sin(frameCount * 0.05) + 200, 70, 70); fill(250, 250, 220, 200); ellipse(500, 3* sin(frameCount * 0.05) + 200, 50, 50); fill(250, 100, 100, 200); ellipse(500, 3* sin(frameCount * 0.05) + 200, 30, 30); //set eyeball colour change: iris ellipse(mouseX/100 + 120, mouseY/100 + 175, 15, 15); ellipse(mouseX/100 + 70, mouseY/100 + 200, 18, 18); ellipse(mouseX/100 + 530, mouseY/100 + 80, 13, 13); ellipse(mouseX/100 + 212, mouseY/100 + 340, 19, 15); ellipse(mouseX/100 + 170, mouseY/100 + 275, 18, 16); ellipse(mouseX/100 + 560, mouseY/100 + 380, 20, 20); ellipse(mouseX/100 + 585, mouseY/100 + 340, 15, 15); //set eyeball colour change: pupil fill(250, 250, 220, 200); ellipse(mouseX/100 + 121, mouseY/100 + 175, 5, 5); ellipse(mouseX/100 + 72, mouseY/100 + 202, 6, 6); ellipse(mouseX/100 + 530, mouseY/100 + 82, 5, 5); ellipse(mouseX/100 + 212, mouseY/100 + 338, 7, 4); ellipse(mouseX/100 + 170, mouseY/100 + 273, 5, 5); ellipse(mouseX/100 + 556, mouseY/100 + 378, 8, 8); ellipse(mouseX/100 + 582, mouseY/100 + 338, 6, 6); }