Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/*****************************************************
Mexican Standoff
by Klayton Cheuk
September 20, 2016

A scene depicting three lone gunmen having a showdown 
in the Wild West.
Move the mouse left and right to view each side of the
closest gunman.
Move the mouse up and down to change the time of day.
Click to twitch the closest gunman's trigger finger.
******************************************************/


void setup() {
  
  // create space
  size(400, 400);
  
  // no stroke lines, and set the appropriate modes
  noStroke();
  rectMode(CORNERS);
  ellipseMode(CENTER);
}

void draw () {
  // set the framerate
  frameRate(60);

  // draw a base sky color
  background(106, 166, 255);

  //modify the color
  fill(255, 83, 0, mouseY * 2 - 250);
  rect(0, 0, 400, 400);
  fill(34, 1, 92, mouseY * 2 - 500);
  rect(0, 0, 400, 400);

  // the prodigal sun
  fill(255, 255, 75, mouseY / 1.5 - 100);
  ellipse(200, mouseY - 50, 175, 175);
  fill(255, 255, 100, mouseY / 1.5 - 100);
  ellipse(200, mouseY - 50, 125, 125);
  fill(255, 255, 200);
  ellipse(200, mouseY - 50, 75, 75);

  // the ground
  fill(-mouseY / 4 + 176, -mouseY / 4 + 104, -mouseY / 4 + 62);
  rect(0, 260, 400, 400);

  // some faraway rock formations
  fill(-mouseY / 2 + 232, -mouseY / 2 + 137, -mouseY / 2 + 81);
  quad(-mouseX / 20, 180, -mouseX / 20 + 20, 180, -mouseX / 20 + 40, 240, -mouseX / 20, 240);
  quad(-mouseX / 20, 240, -mouseX / 20, 260, -mouseX / 20 + 90, 260, -mouseX / 20 + 40, 240);
  quad(-mouseX / 20 + 180, 200, -mouseX / 20 + 210, 200, -mouseX / 20 + 220, 230, -mouseX / 20 + 180, 230);
  quad(-mouseX / 20 + 180, 230, -mouseX / 20 + 220, 230, -mouseX / 20 + 280, 260, -mouseX / 20 + 160, 260);
  quad(-mouseX / 20 + 310, 260, -mouseX / 20 + 340, 220, -mouseX / 20 + 410, 220, -mouseX / 20 + 470, 260);
  quad(-mouseX / 20 + 340, 220, -mouseX / 20 + 350, 170, -mouseX / 20 + 390, 170, -mouseX / 20 + 410, 220);

  // stars
  stroke(255, 255, 255, mouseY - 150);
  strokeWeight(1.5);
  point(360, 40);
  point(20, 120);
  point(200, 80);
  point(220, 210);
  point(360, 160);
  point(260, 120);
  point(140, 20);
  point(100, 90);
  point(105, 215);
  point(60, 180);
  point(310, 80);
  point(190, 180);
  point(30, 20);
  noStroke();

  // the little man on the left:

  // his legs
  fill(-mouseY / 6 + 48, -mouseY / 6 + 72, -mouseY / 6 + 127);
  rect(-mouseX / 4 + 130, 250, -mouseX / 4 + 140, 270);
  rect(-mouseX / 4 + 80, 250, -mouseX / 4 + 90, 270);
  rect(-mouseX / 4 + 80, 240, -mouseX / 4 + 140, 250);

  // his shoes
  fill(-mouseY / 4 + 50, -mouseY / 4 + 50, -mouseY / 4 + 50);
  triangle(-mouseX / 4 + 70, 270, -mouseX / 4 + 90, 270, -mouseX / 4 + 80, 260);
  triangle(-mouseX / 4 + 130, 270, -mouseX / 4 + 150, 270, -mouseX / 4 + 140, 260);

  // his arms
  fill(-mouseY / 3 + 200, -mouseY / 3 + 200, -mouseY / 3 + 200);
  quad(-mouseX / 4 + 150, 235, -mouseX / 4 + 155, 230, -mouseX / 4 + 145, 220, -mouseX / 4 + 140, 225);
  quad(-mouseX / 4 + 70, 235, -mouseX / 4 + 65, 230, -mouseX / 4 + 75, 220, -mouseX / 4 + 80, 225);

  // his handsies
  fill(-mouseY / 3 + 255, -mouseY / 3 + 207, -mouseY / 3 + 161);
  ellipse(-mouseX / 4 + 155, 235, 12, 12);
  ellipse(-mouseX/ 4 + 65, 235, 12, 12);

  // his poncho
  fill(-mouseY / 3 + 219, 0, 0);
  triangle(-mouseX / 4 + 110, 255, -mouseX / 4 + 150, 220, -mouseX / 4 + 70, 220);

  // his face
  fill(-mouseY / 8 + 97, -mouseY / 8 + 82, -mouseY / 8 + 67);
  rect(-mouseX / 4 + 100, 200, -mouseX / 4 + 120, 220);

  // his eyes
  strokeWeight(3);
  stroke(255, 255, 255);
  line(-mouseX / 4 + 105, 200, -mouseX / 4 + 105, 211);
  line(-mouseX / 4 + 114.5, 200, -mouseX / 4 + 114.5, 211);
  noStroke();

  //his hat
  fill(-mouseY / 5 + 50, -mouseY / 5 + 50, -mouseY / 5 + 50);
  quad(-mouseX / 4 + 110, 210, -mouseX / 4 + 135, 200, -mouseX / 4 + 110, 190, -mouseX / 4 + 85, 200);
  rect(-mouseX / 4 + 100, 187, -mouseX / 4 + 120, 195);
  fill(-mouseY / 4 + 150, 0, 0);
  rect(-mouseX / 4 + 100, 195, -mouseX / 4 + 120, 200);

  // his face bandana
  fill(-mouseY / 4 + 150, 0, 0);
  rect(-mouseX / 4 + 95, 215, -mouseX / 4 + 125, 225);
  triangle(-mouseX / 4 + 110, 235, -mouseX / 4 + 95, 225, -mouseX / 4 + 125, 225);


  // the little man on the right:

  // his legs
  fill(-mouseY / 4 + 105, -mouseY / 4 + 204, -mouseY / 4 + 255);
  rect(-mouseX / 4 + 350, 240, -mouseX / 4 + 360, 270);
  rect(-mouseX / 4 + 400, 240, -mouseX / 4 + 410, 270);
  rect(-mouseX / 4 + 350, 240, -mouseX / 4 + 410, 250);

  // his boots
  fill(-mouseY / 4 + 145, -mouseY / 4 + 86, -mouseY / 4 + 51);
  rect(-mouseX / 4 + 348, 255, -mouseX / 4 + 362, 270);
  triangle(-mouseX / 4 + 340, 270, -mouseX / 4 + 360, 270, -mouseX / 4 + 350, 260);
  rect(-mouseX / 4 + 398, 255, -mouseX / 4 + 412, 270);
  triangle(-mouseX / 4 + 400, 270, -mouseX / 4 + 420, 270, -mouseX / 4 + 410, 260);

  // his arms
  fill(-mouseY / 3 + 230, -mouseY / 3 + 230, -mouseY / 3 + 230);
  quad(-mouseX / 4 + 420, 235, -mouseX / 4 + 425, 230, -mouseX / 4 + 415, 220, -mouseX / 4 + 410, 225);
  quad(-mouseX / 4 + 340, 235, -mouseX / 4 + 335, 230, -mouseX / 4 + 345, 220, -mouseX / 4 + 350, 225);
  rect(-mouseX / 4 + 345, 220, -mouseX / 4 + 415, 228);

  // his handsies
  fill(-mouseY / 4 + 145, -mouseY / 4 + 86, -mouseY / 4 + 51);
  ellipse(-mouseX / 4 + 425, 235, 12, 12);
  ellipse(-mouseX / 4 + 335, 235, 12, 12);

  // the torso
  fill(-mouseY / 3 + 230, -mouseY / 3 + 230, -mouseY / 3 + 230);
  rect(-mouseX / 4 + 368, 220, -mouseX / 4 + 392, 240);
  strokeWeight(1);
  stroke(100, 100, 100);
  line(-mouseX / 4 + 380, 220, -mouseX / 4 + 380, 240);
  noStroke();
  
  // the jacket
  fill(-mouseY / 4 + 145, -mouseY / 4 + 86, -mouseY / 4 + 51);
  rect(-mouseX / 4 + 365, 218, -mouseX / 4 + 375, 235);
  rect(-mouseX / 4 + 385, 218, -mouseX / 4 + 395, 235);
  
  // the belt and buckle
  fill(-mouseY / 4 + 145, -mouseY / 4 + 86, -mouseY / 4 + 51);
  rect(-mouseX / 4 + 366, 238, -mouseX / 4 + 394, 240);
  fill(-mouseY / 5 + 255, -mouseY / 4 + 239, 0);
  rect(-mouseX / 4 + 375, 236, -mouseX / 4 + 385, 242);

  // his face
  fill(-mouseY / 8 + 97, -mouseY / 8 + 82, -mouseY / 8 + 67);
  rect(-mouseX / 4 + 370, 200, -mouseX / 4 + 390, 220);

  // his eyes
  strokeWeight(3);
  stroke(255, 255, 255);
  line(-mouseX / 4 + 375, 200, -mouseX / 4 + 375, 213);
  line(-mouseX / 4 + 384.5, 200, -mouseX / 4 + 384.5, 213);
  noStroke();

  // his hat
  fill(-mouseY / 3 + 200, -mouseY / 3 + 200, -mouseY / 3 + 200);
  rect(-mouseX / 4 + 360, 208, -mouseX / 4 + 400, 210);
  rect(-mouseX / 4 + 392, 205, -mouseX / 4 + 400, 210);
  rect(-mouseX / 4 + 370, 180, -mouseX / 4 + 390, 200);
  ellipse(-mouseX / 4 + 385, 180, 10, 10);
  ellipse(-mouseX / 4 + 375, 180, 10, 10);
  fill(-mouseY / 4 + 150, -mouseY / 4 + 150, -mouseY / 4 + 150);
  rect(-mouseX / 4 + 370, 200, -mouseX / 4 + 390, 208);

  //the close man:

  fill(-mouseY / 4 + 186, -mouseY / 4 + 163, -mouseY / 4 + 132);
  rect(-mouseX + 280, 0, -mouseX + 520, 210);
  fill(-mouseY / 10 + 50, -mouseY / 10 +50, -mouseY / 10 + 50);
  rect(-mouseX + 270, 210, -mouseX + 530, 290);
  fill(-mouseY / 5 + 125, -mouseY / 5 + 66, -mouseY / 5 + 31);
  rect(-mouseX + 280, 290, -mouseX + 390, 400);
  rect(-mouseX + 390, 290, -mouseX + 410, 360);
  rect(-mouseX + 410, 290, -mouseX + 520, 400);

  // his guns:

  fill(-mouseY / 10 + 50, -mouseY / 10 + 50, -mouseY / 10 + 50);
  quad(-mouseX + 220, 270, -mouseX + 280, 270, -mouseX + 260, 400, -mouseX + 240, 400);
  quad(-mouseX + 520, 270, -mouseX + 580, 270, -mouseX + 560, 400, -mouseX + 540, 400);
  fill(-mouseY / 5 + 100, -mouseY / 5 + 100, -mouseY / 5 + 100);
  rect(-mouseX + 230, 250, -mouseX + 270, 270);
  rect(-mouseX + 530, 250, -mouseX + 570, 270);
  fill(-mouseY / 5 + 150, -mouseY / 5 + 150, -mouseY / 5 + 150);
  rect(-mouseX + 240, 240, -mouseX + 260, 270);
  rect(-mouseX + 540, 240, -mouseX + 560, 270);
  fill(-mouseY / 6 + 115, -mouseY / 8 + 56, -mouseY / 8 + 21);
  quad(-mouseX + 230, 220, -mouseX + 270, 220, -mouseX + 260, 240, -mouseX + 240, 240);
  quad(-mouseX + 530, 220, -mouseX + 570, 220, -mouseX + 560, 240, -mouseX + 540, 240);
  rect(-mouseX + 230, 220, -mouseX + 270, 160, 15, 15, 0, 0);
  rect(-mouseX + 530, 220, -mouseX + 570, 160, 15, 15, 0, 0);
  fill(-mouseY / 6 + 95, -mouseY / 8 + 36, -mouseY / 8 + 1);
  rect(-mouseX + 230, 160, -mouseX + 270, 210, 15);
  rect(-mouseX + 530, 160, -mouseX + 570, 210, 15);
  rect(-mouseX + 245, 230, -mouseX + 255, 265);
  rect(-mouseX + 545, 230, -mouseX + 555, 265);

  // his hands:
  fill(-mouseY / 10 + 50, -mouseY / 10 + 50, -mouseY / 10 + 50);

  // his forearms
  quad(-mouseX + 150, -10, -mouseX + 80, 0, -mouseX + 110, 80, -mouseX + 160, 70);
  quad(-mouseX + 650, -10, -mouseX + 720, 0, -mouseX + 690, 80, -mouseX + 640, 70);

  // his palms
  quad(-mouseX + 160, 69, -mouseX + 110, 79, -mouseX + 120, 130, -mouseX + 170, 120);
  quad(-mouseX + 640, 69, -mouseX + 690, 79, -mouseX + 680, 130, -mouseX + 630, 120);

  // his thumbs
  quad(-mouseX + 140, 60, -mouseX + 180, 80, -mouseX + 180, 90, -mouseX + 140, 100);
  quad(-mouseX + 660, 60, -mouseX + 620, 80, -mouseX + 620, 90, -mouseX + 660, 100);
  quad(-mouseX + 180, 80, -mouseX + 200, 100, -mouseX + 190, 110, -mouseX + 170, 90);
  quad(-mouseX + 620, 80, -mouseX + 600, 100, -mouseX + 610, 110, -mouseX + 630, 90);

  // his pointers
  quad(-mouseX + 168, 110, -mouseX + 198, 140, -mouseX + 190, 150, -mouseX + 160, 120);
  quad(-mouseX + 632, 110, -mouseX + 602, 140, -mouseX + 610, 150, -mouseX + 640, 120);

  // his birds
  rect(-mouseX + 145, 120, -mouseX + 160, 160);
  rect(-mouseX + 640, 120, -mouseX + 655, 160);

  // his... thirds?
  quad(-mouseX + 141, 125, -mouseX + 130, 115, -mouseX + 115, 155, -mouseX + 126, 160);
  quad(-mouseX + 659, 125, -mouseX + 670, 115, -mouseX + 685, 155, -mouseX + 674, 160);

  // his pinkies
  quad(-mouseX + 120, 90, -mouseX + 130, 110, -mouseX + 114, 145, -mouseX + 105, 140);
  quad(-mouseX + 680, 90, -mouseX + 670, 110, -mouseX + 684, 145, -mouseX + 695, 140);
}

// the triggerfinger twitch!
void mousePressed () {

  // stall time a bit
  frameRate(30);

  // hide the current pointers
  fill(106, 166, 255);
  quad(-mouseX + 168, 109, -mouseX + 199, 140, -mouseX + 190, 151, -mouseX + 161, 120);
  quad(-mouseX + 630, 109, -mouseX + 602, 140, -mouseX + 610, 151, -mouseX + 639, 120);
  fill(255, 83, 0, mouseY * 2 - 250);
  quad(-mouseX + 168, 109, -mouseX + 199, 140, -mouseX + 190, 151, -mouseX + 161, 120);
  quad(-mouseX + 630, 109, -mouseX + 602, 140, -mouseX + 610, 151, -mouseX + 639, 120);
  fill(34, 1, 92, mouseY * 2 - 500);
  quad(-mouseX + 168, 109, -mouseX + 199, 140, -mouseX + 190, 151, -mouseX + 161, 120);
  quad(-mouseX + 630, 109, -mouseX + 602, 140, -mouseX + 610, 151, -mouseX + 639, 120);

  // twitching pointers
  fill(-mouseY / 10 + 50, -mouseY / 10 + 50, -mouseY / 10 + 50);
  quad(-mouseX + 168, 109, -mouseX + 193, 145, -mouseX + 185, 155, -mouseX + 160, 120);
  quad(-mouseX + 632, 110, -mouseX + 607, 145, -mouseX + 615, 155, -mouseX + 640, 120);
}