Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
//INTERACTIVE DRAWING
//"DARK SUN" BY KEVAN CHAMBERS

//MOVE MOUSE LEFT AND RIGHT TO SHIFT HORIZON (SUN, DUNES, PYRAMIDS) & COLOUR ORB
//MOVE MOUSE UP AND DOWN TO OPEN AND CLOSE THE PYRAMID
//CLICK MOUSE TO FIRE A BEAM FROM THE PYRAMID'S EYE & DISPLAY A MESSAGE IN CONSOLE
//PRESS ANY KEY TO DISPLAY A MESSAGE IN CONSOLE

void setup() {
  //Determines canvas size
  size(400, 400);
}

void draw() {
  //Caps framerate at 60 frames per second
  frameRate(60);

  ///////////////////////////////////SKY///////////////////////////////////

  //Changes background colour to grey-red to simulate surreal sky
  background(200, 150, 150);
  noStroke();

  //Draws/colours corona 1 (the lightest)
  fill(210, 150, 150);
  ellipse((mouseX+7500)/100, 125, 300, 300);

  //Draws/colours corona 2 (the second lightest)
  fill(210, 140, 140);
  ellipse((mouseX+7500)/100, 125, 250, 250);

  //Draws/colours corona 3 (the third lightest)
  fill(210, 130, 130);
  ellipse((mouseX+7500)/100, 125, 200, 200);

  //Draws/colours corona 4 (the second darkest)
  fill(210, 120, 120);
  ellipse((mouseX+7500)/100, 125, 150, 150);

  //Draws/colours corona 5 (the darkest)
  fill(210, 110, 110);
  ellipse((mouseX+7500)/100, 125, 100, 100);

  //Draws/colours the "dark sun" a dark red
  fill(150, 0, 0);
  ellipse((mouseX+7500)/100, 125, 50, 50);

  //Draws clouds and colours them a semi-transparent grey-black
  fill(25, 150);
  rect(240-frameCount/3, 120, 120, 40, 10);
  rect(300-frameCount/5, 100, 120, 40, 10);

  ///Clouds travel slowly across the screen right-to-left

  ///////////////////////////////////BACKGROUND///////////////////////////////////

  //Draws background dune and colours it palest yellow
  fill(255, 255, 150);
  ellipse(mouseX/10, 350, 300, 200);

  //Draws background pyramid sun-facing side and colours it light grey
  fill(100);
  triangle((mouseX+50)/10, 260, mouseX/10, 235, (mouseX+150)/10, 253);

  //Draws background pyramid shadowed side and colours it grey
  fill(75);
  triangle((mouseX-150)/10, 255, mouseX/10, 235, (mouseX+60)/10, 260);

  ///////////////////////////////////MIDGROUND///////////////////////////////////

  //Draws midground dune and colours it pale yellow
  fill(255, 255, 50);
  ellipse((mouseX+1625)/5, 350, 300, 150);

  //Draws midground pyramid sun-facing side and colours it grey
  fill(75);
  triangle((mouseX+1350)/5, 280, (mouseX+1500)/5, 240, (mouseX+1555)/5, 290);

  //Draws midground pyramid shadowed side and colours it dark grey
  fill(50);
  triangle((mouseX+1550)/5, 290, (mouseX+1500)/5, 240, (mouseX+1650)/5, 280);

  ///////////////////////////////////FOREGROUND///////////////////////////////////

  //Draws foreground dune and colours it yellow
  fill(200, 200, 0);
  ellipse(200, 400, 550, 150);

  //Draws foreground pyramid interior and colours it grey-black
  fill(25);
  quad(125, 280, 175, 265, 225, 265, 275, 280);

  //Draws foreground pyramid base and colours it dark grey
  fill(50);
  quad(75, 350, 125, 280, 275, 280, 325, 350);

  //Draws pyramid orb and colours it based on the mouse's x position
  fill(255-mouseX, 0, 0);
  ellipse(200, (mouseY+2200)/10, 30, 30);

  //Draws pyramid orb eye and colours it based on the mouse's x position
  fill(mouseX, 0, 0);
  ellipse(200, (mouseY+2200)/10, 5, 15);

  //Draws foreground pyramid top and colours it dark grey
  fill(50);
  triangle(125, (mouseY+445)/3, 200, (mouseY+150)/3, 275, (mouseY+445)/3);
}

void mousePressed() {
  //Lowers framerate on mouseclick so laser effect lasts 1/12th of a second
  frameRate(5);

  //Changes laser colour to match colour of orb's eye
  stroke(mouseX, 0, 0);
  fill(mouseX, 0, 0);

  //Fires a laser on mouseclick from center of orb's eye to mouse location
  strokeWeight(5);
  line(200, (mouseY+2200)/10, mouseX, mouseY);

  //Draws laser explosion effect on mouseclick at mouse location
  triangle(mouseX-5, mouseY-5, mouseX, mouseY+20, mouseX+5, mouseY-5);
  triangle(mouseX-5, mouseY+5, mouseX, mouseY-20, mouseX+5, mouseY+5);

  //Draws screen cracking effect on mouseclick at mouse location
  stroke(255);
  strokeWeight(1);
  line(mouseX, mouseY, mouseX-30, mouseY-30);
  line(mouseX-30, mouseY-30, mouseX-40, mouseY-60);
  line(mouseX-32, mouseY-35, mouseX-55, mouseY-40);
  line(mouseX, mouseY, mouseX+25, mouseY+10);
  line(mouseX+25, mouseY+10, mouseX+35, mouseY-45);
  line(mouseX+28, mouseY-10, mouseX+5, mouseY-25);
  line(mouseX+5, mouseY-25, mouseX-15, mouseY-15);
  line(mouseX, mouseY, mouseX-5, mouseY+50);
  line(mouseX-3, mouseY+30, mouseX-35, mouseY+25);
  line(mouseX-35, mouseY+25, mouseX-40, mouseY+35);
  line(mouseX-7, mouseY-7, mouseX-30, mouseY+10);
  line(mouseX-30, mouseY+10, mouseX-35, mouseY+25);
  line(mouseX+15, mouseY+7, mouseX+60, mouseY+85);

  //Displays a message in console when mouse is clicked
  println("You can't keep me in here forever.");
}

void keyPressed() {
  //Displays a message in console when any key is pressed
  println("Here, the sun shines darkly.");
}