Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/* 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);
  
}