/* Title: A Summer Clocktower
* Name: Adam Gill
* Student ID: 991471378
* Class Code: PROG 14998
*
*/
void setup() {
size(400, 400);
}
void draw() {
rectMode(CENTER);
ellipseMode(CENTER);
// Sky
background(135, 206, 250);
//// Sun (uses equasion to move across the sky and pulsates)
stroke(255, 185, 0);
strokeWeight(3);
fill(255, 255, 0);
// Center
ellipse(mouseX, (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60), 40 + sin(frameCount / 10.0), 40 + sin(frameCount / 10.0));
// --Triangles--
/* I apologize for the size of these lines, the main thing is that there are two equasions applied to them,
* 1. A parabola equasion along the lines of: 2(0.02(x - 200))^2 + 60 where x is mouseX
* 2. A sine function along the lines of: sin(x / 10) where x is frameCount
*/
strokeWeight(1);
// Top
triangle(mouseX + sin(frameCount / 10.0), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - (40 + sin(frameCount / 10.0)),
mouseX - (5 + sin(frameCount / 10.0)), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - (25 + sin(frameCount / 10.0)),
mouseX + 5 + sin(frameCount / 10.0), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - (25 + sin(frameCount / 10.0)));
// Top Right
triangle(mouseX + 30 + sin(frameCount / 10.0), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - 30, mouseX + 15 + sin(frameCount / 10.0),
(2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - (25 + sin(frameCount / 10.0)), mouseX + 25 + sin(frameCount / 10.0),
(2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - (15 + sin(frameCount / 10.0)));
// Right
triangle(mouseX + 40 + sin(frameCount / 10.0), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60), mouseX + 25 + sin(frameCount / 10.0),
(2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - (5 + sin(frameCount / 10.0)), mouseX + 25 + sin(frameCount / 10.0),
(2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 5 + sin(frameCount / 10.0));
// Bot Right
triangle(mouseX + 30 + sin(frameCount / 10.0), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 30 + sin(frameCount / 10.0),
mouseX + 15 + sin(frameCount / 10.0), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 25 + sin(frameCount / 10.0),
mouseX + 25 + sin(frameCount / 10.0), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 15 + sin(frameCount / 10.0));
// Left
triangle(mouseX - (40 + sin(frameCount / 10.0)), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60), mouseX - (25 + sin(frameCount / 10.0)),
(2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - (5 + sin(frameCount / 10.0)), mouseX - (25 + sin(frameCount / 10.0)),
(2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 5 + sin(frameCount / 10.0));
// Bot Left
triangle(mouseX - (30 + sin(frameCount / 10.0)), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 30 + sin(frameCount / 10.0),
mouseX - (15 + sin(frameCount / 10.0)), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 25 + sin(frameCount / 10.0),
mouseX - (25 + sin(frameCount / 10.0)), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 15 + sin(frameCount / 10.0));
// Bottom
triangle(mouseX + sin(frameCount / 10.0), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 40 + sin(frameCount / 10.0),
mouseX - (5 + sin(frameCount / 10.0)), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 25 + sin(frameCount / 10.0),
mouseX + 5 + sin(frameCount / 10.0), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) + 25 + sin(frameCount / 10.0));
// Top Left
triangle(mouseX - (30 + sin(frameCount / 10.0)), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - (30 + sin(frameCount / 10.0)),
mouseX - (15 + sin(frameCount / 10.0)), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - (25 + sin(frameCount / 10.0)),
mouseX - (25 + sin(frameCount / 10.0)), (2 * ((0.02 * (mouseX - 200)) * (0.02 * (mouseX - 200))) + 60) - (15 + sin(frameCount / 10.0)));
//// Clouds (sways gently)
// Cloud 1
stroke(200);
strokeWeight(3);
fill(245);
ellipse(25 * sin(frameCount / 50.0) + 80, 40, 40, 40);
noStroke();
rect(25 * sin(frameCount / 50.0) + 80, 60, 40, 40);
stroke(200);
arc(25 * sin(frameCount / 50.0) + 60, 60, 40, 40, HALF_PI, (13 * PI) / 8);
arc(25 * sin(frameCount / 50.0) + 100, 60, 40, 40, (11 * PI) / 8, TWO_PI + HALF_PI);
line(25 * sin(frameCount / 50.0) + 60, 80, 25 * sin(frameCount / 50.0) + 100, 80);
// Cloud 2
stroke(200);
strokeWeight(3);
fill(245);
ellipse(25 * cos(frameCount / 50.0) + 240, 80, 40, 40);
noStroke();
rect(25 * cos(frameCount / 50.0) + 240, 100, 40, 40);
stroke(200);
arc(25 * cos(frameCount / 50.0) + 220, 100, 40, 40, HALF_PI, (13 * PI) / 8);
arc(25 * cos(frameCount / 50.0) + 260, 100, 40, 40, (11 * PI) / 8, TWO_PI + HALF_PI);
line(25 * cos(frameCount / 50.0) + 220, 120, 25 * cos(frameCount / 50.0) + 260, 120);
//// Hills (parallaxing effect)
// Hills Far
stroke(102, 142, 84);
strokeWeight(3);
fill(84, 156, 48);
arc(120 + ((mouseX - 200) * 0.05), height - 40, 280, 180, PI, TWO_PI);
arc(width - 20 + ((mouseX - 200) * 0.075), height - 40, 120, 120, PI, TWO_PI);
// Filler Far
noStroke();
rectMode(CORNERS);
rect(0, height - 80, width, height);
// Hills Med
stroke(102, 142, 84);
strokeWeight(3);
fill(105, 195, 60);
arc(width - 120 + ((mouseX - 200) * 0.1), height, 300, 240, PI, TWO_PI);
arc(40 + ((mouseX - 200) * 0.125), height - 20, 240, 160, PI, TWO_PI);
// Filler Med
noStroke();
rect(0, height - 40, width, height);
// Hills Close
stroke(102, 142, 84);
strokeWeight(3);
fill(135, 207, 99);
arc(40 + ((mouseX - 200) * 0.2), height, 180, 80, PI, TWO_PI);
arc(width - 20 + ((mouseX - 200) * 0.2), height, 140, 80, PI, TWO_PI);
arc(width / 2 + ((mouseX - 200) * 0.225), height + 20, 280, 140, PI, TWO_PI);
//// Trees (attached to hills)
// Tree 1 Trunk
stroke(78, 51, 25);
strokeWeight(2);
fill(117, 77, 38);
rectMode(CENTER);
triangle(80 + ((mouseX - 200) * 0.05), height - 140, 60 + ((mouseX - 200) * 0.05), height - 120, 100 + ((mouseX - 200) * 0.05), height - 120);
noStroke();
rect(80 + ((mouseX - 200) * 0.05), height - 160, 20, 78);
stroke(78, 51, 25);
line(70 + ((mouseX - 200) * 0.05), height / 2, 70 + ((mouseX - 200) * 0.05), height / 2 + 72);
line(90 + ((mouseX - 200) * 0.05), height / 2, 90 + ((mouseX - 200) * 0.05), height / 2 + 72);
fill(20, 13, 6);
stroke(0);
ellipse(85 + ((mouseX - 200) * 0.05), height - 150, 10, 20);
// Tree 1 Leaves
stroke(51, 77, 25);
strokeWeight(3);
fill(77, 115, 38);
ellipse(80 + ((mouseX - 200) * 0.05), height / 2 - 20, 40, 40);
noStroke();
rect(80 + ((mouseX - 200) * 0.05), height / 2, 40, 40);
stroke(51, 77, 25);
arc(60 + ((mouseX - 200) * 0.05), height / 2, 40, 40, HALF_PI, (13 * PI) / 8);
arc(100 + ((mouseX - 200) * 0.05), height / 2, 40, 40, (11 * PI) / 8, TWO_PI + HALF_PI);
line(60 + ((mouseX - 200) * 0.05), height / 2 + 20, 100 + ((mouseX - 200) * 0.05), height / 2 + 20);
// Tree 2 Trunk
stroke(78, 51, 25);
strokeWeight(2);
fill(117, 77, 38);
triangle(160 + ((mouseX - 200) * 0.05), height - 130, 140 + ((mouseX - 200) * 0.05), height - 110, 180 + ((mouseX - 200) * 0.05), height - 110);
noStroke();
rect(160 + ((mouseX - 200) * 0.05), height - 150, 20, 78);
stroke(78, 51, 25);
line(150 + ((mouseX - 200) * 0.05), height / 2 + 10, 150 + ((mouseX - 200) * 0.05), height / 2 + 82);
line(170 + ((mouseX - 200) * 0.05), height / 2 + 10, 170 + ((mouseX - 200) * 0.05), height / 2 + 82);
fill(20, 13, 6);
stroke(0);
ellipse(155 + ((mouseX - 200) * 0.05), height - 140, 10, 20);
// Tree 2 Leaves
stroke(51, 77, 25);
strokeWeight(3);
fill(77, 115, 38);
ellipse(160 + ((mouseX - 200) * 0.05), height / 2 - 10, 40, 40);
noStroke();
rect(160 + ((mouseX - 200) * 0.05), height / 2 + 10, 40, 40);
stroke(51, 77, 25);
arc(140 + ((mouseX - 200) * 0.05), height / 2 + 10, 40, 40, HALF_PI, (13 * PI) / 8);
arc(180 + ((mouseX - 200) * 0.05), height / 2 + 10, 40, 40, (11 * PI) / 8, TWO_PI + HALF_PI);
line(140 + ((mouseX - 200) * 0.05), height / 2 + 30, 180 + ((mouseX - 200) * 0.05), height / 2 + 30);
//// Clock Tower (attached to hills)
// Building
stroke(116, 38, 38);
strokeWeight(2);
fill(155, 49, 49);
rect(width - 100 + ((mouseX - 200) * 0.1), height / 2 + 70, 80, 60);
// Roof
stroke(82, 82, 122);
fill(102, 102, 153);
quad(width - 150 + ((mouseX - 200) * 0.1), height / 2 + 40, width - 120 + ((mouseX - 200) * 0.1), height / 2 + 20,
width - 80 + ((mouseX - 200) * 0.1), height / 2 + 20, width - 50 + ((mouseX - 200) * 0.1), height / 2 + 40);
// Tower
stroke(116, 38, 38);
strokeWeight(1);
fill(155, 49, 49);
rectMode(CORNER);
rect(width - 120 + ((mouseX - 200) * 0.1), height / 2 - 20, 5, 40);
rect(width - 85 + ((mouseX - 200) * 0.1), height / 2 - 20, 5, 40);
stroke(82, 82, 122);
strokeWeight(2);
fill(102, 102, 153);
triangle(width - 100 + ((mouseX - 200) * 0.1), height / 2 - 40, width - 125 + ((mouseX - 200) * 0.1), height / 2 - 20,
width - 75 + ((mouseX - 200) * 0.1), height / 2 - 20);
// Bell
stroke(223, 128, 32);
fill(223, 223, 32);
ellipseMode(CORNER);
ellipse(width - 102.5 + ((mouseX - 200) * 0.1), height / 2 - 17.5, 5, 5);
triangle(width - 100 + ((mouseX - 200) * 0.1), height / 2 - 5, width - 111 + ((mouseX - 200) * 0.1), height / 2 + 10,
width - 89 + ((mouseX - 200) * 0.1), height / 2 + 10);
rectMode(CENTER);
noStroke();
rect(width - 100 + ((mouseX - 200) * 0.1), height / 2, 16, 16);
ellipseMode(CENTER);
stroke(223, 128, 32);
arc(width - 100 + ((mouseX - 200) * 0.1), height / 2 - 8, 16, 8, PI, TWO_PI);
line(width - 108 + ((mouseX - 200) * 0.1), height / 2 - 8, width - 108 + ((mouseX - 200) * 0.1), height / 2 + 5);
line(width - 92 + ((mouseX - 200) * 0.1), height / 2 - 8, width - 92 + ((mouseX - 200) * 0.1), height / 2 + 5);
arc(width - 100 + ((mouseX - 200) * 0.1), height / 2 + 10, 4, 4, 0, PI);
// Clock (Moves at real time)
// Face
stroke(0);
strokeWeight(1.5);
fill(255);
ellipse(width - 100 + ((mouseX - 200) * 0.1), height / 2 + 25, 20, 20);
// Second Hand
strokeWeight(1);
line(width - 100 + ((mouseX - 200) * 0.1), height / 2 + 25, width - 100 + ((mouseX - 200) * 0.1) + (7 * sin(millis() * (TAU / 60000.0))),
height / 2 + 25 + (-7 * cos(millis() * (TAU / 60000.0))));
// Minute Hand
strokeWeight(1.5);
line(width - 100 + ((mouseX - 200) * 0.1), height / 2 + 25, width - 100 + ((mouseX - 200) * 0.1) + (7 * sin(millis() * (TAU / 3600000.0))),
height / 2 + 25 + (-7 * cos(millis() * (TAU / 3600000.0))));
// Hour Hand
line(width - 100 + ((mouseX - 200) * 0.1), height / 2 + 25, width - 100 + ((mouseX - 200) * 0.1) + (4 * sin(millis() * (TAU / 43200000.0))),
height / 2 + 25 + (-4 * cos(millis() * (TAU / 43200000.0))));
// Windows
stroke(0);
strokeWeight(2);
fill(126, 164, 206);
// Window 1
rect(width - 120 + ((mouseX - 200) * 0.1), height / 2 + 60, 20, 20);
line(width - 120 + ((mouseX - 200) * 0.1), height / 2 + 50, width - 120 + ((mouseX - 200) * 0.1), height / 2 + 70);
line(width - 130 + ((mouseX - 200) * 0.1), height / 2 + 60, width - 110 + ((mouseX - 200) * 0.1), height / 2 + 60);
// Window 2
rect(width - 80 + ((mouseX - 200) * 0.1), height / 2 + 60, 20, 20);
line(width - 80 + ((mouseX - 200) * 0.1), height / 2 + 50, width - 80 + ((mouseX - 200) * 0.1), height / 2 + 70);
line(width - 90 + ((mouseX - 200) * 0.1), height / 2 + 60, width - 70 + ((mouseX - 200) * 0.1), height / 2 + 60);
// Front Door
noStroke();
fill(117, 77, 38);
rect(width - 100 + ((mouseX - 200) * 0.1), height / 2 + 90, 20, 20);
stroke(78, 51, 25);
strokeWeight(2);
arc(width - 100 + ((mouseX - 200) * 0.1), height / 2 + 80, 20, 20, PI, TWO_PI);
line(width - 110 + ((mouseX - 200) * 0.1), height / 2 + 80, width - 110 + ((mouseX - 200) * 0.1), height / 2 + 100);
line(width - 90 + ((mouseX - 200) * 0.1), height / 2 + 80, width - 90 + ((mouseX - 200) * 0.1), height / 2 + 100);
line(width - 110 + ((mouseX - 200) * 0.1), height / 2 + 100, width - 90 + ((mouseX - 200) * 0.1), height / 2 + 100);
stroke(255, 219, 77);
strokeWeight(1);
fill(255, 230, 128);
ellipse(width - 95 + ((mouseX - 200) * 0.1), height / 2 + 90, 3, 3);
//// Reset
frameRate(60);
}
void mousePressed() {
// Pause
frameRate(1);
// Bell Toll Effect
stroke(223, 223, 32, 200);
strokeWeight(4);
noFill();
arc(width - 100 + ((mouseX - 200) * 0.1), height / 2, 50, 25, HALF_PI + QUARTER_PI, PI + QUARTER_PI);
arc(width - 100 + ((mouseX - 200) * 0.1), height / 2, 50, 25, -QUARTER_PI, QUARTER_PI);
arc(width - 100 + ((mouseX - 200) * 0.1), height / 2, 75, 30, HALF_PI + QUARTER_PI, PI + QUARTER_PI);
arc(width - 100 + ((mouseX - 200) * 0.1), height / 2, 75, 30, -QUARTER_PI, QUARTER_PI);
arc(width - 100 + ((mouseX - 200) * 0.1), height / 2, 100, 35, HALF_PI + QUARTER_PI, PI + QUARTER_PI);
arc(width - 100 + ((mouseX - 200) * 0.1), height / 2, 100, 35, -QUARTER_PI, QUARTER_PI);
}