Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/*

 "The Moon Moves Sideways"
 by Carsten Booth
 
 Sept 18th 2017
 Intro to Media Computation
 Instructor: Nicolas Hesler
 
 Interactive Drawing
 
 Interactions:
 Moon position changes based on position of mouseX, as well as opacity of tree outline, and position of bottom vertices of tree shadows.
 
 Clicking the mouse will briefly add snow to many of the trees, and will output a line of text.
 
 */

void setup() {
  size(400, 400);
}

void draw() {
  rectMode(CORNERS);
  noStroke();
  frameRate(60);
  //set background to DARK BLUE
  background(18, 31, 61);

  //set colour to LIGHT BLUE
  fill(60, 95, 175);
  
  //moon
  ellipse(mouseX*3, mouseX*1.2+64, 64, 64);

  //background hill
  fill(102);
  quad(-1, 234, 182, 234, 196, 248, -1, 420);
  fill(205);
  beginShape();
  vertex(-1, 180);
  vertex(105, 209);
  vertex(154, 215);
  vertex(182, 234);
  vertex(115, 250);
  vertex(-9, 272);
  endShape();

  //background tree highlights
  strokeWeight(4);
  strokeCap(ROUND);
  //first tree highlights
  stroke(60, 95, 175, 255-mouseX*3.2);
  line(-15, 174, 39, 48);
  line(39, 47, 66, -2);
  stroke(60, 95, 175, 255-mouseX*3);
  line(-15, 186, 32, 77);
  line(32, 76, 69, -2);
  //second tree highlights
  stroke(60, 95, 175, 255-mouseX*2.8);
  line(55, 194, 90, -2);
  stroke(60, 95, 175, 255-mouseX*2.6);
  line(59, 195, 94, -2);
  //third tree highlights
  stroke(60, 95, 175, 255-mouseX*2.4);
  line(101, 209, 101, 110);
  line(101, 108, 100, 69);
  line(100, 68, 102, 16);
  line(102, 15, 105, -1);
  stroke(60, 95, 175, 255-mouseX*2.2);
  line(105, 210, 106, 122);
  line(106, 121, 105, 69);
  line(105, 68, 108, -1);
  //fourth tree highlights
  stroke(60, 95, 175, 255-mouseX*2);
  line(149, 213, 151, 179);
  line(150, 177, 161, 80);
  line(161, 79, 166, -2);
  stroke(60, 95, 175, 255-mouseX*1.8);
  line(154, 202, 156, 177);
  line(156, 175, 170, 52);
  line(170, 50, 171, -2);
  //fifth tree highlights
  stroke(60, 95, 175, 255-mouseX*1.6);
  line(156, 201, 169, 145);
  line(168, 145, 190, 80);
  line(190, 78, 212, -2);
  stroke(60, 95, 175, 255-mouseX*1.4);
  line(156, 217, 170, 166);
  line(170, 165, 193, 89);
  line(193, 88, 218, -2);

  //midground tree highlights

  //fifth tree highlights
  stroke(60, 95, 175, -90+mouseX);
  line(408, 181, 389, 138);
  line(376, 109, 354, 59);
  line(343, 37, 328, -3);
  stroke(60, 95, 175, -80+mouseX);
  line(322, -2, 342, 50);
  line(353, 78, 377, 128);
  line(392, 165, 408, 218);
  //fourth tree highlights
  stroke(60, 95, 175, -70+mouseX);
  line(395, 291, 391, 170);
  line(389, 136, 389, -3);
  stroke(60, 95, 175, -60+mouseX);
  line(379, 288, 377, 131);
  line(378, 107, 380, -3);
  //third tree highlights
  stroke(60, 95, 175, -60+mouseX);
  line(356, 276, 354, 235);
  line(354, 233, 357, 202);
  line(357, 202, 354, 95);
  line(354, 94, 352, 79);
  line(352, 76, 355, 38);
  line(355, 36, 356, -2);
  stroke(60, 95, 175, -50+mouseX);
  line(346, -2, 344, 37);
  line(342, 54, 341, 69);
  line(341, 70, 339, 172);
  line(340, 170, 330, 148);
  line(330, 146, 320, 93);
  line(320, 92, 316, 79);
  line(316, 78, 306, 54);
  line(306, 52, 298, -2);
  stroke(60, 95, 175, -40+mouseX);
  line(294, -2, 301, 59);
  line(301, 60, 302, 63);
  line(308, 79, 312, 90);
  line(312, 91, 322, 148);
  line(322, 149, 333, 189);
  line(333, 190, 335, 210);
  line(335, 211, 334, 270);

  //second tree highlights
  stroke(60, 95, 175, -30+mouseX);
  line(310, 268, 308, 157);
  line(308, 255, 308, 190);
  line(308, 188, 306, 183);
  line(306, 181, 308, 143);
  line(308, 141, 307, 90);
  line(307, 88, 307, 78);
  line(308, 56, 310, -2);
  stroke(60, 95, 175, -20+mouseX);
  line(303, 264, 302, 190);
  line(302, 190, 303, 66);
  line(305, 38, 307, -2);
  //first tree highlights
  stroke(60, 95, 175, -10+mouseX);
  line(274, 268, 270, 133);
  line(270, 131, 273, 8);
  line(273, 6, 270, -4);
  stroke(60, 95, 175, 0+mouseX);
  line(264, 270, 264, 130);
  line(264, 128, 267, -2);

  noStroke();

  //background tree shadows
  fill(0, 240);
  //second tree shadow
  beginShape();
  vertex(55, 196);  
  vertex(57, 199);
  vertex(59, 198);
  vertex(-mouseX*6+160, 400);
  vertex(-mouseX*6+150, 400);
  endShape();
  //third tree shadow
  beginShape();
  vertex(101, 210);
  vertex(103, 211);
  vertex(105, 211);
  vertex(-mouseX*6+280, 400);
  vertex(-mouseX*6+265, 400);
  endShape();
  //fourth tree shadow
  beginShape();
  vertex(150, 215);
  vertex(151, 210);
  vertex(155, 218);
  vertex(-mouseX*6+310, 400);
  vertex(-mouseX*6+300, 400);
  endShape();
  //fifth tree shadow
  beginShape();
  vertex(152, 218);
  vertex(155, 218);
  vertex(158, 219);
  vertex(-mouseX*6+370, 400);
  vertex(-mouseX*6+360, 400);
  endShape();

  //background forest; titles are ordered by number from left first to right last
  fill(0);
  //first tree
  beginShape();
  vertex(-15, 174);
  vertex(39, 48);
  vertex(66, -2);
  vertex(69, -2);
  vertex(32, 77);
  vertex(-15, 186);
  endShape();
  //second tree
  beginShape();
  vertex(55, 196);
  vertex(73, 92);
  vertex(90, -1);
  vertex(94, -1);
  vertex(69, 147);
  vertex(59, 198);
  vertex(57, 200);
  endShape();
  //third tree
  beginShape();
  vertex(101, 210);
  vertex(101, 110);
  vertex(100, 69);
  vertex(102, 17);
  vertex(105, -1);
  vertex(108, -1);
  vertex(107, 18);
  vertex(105, 69);
  vertex(106, 122);
  vertex(105, 211);
  vertex(103, 212);
  endShape();
  //fourth tree
  beginShape();
  vertex(150, 215);
  vertex(152, 177);
  vertex(161, 80);
  vertex(166, -2);
  vertex(171, -2);
  vertex(170, 52);
  vertex(156, 177);
  vertex(155, 218);
  vertex(151, 219);
  endShape();
  //fifth tree
  beginShape();
  vertex(152, 218);
  vertex(169, 146);
  vertex(190, 79);
  vertex(213, -2);
  vertex(219, -2);
  vertex(193, 89);
  vertex(169, 166);
  vertex(159, 219);
  vertex(155, 220);
  endShape();

  //midground hill
  fill(77);
  quad(208, 290, 258, 270, 432, 334, 375, 462);
  fill(180);
  beginShape();
  vertex(258, 270);
  vertex(318, 265);
  vertex(432, 302);
  vertex(432, 334);
  vertex(341, 328);
  endShape();

  //midground tree shadows, bottom vertices change based on position of mouseX
  fill(0, 200);
  //first tree Shadow
  beginShape();
  vertex(265, 272);
  vertex(270, 272);
  vertex(274, 270);
  vertex(274, 272);
  vertex(-mouseX*3+430, 428);
  vertex(-mouseX*3+415, 428);
  endShape();
  //second tree shadow
  beginShape();
  vertex(303, 267);
  vertex(311, 268);
  vertex(311, 270);
  vertex(-mouseX*3+480, 428);
  vertex(-mouseX*3+465, 428);
  endShape();
  //third tree shadow
  beginShape();
  vertex(334, 272);
  vertex(356, 278);
  vertex(356, 279);
  vertex(-mouseX*3+520, 428);
  vertex(-mouseX*3+500, 428);
  endShape();
  //fourth tree shadow
  beginShape();
  vertex(379, 288);
  vertex(398, 299);
  vertex(398, 300);
  vertex(-mouseX*3+550, 428);
  vertex(-mouseX*3+535, 428);
  vertex(379, 290);
  endShape();

  //midground hill Forest; trees are ordered from left first to right last
  fill(0);
  //first tree
  beginShape();
  vertex(264, 272);
  vertex(266, 175);
  vertex(265, 130);
  vertex(269, 4);
  vertex(268, -2);
  vertex(270, -4);
  vertex(273, 8);
  vertex(271, 37);
  vertex(270, 133);
  vertex(271, 213);
  vertex(274, 270);
  vertex(270, 274);
  endShape();
  //second tree
  beginShape();
  vertex(303, 268);
  vertex(304, 259);
  vertex(303, 194);
  vertex(303, 190);
  vertex(304, 142);
  vertex(303, 80);
  vertex(307, -2);
  vertex(310, -2);
  vertex(307, 90);
  vertex(308, 143);
  vertex(307, 183);
  vertex(308, 190);
  vertex(309, 257);
  vertex(311, 268);
  vertex(307, 270);
  endShape();
  //third tree
  beginShape();
  vertex(334, 272);
  vertex(335, 210);
  vertex(333, 189);
  vertex(322, 148);
  vertex(313, 90);
  vertex(301, 59);
  vertex(294, -2);
  vertex(299, -2);
  vertex(307, 54);
  vertex(316, 79);
  vertex(321, 94);
  vertex(330, 148);
  vertex(339, 172);
  vertex(340, 143);
  vertex(341, 70);
  vertex(346, 22);
  vertex(346, -1);
  vertex(356, -2);
  vertex(357, 9);
  vertex(355, 38);
  vertex(352, 79);
  vertex(354, 96);
  vertex(357, 203);
  vertex(354, 235);
  vertex(356, 278);
  vertex(345, 278);
  endShape();
  //fourth tree
  beginShape();
  vertex(379, 288);
  vertex(378, 211);
  vertex(378, 164);
  vertex(377, 131);
  vertex(379, 36);
  vertex(381, -3);
  vertex(389, -3);
  vertex(389, 145);
  vertex(391, 170);
  vertex(395, 273);
  vertex(398, 299);
  vertex(389, 298);
  endShape();
  //fifth tree
  beginShape();
  vertex(408, 218);
  vertex(394, 168);
  vertex(360, 91);
  vertex(347, 63);
  vertex(321, -3);
  vertex(328, -3);
  vertex(347, 49);
  vertex(367, 84);
  vertex(408, 181);
  endShape();


  //foreground hill
  fill(50, 50, 50);
  quad(-8, 325, 285, 315, 340, 417, -10, 417);
  fill(152);
  beginShape();
  vertex(-8, 300);
  vertex(84, 280);
  vertex(200, 243);
  vertex(238, 250);
  vertex(285, 315);
  vertex(280, 324);
  vertex(201, 384);
  vertex(90, 332);
  vertex(-8, 325);
  endShape();

  fill(0, 0, 0, 75);
}

//when the mouse is pressed, draw snow on trees and output a line of text
void mousePressed () {
  frameRate(1);
  println("It was freezing cold that night, and you were all alone.");
  //snow on trees, shapes ordered from left to right, descending
  fill(242);
  triangle(11, 111, 40, 43, 63, 5);
  triangle(70, 107, 80, 52, 85, 29);
  triangle(103, -2, 106, -3, 102, 17);
  quad(155, 190, 157, 190, 159, 189, 155, 204);
  triangle(306, 183, 308, 188, 307, 190);
  quad(329, 146, 337, 158, 340, 146, 339, 173);
  triangle(355, 63, 365, 80, 376, 107);
  triangle(390, 141, 404, 167, 402, 171);
}