Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/////////////////////////////////////////////////
//     Interactive Drawing - Drew Godden       //
// Telescope 3D illusion surveying a cityscape //
/////////////////////////////////////////////////


//Set the screen size (400x400) in setup
void setup()
{
  size(400, 400);
}


//Create the keyPressed() console statement
void mousePressed()
{
  println("This is a pretty cool sight, if you're like, not into cool stuff.");
}


//Create the keyPressed() console statement
void keyPressed()
{
  println("Who needs friends when you have a telescope?");
}


//Draw static and interactive components in draw
void draw()
{
  //---Set strokeWeight to a thin line
  strokeWeight(0.7);

  //---Create an orange gradient for the background of the image using rect and altering fill saturation
  noStroke();
  colorMode(HSB, 359, 100, 100);
  fill(8, 47, 100);
  rect(0, 0, 400, 50);
  fill(8, 43, 100);
  rect(0, 50, 400, 50);
  fill(8, 39, 100);
  rect(0, 100, 400, 50);
  fill(8, 35, 100);
  rect(0, 150, 400, 50);
  fill(8, 31, 100);
  rect(0, 200, 400, 50);
  fill(8, 27, 100);
  rect(0, 250, 400, 50);
  fill(8, 23, 100);
  rect(0, 300, 400, 50);
  fill(8, 19, 100);
  rect(0, 350, 400, 50);
  fill(8, 15, 100);
  rect(0, 400, 400, 50);
  

  //---Create Layer 6 assets (Layer 6 clouds)---//

  //Clouds follow horizontal mouse movement at full speed. Clouds appear off-screen so that they are always present regardless of mouseX position
  stroke(0, 0, 40);
  fill(359, 100);
  rect(-380 + mouseX, 55, 30, 10, 10);
  rect(-240 + mouseX, 65, 60, 30, 10);
  rect(-120 + mouseX, 60, 90, 30, 10);
  rect(-90 + mouseX, 65, 60, 30, 10);
  rect(30 + mouseX, 65, 60, 30, 10);
  rect(80 + mouseX, 60, 60, 10, 10);
  rect(220 + mouseX, 75, 70, 20, 10);
  rect(380 + mouseX, 65, 60, 20, 10);


  //---Create Layer 5 assets (Left-most skyscraper, third from left skyscraper)---//

  //Create the left-most skyscraper. Saturation has been lowered to create the illusion of depth.
  stroke(0, 0, 20);
  fill(217, 40, 90);
  rect(-1, 200, 21, 200);
  fill(217, 40, 100);
  rect(10, 200, 41, 200, 10, 0, 0, 0);

  //Create the left-most skyscraper windows. Saturation has been lowered to create the illusion of depth.
  fill(100, 33, 100);
  rect(15, 210, 10, 20, 10);
  rect(15, 240, 10, 20, 10);
  rect(15, 270, 10, 20, 10);
  rect(15, 300, 10, 20, 10);
  rect(15, 330, 10, 20, 10);
  rect(15, 360, 10, 20, 10);
  rect(15, 390, 10, 20, 10);
  rect(33, 210, 10, 20, 10);
  rect(33, 240, 10, 20, 10);
  rect(33, 270, 10, 20, 10);
  rect(33, 300, 10, 20, 10);
  rect(33, 330, 10, 20, 10);
  rect(33, 360, 10, 20, 10);
  rect(33, 390, 10, 20, 10);

  //Create the third from left skyscraper (tallest skyscraper). Saturation has been lowered to create the illusion of depth.
  stroke(0, 0, 20);
  fill(217, 40, 90);
  rect(120, 40, 50, 360, 10, 0, 0, 0);
  fill(217, 40, 100);
  rect(160, 40, 40, 360, 10, 10, 0, 0);

  //Create the third from left skyscraper (tallest skyscraper) windows. Saturation has been lowered to create the illusion of depth.
  fill(100, 33, 100);
  rect(173, 60, 25, 20, 10);
  rect(173, 90, 25, 20, 10);
  rect(173, 120, 25, 20, 10);
  rect(173, 150, 25, 20, 10);
  rect(173, 180, 25, 20, 10);
  rect(173, 210, 25, 20, 10);
  rect(173, 240, 25, 20, 10);
  rect(173, 270, 25, 20, 10);
  rect(173, 300, 25, 20, 10);
  rect(173, 330, 25, 20, 10);
  rect(173, 360, 25, 20, 10);
  rect(173, 390, 25, 20, 10);
  rect(173, 410, 25, 20, 10);


  //---Create Layer 4 assets (Layer 4 clouds)---//

  //Clouds follow horizontal mouse movement at full speed. Clouds appear off-screen so that they are always present regardless of mouseX position
  stroke(0, 0, 20);
  fill(359, 150);
  rect(-330 + mouseX, 40, 80, 30, 10);
  rect(-150 + mouseX, 50, 70, 40, 10);


  //---Create Layer 3 assets (second from left skyscraper, fourth from left skyscraper, right-most skyscraper)---//

  //Create the second from left skyscraper (curved top skyscraper)
  stroke(0, 0, 10);
  colorMode(HSB, 359, 100, 100);
  fill(217, 47, 90);
  stroke(0);
  rect(40, 60, 20, 340, 10, 0, 0, 0);
  fill(217, 47, 100);
  noStroke();
  rect(60, 140, 80, 400);
  stroke(0);
  arc(60, 140, 160, 160, HALF_PI+PI, TWO_PI);
  line(140, 140, 140, 400);
  line(60, 65, 60, 400);
  arc(65, 65, 10, 10, PI, HALF_PI+PI);

  //Create the second from left skyscraper (curved top skyscraper) windows
  stroke(0, 0, 10);
  fill(100, 43, 100);
  rect(73, 70, 7, 90, 10);
  rect(90, 80, 7, 80, 10);
  rect(107, 95, 7, 65, 10);
  rect(124, 125, 7, 35, 10);
  rect(73, 175, 7, 90, 10);
  rect(90, 175, 7, 90, 10);
  rect(107, 175, 7, 90, 10);
  rect(124, 175, 7, 90, 10);
  rect(73, 280, 7, 90, 10);
  rect(90, 280, 7, 90, 10);
  rect(107, 280, 7, 90, 10);
  rect(124, 280, 7, 90, 10);
  rect(73, 385, 7, 90, 10);
  rect(90, 385, 7, 90, 10);
  rect(107, 385, 7, 90, 10);
  rect(124, 385, 7, 90, 10);

  //Create the fourth from left skyscraper (shortest skyscraper)
  stroke(0, 0, 10);
  fill(217, 47, 90);
  rect(190, 180, 30, 220, 10, 0, 0, 0);
  fill(217, 47, 100);
  rect(210, 180, 50, 220, 10, 10, 0, 0);

  //Create the fourth from left skyscraper (shortest skyscraper) windows
  stroke(0, 0, 10);
  fill(100, 43, 100);
  rect(220, 190, 10, 30, 10);
  rect(220, 230, 10, 30, 10);
  rect(220, 270, 10, 30, 10);
  rect(220, 310, 10, 30, 10);
  rect(220, 350, 10, 30, 10);
  rect(220, 390, 10, 30, 10);
  rect(220, 430, 10, 30, 10);
  rect(243, 190, 10, 30, 10);
  rect(243, 230, 10, 30, 10);
  rect(243, 270, 10, 30, 10);
  rect(243, 310, 10, 30, 10);
  rect(243, 350, 10, 30, 10);
  rect(243, 390, 10, 30, 10);
  rect(243, 430, 10, 30, 10);

  //Create the right-most skyscraper
  stroke(0, 0, 10);
  fill(217, 47, 90);
  rect(320, 100, 30, 300, 10, 0, 0, 0);
  fill(217, 47, 100);
  rect(340, 100, 60, 300, 10, 10, 0, 0);

  //Create the right-most skyscraper windows
  fill(100, 43, 100);
  rect(360, 110, 35, 10, 10);
  rect(360, 130, 35, 10, 10);
  rect(360, 150, 35, 10, 10);
  rect(360, 170, 35, 10, 10);
  rect(360, 190, 35, 10, 10);
  rect(360, 210, 35, 10, 10);
  rect(360, 230, 35, 10, 10);
  rect(360, 250, 35, 10, 10);
  rect(360, 270, 35, 10, 10);
  rect(360, 290, 35, 10, 10);
  rect(360, 310, 35, 10, 10);
  rect(360, 330, 35, 10, 10);
  rect(360, 350, 35, 10, 10);
  rect(360, 370, 35, 10, 10);
  rect(360, 390, 35, 10, 10);
  rect(360, 410, 35, 10, 10);


  //---Create Layer 2 assets (Layer 2 clouds)---//

  //Clouds follow horizontal mouse movement at full speed. Clouds appear off-screen so that they are always present regardless of mouseX position
  stroke(0, 0, 20);
  fill(359, 150);
  rect(-430 + mouseX, 25, 40, 20, 10);
  rect(-350 + mouseX, 40, 70, 40, 10);
  rect(-200 + mouseX, 30, 100, 40, 10);
  rect(-50 + mouseX, 40, 70, 40, 10);
  rect(0 + mouseX, 30, 70, 20, 10);
  rect(140 + mouseX, 50, 80, 30, 10);
  rect(180 + mouseX, 20, 90, 40, 10);
  rect(300 + mouseX, 40, 70, 30, 10);


  //---Create Layer 1 assets (Railing)---//

  //Create the railing
  stroke(0);
  fill(217, 60, 70);
  rect(-1, 350, 401, 7);
  fill(217, 60, 60);
  rect(-3, 357, 5, 43);
  rect(97, 357, 5, 43);
  rect(197, 357, 5, 43);
  rect(297, 357, 5, 43);
  rect(397, 357, 5, 43);


  //---Create 3D illusion telescope (This is a combination of multiple, absolute top layers)---//

  //The telescope's 3D illusion effect is created with five green ellipses with the same offset. The smallest
  //ellipse follows the mouse position at 1/8 speed (mouseX/8, mouseY/8) while the second-smallest
  //ellipse follows the mouse position at 1/16 speed (mouseX/16, mouseY/16). The larger ellipses oppose
  //the mouse position at the same speeds, while the middle ellipse remains stationary, creating
  //a 3D illusion. The sixth, smallest, colour changing ellipse changes hue depending on the value
  //of mouseX, mimicking a change in the view of a telescope's lense. The colour changing ellipse follows
  //the mouse position at 1/7 speed so that it stays within the boundary of the smallest green ellipse
  //while maintaining the 3D illusion.

  //Furthest end of telescope (biggest circle) (opposes mouse position at 1/8 speed)
  colorMode(HSB, 359, 100, 100);
  stroke(0);
  fill(100, 35, 100);
  ellipse(300 - (mouseX/8), 300 - (mouseY/8), 150, 150);

  //Second-furthest end of telescope (second biggest circle) (opposes mouse position at 1/16 speed)
  fill(100, 42, 100);
  ellipse(300 - (mouseX/16), 300 - (mouseY/16), 125, 125);

  //Static tripod
  stroke(217, 60, 60);
  strokeWeight(3);
  line(300, 300, 250, 400);
  line(300, 300, 350, 400);

  //Static middle portion of telescope (mid-sized circle)
  //Reset stroke colour
  stroke(0);
  //Reset strokeWeight
  strokeWeight(0.7);
  fill(100, 49, 100);
  ellipse(300, 300, 100, 100);

  //Second-closest end of telescope (second biggest circle) (follows mouse position at 1/16 speed)
  fill(100, 56, 100);
  ellipse(300 + mouseX/16, 300 + mouseY/16, 75, 75);

  //Closest end of telescope (smallest circle) (follows mouse position at 1/8 speed)
  fill(100, 63, 100);
  ellipse(300 + mouseX/8, 300 + mouseY/8, 50, 50);

  //Lense (small, colour-changing circle) (follows mouse position at 1/7 speed)
  //Change colorMode's limit to 400 so that it matches the maximum value of mouseX
  colorMode(HSB, 400);
  //Change the colour of the lense depending on the value of mouseX to mimic a change in the view of a telescope's lense
  fill(mouseX, 350, 350);
  ellipse(300 + mouseX/7, 300 + mouseY/7, 25, 25);
}