Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/*
 Kobold Run
 Jared Moeller
 Sept. 6, 2017
 Mouse (Vertical movement) - Day/night cycle
 Mouse (Horizontle movement) - Kobold runs (background scrolls)
 Mouse (click) - Kobold Laughs
 */

////////////////////////////////////////////////////// setup ////////////////////////////////////////////////////////
void setup() {
  size(400, 400);
  frameRate(60);
}

//////////////////////////////////////////////////////////// draw /////////////////////////////////////////////////////
void draw() {

  rectMode(CORNERS);
  ellipseMode(CENTER);
  noStroke();

  ////////////////////////////////////////////////////  background ////////////////////////////////////////////////////

  ////////////////////////////////////////////////////// sky

  // day sky color
  background(60, 120, 200); 

  ///////////////////////////////////////////////////// stars

  stroke(255, 255, 190, (mouseY/2.5));
  strokeWeight(3);

  // placing stars 10 apart each on x axis gave good sense of spacing
  point(10, 120);
  point(20, 20);
  point(30, 100);
  point(40, 50);
  point(50, 80);
  point(60, 110);
  point(70, 15);
  point(80, 60);
  point(90, 30);
  point(100, 90);
  point(110, 60);
  point(120, 10);
  point(130, 100);
  point(140, 80);
  point(150, 30);
  point(160, 40);
  point(170, 110);
  point(180, 50);
  point(190, 70);
  point(200, 90);
  point(210, 20);
  point(220, 40);
  point(230, 10);
  point(240, 90);
  point(250, 60);
  point(260, 30);
  point(270, 100);
  point(280, 120);
  point(290, 80);
  point(300, 50);
  point(310, 70);
  point(320, 20);
  point(330, 75);
  point(340, 40);
  point(350, 30);
  point(360, 70);
  point(370, 20);
  point(380, 100);
  point(390, 20);

  // sun - moon
  noStroke();
  fill(255);

  //sun starts it's parabolic curve at peak
  ellipse((200+(mouseY/1.6)), .002*sq((mouseY))+40, 10, 10);

  fill(255, 255, 190);
  //moon is tuned to end at peak
  ellipse(-50+((mouseY/1.6)), .002*sq((mouseY-400))+40, 10, 10);

  ///////////////////////////////////////////////////////////////////// clouds 1 - 2 - 3 (close)

  // each cloud is comprised of 3 grey rectangles, (day only)

  fill(235, 400-mouseY);
  rect(300-(mouseX/5), 30, 380-(mouseX/5), 50);
  rect(40-(mouseX/6), 40, 120-(mouseX/6), 60);

  fill(210, 400-mouseY);
  rect(260-(mouseX/8), 40, 340-(mouseX/8), 60);
  rect(80-(mouseX/7), 50, 140-(mouseX/7), 70);

  fill(195, 400-mouseY);
  rect(320-(mouseX/7.5), 50, 420-(mouseX/7.5), 70);
  rect(-20-(mouseX/9), 60, 100-(mouseX/9), 80);

  // cloud 1 - 2 - 3 (far)

  // added to give more 'depth' to background (felt too empty)

  fill(220, 400-mouseY);
  rect(160-(mouseX/14), 90, 200-(mouseX/14), 100);


  fill(225, 400-mouseY);
  rect(180-(mouseX/10), 100, 230-(mouseX/10), 110);


  fill(210, 400-mouseY);
  rect(190-(mouseX/12), 95, 240-(mouseX/12), 105);

  /////////////////////////////////////////////////////////////////////////////// treeline base
  // to allow for the background to be constructed easily, started with 'strips'

  fill(0, 150, 0);
  rect(0, 140, 400, 160);

  /////////////////////////////////////////////////////////////////////////////// treeline shrubbage

  // basic 'tree' effect done by repeated circles.

  ellipse(5-(mouseX/20), 140, 10, 10);
  ellipse(12-(mouseX/20), 140, 15, 15);

  ellipse(25-(mouseX/20), 140, 10, 10);
  ellipse(32-(mouseX/20), 140, 15, 15);

  ellipse(45-(mouseX/20), 140, 10, 10);
  ellipse(52-(mouseX/20), 140, 15, 15);

  ellipse(65-(mouseX/20), 140, 10, 10);
  ellipse(72-(mouseX/20), 140, 15, 15);

  ellipse(85-(mouseX/20), 140, 10, 10);
  ellipse(92-(mouseX/20), 140, 15, 15);

  ellipse(105-(mouseX/20), 140, 10, 10);
  ellipse(112-(mouseX/20), 140, 15, 15);

  ellipse(125-(mouseX/20), 140, 10, 10);
  ellipse(132-(mouseX/20), 140, 15, 15);

  ellipse(145-(mouseX/20), 140, 10, 10);
  ellipse(152-(mouseX/20), 140, 15, 15);

  ellipse(165-(mouseX/20), 140, 10, 10);
  ellipse(172-(mouseX/20), 140, 15, 15);

  ellipse(185-(mouseX/20), 140, 10, 10);
  ellipse(192-(mouseX/20), 140, 15, 15);

  ellipse(205-(mouseX/20), 140, 10, 10);
  ellipse(212-(mouseX/20), 140, 15, 15);

  ellipse(225-(mouseX/20), 140, 10, 10);
  ellipse(232-(mouseX/20), 140, 15, 15);

  ellipse(245-(mouseX/20), 140, 10, 10);
  ellipse(252-(mouseX/20), 140, 15, 15);

  ellipse(265-(mouseX/20), 140, 10, 10);
  ellipse(272-(mouseX/20), 140, 15, 15);

  ellipse(285-(mouseX/20), 140, 10, 10);
  ellipse(292-(mouseX/20), 140, 15, 15);

  ellipse(305-(mouseX/20), 140, 10, 10);
  ellipse(312-(mouseX/20), 140, 15, 15);

  ellipse(325-(mouseX/20), 140, 10, 10);
  ellipse(332-(mouseX/20), 140, 15, 15);

  ellipse(345-(mouseX/20), 140, 10, 10);
  ellipse(352-(mouseX/20), 140, 15, 15);

  ellipse(365-(mouseX/20), 140, 10, 10);
  ellipse(372-(mouseX/20), 140, 15, 15);

  ellipse(385-(mouseX/20), 140, 10, 10);
  ellipse(392-(mouseX/20), 140, 15, 15);

  ellipse(405-(mouseX/20), 140, 10, 10);
  ellipse(412-(mouseX/20), 140, 15, 15);

  /////////////////////////////////////////////////////////////////////////////////// hexes 1

  fill(0, 170, 0);
  rect(0, 160, 400, 200);

  // triangles same as 'strip blend in

  triangle(0-(mouseX/10), 160, 20-(mouseX/10), 150, 40-(mouseX/10), 160);
  triangle(80-(mouseX/10), 160, 100-(mouseX/10), 150, 120-(mouseX/10), 160);
  triangle(160-(mouseX/10), 160, 180-(mouseX/10), 150, 200-(mouseX/10), 160);
  triangle(240-(mouseX/10), 160, 260-(mouseX/10), 150, 280-(mouseX/10), 160);
  triangle(320-(mouseX/10), 160, 340-(mouseX/10), 150, 360-(mouseX/10), 160);
  triangle(400-(mouseX/10), 160, 420-(mouseX/10), 150, 440-(mouseX/10), 160);

  fill(50, 170, 50);

  //contrasting lighter, tris and rects make checker effect, to better define background

  triangle(40-(mouseX/10), 160, 60-(mouseX/10), 150, 80-(mouseX/10), 160);
  rect(40-(mouseX/10), 160, 80-(mouseX/10), 400); 
  triangle(120-(mouseX/10), 160, 140-(mouseX/10), 150, 160-(mouseX/10), 160);
  rect(120-(mouseX/10), 160, 160-(mouseX/10), 400); 
  triangle(200-(mouseX/10), 160, 220-(mouseX/10), 150, 240-(mouseX/10), 160);
  rect(200-(mouseX/10), 160, 240-(mouseX/10), 400); 
  triangle(280-(mouseX/10), 160, 300-(mouseX/10), 150, 320-(mouseX/10), 160);
  rect(280-(mouseX/10), 160, 320-(mouseX/10), 400); 
  triangle(360-(mouseX/10), 160, 380-(mouseX/10), 150, 400-(mouseX/10), 160);
  rect(360-(mouseX/10), 160, 400-(mouseX/10), 400); 


  /////////////////////////////////////////////////////////////////////////////////// hexes 2

  fill(0, 190, 0);
  rect(0, 200, 400, 240);

  triangle(30-(mouseX/5), 200, 60-(mouseX/5), 180, 90-(mouseX/5), 200);
  triangle(150-(mouseX/5), 200, 180-(mouseX/5), 180, 210-(mouseX/5), 200);
  triangle(270-(mouseX/5), 200, 300-(mouseX/5), 180, 330-(mouseX/5), 200);
  triangle(390-(mouseX/5), 200, 420-(mouseX/5), 180, 450-(mouseX/5), 200);

  fill(60, 190, 60);

  triangle(-30-(mouseX/5), 200, 0-(mouseX/5), 180, 30-(mouseX/5), 200);
  rect(-30-(mouseX/5), 200, 30-(mouseX/5), 400); 
  triangle(90-(mouseX/5), 200, 120-(mouseX/5), 180, 150-(mouseX/5), 200);
  rect(90-(mouseX/5), 200, 150-(mouseX/5), 400); 
  triangle(210-(mouseX/5), 200, 240-(mouseX/5), 180, 270-(mouseX/5), 200);
  rect(210-(mouseX/5), 200, 270-(mouseX/5), 400); 
  triangle(330-(mouseX/5), 200, 360-(mouseX/5), 180, 390-(mouseX/5), 200);
  rect(330-(mouseX/5), 200, 390-(mouseX/5), 400); 
  triangle(450-(mouseX/5), 200, 480-(mouseX/5), 180, 510-(mouseX/5), 200);
  rect(450-(mouseX/5), 200, 510-(mouseX/5), 400); 

  ////////////////////////////////////////////////////////////////////////////////////// hexes 3

  fill(0, 210, 0);
  rect(0, 240, 400, 300);

  triangle(0-(mouseX/2.5), 240, 40-(mouseX/2.5), 220, 80-(mouseX/2.5), 240);
  triangle(160-(mouseX/2.5), 240, 200-(mouseX/2.5), 220, 240-(mouseX/2.5), 240);
  triangle(320-(mouseX/2.5), 240, 360-(mouseX/2.5), 220, 400-(mouseX/2.5), 240);
  triangle(480-(mouseX/2.5), 240, 520-(mouseX/2.5), 220, 560-(mouseX/2.5), 240);

  fill(90, 210, 90);

  triangle(80-(mouseX/2.5), 240, 120-(mouseX/2.5), 220, 160-(mouseX/2.5), 240);
  rect(80-(mouseX/2.5), 240, 160-(mouseX/2.5), 400); 
  triangle(240-(mouseX/2.5), 240, 280-(mouseX/2.5), 220, 320-(mouseX/2.5), 240);
  rect(240-(mouseX/2.5), 240, 320-(mouseX/2.5), 400); 
  triangle(400-(mouseX/2.5), 240, 440-(mouseX/2.5), 220, 480-(mouseX/2.5), 240);
  rect(400-(mouseX/2.5), 240, 480-(mouseX/2.5), 400); 

  ///////////////////////////////////////////////////////////////////////////////////////// hexes 4

  fill(0, 230, 0);
  rect(0, 300, 400, 380);

  triangle(60-(mouseX/1.25), 300, 120-(mouseX/1.25), 280, 180-(mouseX/1.25), 300);
  triangle(300-(mouseX/1.25), 300, 360-(mouseX/1.25), 280, 420-(mouseX/1.25), 300);
  triangle(540-(mouseX/1.25), 300, 600-(mouseX/1.25), 280, 660-(mouseX/1.25), 300);


  fill(120, 230, 120);

  triangle(-60-(mouseX/1.25), 300, 0-(mouseX/1.25), 280, 60-(mouseX/1.25), 300);
  rect(-60-(mouseX/1.25), 300, 60-(mouseX/1.25), 400); 
  triangle(180-(mouseX/1.25), 300, 240-(mouseX/1.25), 280, 300-(mouseX/1.25), 300);
  rect(180-(mouseX/1.25), 300, 300-(mouseX/1.25), 400); 
  triangle(420-(mouseX/1.25), 300, 480-(mouseX/1.25), 280, 540-(mouseX/1.25), 300);
  rect(420-(mouseX/1.25), 300, 540-(mouseX/1.25), 400); 
  triangle(660-(mouseX/1.25), 300, 720-(mouseX/1.25), 280, 780-(mouseX/1.25), 300);
  rect(660-(mouseX/1.25), 300, 780-(mouseX/1.25), 400);

  ////////////////////////////////////////////////////////////////////////////////////////// hexes 5

  fill(0, 250, 0);
  rect(0, 380, 400, 400);

  triangle(0-(mouseX/0.625), 380, 80-(mouseX/0.625), 340, 160-(mouseX/0.625), 380);
  triangle(320-(mouseX/0.625), 380, 400-(mouseX/0.625), 340, 480-(mouseX/0.625), 380);
  triangle(640-(mouseX/0.625), 380, 720-(mouseX/0.625), 340, 800-(mouseX/0.625), 380);
  triangle(960-(mouseX/0.625), 380, 1040-(mouseX/0.625), 340, 1120-(mouseX/0.625), 380);

  fill(150, 250, 150);

  triangle(160-(mouseX/0.625), 380, 240-(mouseX/0.625), 340, 320-(mouseX/0.625), 380);
  rect(160-(mouseX/0.625), 380, 320-(mouseX/0.625), 400); 
  triangle(480-(mouseX/0.625), 380, 560-(mouseX/0.625), 340, 640-(mouseX/0.625), 380);
  rect(480-(mouseX/0.625), 380, 640-(mouseX/0.625), 400); 
  triangle(800-(mouseX/0.625), 380, 880-(mouseX/0.625), 340, 960-(mouseX/0.625), 380);
  rect(800-(mouseX/0.625), 380, 960-(mouseX/0.625), 400); 


  ///////////////////////////////////////////////////////////////  middleground

  rectMode(CORNER);
  ellipseMode(CORNER);
  fill(128, 105, 81);

  ////////////////////////////////////////////////////////////// head
  rect(70+(mouseX/2), 220-abs((4*sin(mouseX/20))), 40, 40);

  //////////////////////////////////////////////////////////////// face
  rect(110+(mouseX/2), 230-abs((4*sin(mouseX/20))), 10, 20);
  triangle(110+(mouseX/2), 220-abs((4*sin(mouseX/20))), 110+(mouseX/2), 230-abs((4*sin(mouseX/20))), 120+(mouseX/2), 230-abs((4*sin(mouseX/20))));
  triangle(110+(mouseX/2), 260-abs((4*sin(mouseX/20))), 110+(mouseX/2), 250-abs((4*sin(mouseX/20))), 120+(mouseX/2), 250-abs((4*sin(mouseX/20))));

  /////////////////////////////////////////////////////////////// body
  rect(60+(mouseX/2), 260-abs((4*sin(mouseX/20))), 50, 40);

  //////////////////////////////////////////////////////////////// hood
  triangle(60+(mouseX/2), 200-abs((4*sin(mouseX/20))), 110+(mouseX/2), 220-abs((4*sin(mouseX/20))), 70+(mouseX/2), 240-abs((4*sin(mouseX/20))));
  triangle(70+(mouseX/2), 240-abs((4*sin(mouseX/20))), 60+(mouseX/2), 260-abs((4*sin(mouseX/20))), 70+(mouseX/2), 260-abs((4*sin(mouseX/20))));

  ////////////////////////////////////////////////////////////////// arm
  triangle(60+(mouseX/2), 260-abs((4*sin(mouseX/20))), 40+(mouseX/2), 280-abs((4*sin(mouseX/20))), 60+(mouseX/2), 280-abs((4*sin(mouseX/20))));
  rect(40+(mouseX/2), 280-abs((4*sin(mouseX/20))), 10, 10);

  //////////////////////////////////////////////////////////////////  pants and legs

  // legs
  stroke(79, 79, 91);
  strokeWeight(10);
  line(104+(mouseX/2), 298-abs((4*sin(mouseX/20))), 104+(mouseX/2)+(5*sin(mouseX/8)), 303-abs((4*sin(mouseX/20)))-(5*cos(mouseX/8)));
  line(104+(mouseX/2)+(5*sin(mouseX/8)), 303-abs((4*sin(mouseX/20)))-(5*cos(mouseX/8)), 104+(mouseX/2)+(7*sin(mouseX/8)), 310-abs((3*sin(mouseX/20)))-(4*cos(mouseX/8)));
  // two lines with jointed points and circular motion used to creat a 'crab-like' walk cycle.
  line(65+(mouseX/2), 298-abs((4*sin((mouseX+70)/20))), 65+(mouseX/2)+(5*sin((mouseX+70)/8)), 303-abs((4*sin((mouseX+70)/20)))-(5*cos((mouseX+70)/8)));
  line(65+(mouseX/2)+(5*sin((mouseX+70)/8)), 303-abs((4*sin((mouseX+70)/20)))-(5*cos((mouseX+70)/8)), 65+(mouseX/2)+(7*sin((mouseX+70)/8)), 310-abs((3*sin((mouseX+70)/20)))-(4*cos((mouseX+70)/8)));
  noStroke();

  // pants
  fill(79, 79, 91);
  rect(60+(mouseX/2), 290-abs((4*sin(mouseX/20))), 50, 10);
  fill(71, 60, 46);
  rect(60+(mouseX/2), 285-abs((4*sin(mouseX/20))), 50, 5);

  ////////////////////////////////////////////////////////////////////// eyes and mouth

  fill(255);
  ellipse(80+(mouseX/2), 220-abs((4*sin(mouseX/20))), 10, 10);
  ellipse(110+(mouseX/2), 225-abs((4*sin(mouseX/20))), 5, 5);

  fill(177, 122, 108);
  triangle(80+(mouseX/2), 240-abs((4*sin(mouseX/20))), 120+(mouseX/2), 240-abs((4*sin(mouseX/20))), 120+(mouseX/2), 250-abs((4*sin(mouseX/20))));

  fill(172, 116, 101, 400-mouseY/1.5);
  triangle(80+(mouseX/2), 240-abs((4*sin(mouseX/20))), 120+(mouseX/2), 240-abs((4*sin(mouseX/20))), 120+(mouseX/2), 245-abs((4*sin(mouseX/20))));

  ///////////////////////////////////////////////////////////////////////// arm and stabby bit

  fill(128, 105, 81);
  triangle(110+(mouseX/2), 250-abs((4*sin(mouseX/20))), 110+(mouseX/2), 270-abs((4*sin(mouseX/20))), 120+(mouseX/2), 270-abs((4*sin(mouseX/20))));
  rect(110+(mouseX/2), 270-abs((4*sin(mouseX/20))), 20, 10);
  fill(79, 79, 91);
  rect(130+(mouseX/2), 265-abs((4*sin(mouseX/20))), 5, 20);
  fill(102, 102, 120);
  triangle(135+(mouseX/2), 280-abs((4*sin(mouseX/20))), 135+(mouseX/2), 270-abs((4*sin(mouseX/20))), 165+(mouseX/2), 275-abs((4*sin(mouseX/20))));

  //////////////////////////////////////////////////////////////////////////  foreground 

  // night color overlay
  fill(10, 0, 50, (mouseY/2.5)); 
  rect(0, 0, 400, 400);
}

////////////////////////////////////////////////////////////////////////////// laugh
void mousePressed() {
  println("Nyeh heh heh!");
}

////////////////////////////////////////////////////////////////////////////// ???
void keyPressed() {
}