Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
void setup(){
  
  size(400,400);
  noStroke(); //so things don't have outlines. I like the look of solid shapes better.
}
void draw() {
  //Note: I use mouseY or mouseX divided by various numbers a lot in this program
  //this is to get things to happen at various different speeds but all relative
  //to the movement of the mouse. 
  
  //Note 2: Every x coordinate has a +mouseX divided by something to make a paralax effect.
  
  background(0+(mouseY/2),0,200-(mouseY/4)); 
  //the background becomes less blue and more red based on vertical mouse position.
  //It's /2 to make that transition a little slower.
  
  //the smoke:           //the smoke's paralax thing: all x values +mouseX/20
  // The smoke consists of long series' of ellipses. as the mouse moves down, they 
  // ascend, move to the right, and grow in size.
  // each ellipse is also started slightly below and to the left of the previous to
  // create the impression of a wind direction, and staggered (all those silly +5s).
  fill(10,10,10,mouseY/4); //A gray that gets less transparent as the mouse descends.
  //this is just ONE pillar.. forloopspls
  ellipse(44+mouseX/20+mouseY/4,650-mouseY/2,-30+mouseY/4,-20+mouseY/4);
  ellipse(48+mouseX/20+5+mouseY/4,630-mouseY/2,-25+mouseY/3,-15+mouseY/3);
  ellipse(52+mouseX/20+mouseY/4,610-mouseY/2,-20+mouseY/4,-10+mouseY/4);
  ellipse(56+mouseX/20+5+mouseY/4,590-mouseY/2,-15+mouseY/3,-5+mouseY/3);
  ellipse(60+mouseX/20+mouseY/4,570-mouseY/2,-10+mouseY/4,0+mouseY/4);
  ellipse(64+mouseX/20+5+mouseY/4,550-mouseY/2,-5+mouseY/3,5+mouseY/3);
  ellipse(68+mouseX/20+mouseY/4,530-mouseY/2,0+mouseY/4,10+mouseY/4);
  ellipse(72+mouseX/20+5+mouseY/4,510-mouseY/2,5+mouseY/3,15+mouseY/3);
  ellipse(76+mouseX/20+mouseY/4,490-mouseY/2,10+mouseY/4,20+mouseY/4);
  ellipse(80+mouseX/20+5+mouseY/4,470-mouseY/2,15+mouseY/3,25+mouseY/3);
  ellipse(84+mouseX/20+mouseY/4,450-mouseY/2,20+mouseY/4,30+mouseY/4);
  ellipse(88+mouseX/20+5+mouseY/4,430-mouseY/2,25+mouseY/3,35+mouseY/3);
  ellipse(92+mouseX/20+mouseY/4,410-mouseY/2,30+mouseY/4,40+mouseY/4);
  ellipse(96+mouseX/20+5+mouseY/4,390-mouseY/2,35+mouseY/3,45+mouseY/3);
  ellipse(100+mouseX/20+mouseY/4,370-mouseY/2,40+mouseY/4,50+mouseY/4);
  ellipse(104+mouseX/20+5+mouseY/4,350-mouseY/2,45+mouseY/3,55+mouseY/3);
  ellipse(108+mouseX/20+mouseY/4,330-mouseY/2,50+mouseY/4,60+mouseY/4);
  ellipse(112+mouseX/20+5+mouseY/4,310-mouseY/2,55+mouseY/3,65+mouseY/3);
  //pillar 2:
  ellipse(144+mouseX/20+mouseY/4,650-mouseY/2,-30+mouseY/4,-20+mouseY/4);
  ellipse(148+mouseX/20+5+mouseY/4,630-mouseY/2,-25+mouseY/3,-15+mouseY/3);
  ellipse(152+mouseX/20+mouseY/4,610-mouseY/2,-20+mouseY/4,-10+mouseY/4);
  ellipse(156+mouseX/20+5+mouseY/4,590-mouseY/2,-15+mouseY/3,-5+mouseY/3);
  ellipse(160+mouseX/20+mouseY/4,570-mouseY/2,-10+mouseY/4,0+mouseY/4);
  ellipse(164+mouseX/20+5+mouseY/4,550-mouseY/2,-5+mouseY/3,5+mouseY/3);
  ellipse(168+mouseX/20+mouseY/4,530-mouseY/2,0+mouseY/4,10+mouseY/4);
  ellipse(172+mouseX/20+5+mouseY/4,510-mouseY/2,5+mouseY/3,15+mouseY/3);
  ellipse(176+mouseX/20+mouseY/4,490-mouseY/2,10+mouseY/4,20+mouseY/4);
  ellipse(180+mouseX/20+5+mouseY/4,470-mouseY/2,15+mouseY/3,25+mouseY/3);
  ellipse(184+mouseX/20+mouseY/4,450-mouseY/2,20+mouseY/4,30+mouseY/4);
  ellipse(188+mouseX/20+5+mouseY/4,430-mouseY/2,25+mouseY/3,35+mouseY/3);
  ellipse(192+mouseX/20+mouseY/4,410-mouseY/2,30+mouseY/4,40+mouseY/4);
  ellipse(196+mouseX/20+5+mouseY/4,390-mouseY/2,35+mouseY/3,45+mouseY/3);
  ellipse(200+mouseX/20+mouseY/4,370-mouseY/2,40+mouseY/4,50+mouseY/4);
  ellipse(204+mouseX/20+5+mouseY/4,350-mouseY/2,45+mouseY/3,55+mouseY/3);
  ellipse(208+mouseX/20+mouseY/4,330-mouseY/2,50+mouseY/4,60+mouseY/4);
  ellipse(212+mouseX/20+5+mouseY/4,310-mouseY/2,55+mouseY/3,65+mouseY/3);  
  
  //pillar 3:
  ellipse(244+mouseX/20+mouseY/4,650-mouseY/2,-30+mouseY/4,-20+mouseY/4);
  ellipse(248+mouseX/20+5+mouseY/4,630-mouseY/2,-25+mouseY/3,-15+mouseY/3);
  ellipse(252+mouseX/20+mouseY/4,610-mouseY/2,-20+mouseY/4,-10+mouseY/4);
  ellipse(256+mouseX/20+5+mouseY/4,590-mouseY/2,-15+mouseY/3,-5+mouseY/3);
  ellipse(260+mouseX/20+mouseY/4,570-mouseY/2,-10+mouseY/4,0+mouseY/4);
  ellipse(264+mouseX/20+5+mouseY/4,550-mouseY/2,-5+mouseY/3,5+mouseY/3);
  ellipse(268+mouseX/20+mouseY/4,530-mouseY/2,0+mouseY/4,10+mouseY/4);
  ellipse(272+mouseX/20+5+mouseY/4,510-mouseY/2,5+mouseY/3,15+mouseY/3);
  ellipse(276+mouseX/20+mouseY/4,490-mouseY/2,10+mouseY/4,20+mouseY/4);
  ellipse(280+mouseX/20+5+mouseY/4,470-mouseY/2,15+mouseY/3,25+mouseY/3);
  ellipse(284+mouseX/20+mouseY/4,450-mouseY/2,20+mouseY/4,30+mouseY/4);
  ellipse(288+mouseX/20+5+mouseY/4,430-mouseY/2,25+mouseY/3,35+mouseY/3);
  ellipse(292+mouseX/20+mouseY/4,410-mouseY/2,30+mouseY/4,40+mouseY/4);
  ellipse(296+mouseX/20+5+mouseY/4,390-mouseY/2,35+mouseY/3,45+mouseY/3);
  ellipse(300+mouseX/20+mouseY/4,370-mouseY/2,40+mouseY/4,50+mouseY/4);
  ellipse(304+mouseX/20+5+mouseY/4,350-mouseY/2,45+mouseY/3,55+mouseY/3);
  ellipse(308+mouseX/20+mouseY/4,330-mouseY/2,50+mouseY/4,60+mouseY/4);
  ellipse(312+mouseX/20+5+mouseY/4,310-mouseY/2,55+mouseY/3,65+mouseY/3);
  
  //pillar 0 (as in, it's the one off to the left)
  ellipse(-66+mouseX/20+mouseY/4,650-mouseY/2,-30+mouseY/4,-20+mouseY/4);
  ellipse(-64+mouseX/20+5+mouseY/4,630-mouseY/2,-25+mouseY/3,-15+mouseY/3);
  ellipse(-62+mouseX/20+mouseY/4,610-mouseY/2,-20+mouseY/4,-10+mouseY/4);
  ellipse(-60+mouseX/20+5+mouseY/4,590-mouseY/2,-15+mouseY/3,-5+mouseY/3);
  ellipse(-58+mouseX/20+mouseY/4,570-mouseY/2,-10+mouseY/4,0+mouseY/4);
  ellipse(-56+mouseX/20+5+mouseY/4,550-mouseY/2,-5+mouseY/3,5+mouseY/3);
  ellipse(-54+mouseX/20+mouseY/4,530-mouseY/2,0+mouseY/4,10+mouseY/4);
  ellipse(-52+mouseX/20+5+mouseY/4,510-mouseY/2,5+mouseY/3,15+mouseY/3);
  ellipse(-50+mouseX/20+mouseY/4,490-mouseY/2,10+mouseY/4,20+mouseY/4);
  ellipse(-48+mouseX/20+5+mouseY/4,470-mouseY/2,15+mouseY/3,25+mouseY/3);
  ellipse(-46+mouseX/20+mouseY/4,450-mouseY/2,20+mouseY/4,30+mouseY/4);
  ellipse(-44+mouseX/20+5+mouseY/4,430-mouseY/2,25+mouseY/3,35+mouseY/3);
  ellipse(-42+mouseX/20+mouseY/4,410-mouseY/2,30+mouseY/4,40+mouseY/4);
  ellipse(-40+mouseX/20+5+mouseY/4,390-mouseY/2,35+mouseY/3,45+mouseY/3);
  ellipse(-38+mouseX/20+mouseY/4,370-mouseY/2,40+mouseY/4,50+mouseY/4);
  ellipse(-36+mouseX/20+5+mouseY/4,350-mouseY/2,45+mouseY/3,55+mouseY/3);
  ellipse(-34+mouseX/20+mouseY/4,330-mouseY/2,50+mouseY/4,60+mouseY/4);
  ellipse(-32+mouseX/20+5+mouseY/4,310-mouseY/2,55+mouseY/3,65+mouseY/3);
  
  //the fire: 
  
  //the fire has a parallax thing of +mouseX/16
  
  fill(255,100,0); //dark orange
  //these are the background triangles of fire. 
  //Their top point (the third point specified) rises based on a fraction of mouseY,
  //and "flickers" based on the sin of mouseY
  triangle(-60+mouseX/16,400,50+mouseX/16,400,20+mouseX/16+sin(mouseY)*8,350-mouseY/2);
  triangle(10+mouseX/16,400,90+mouseX/16,400,50+mouseX/16+sin(mouseY)*8,350-mouseY/2);
  triangle(90+mouseX/16,400,160+mouseX/16,400,180+mouseX/16+sin(mouseY)*8,350-mouseY/2);
  triangle(190+mouseX/16,400,260+mouseX/16,400,260+mouseX/16+sin(mouseY)*8,350-mouseY/2);
  triangle(350+mouseX/16,400,410+mouseX/16,400,290+mouseX/16+sin(mouseY)*8,350-mouseY/2);
  triangle(140+mouseX/16,400,160+mouseX/16,400,180+mouseX/16+sin(mouseY)*8,350-mouseY/2);
  triangle(350+mouseX/16,400,390+mouseX/16,400,370+mouseX/16+sin(mouseY)*8,350-mouseY/2);
  triangle(220+mouseX/16,400,290+mouseX/16,400,260+mouseX/16+sin(mouseY)*8,350-mouseY/2);
  triangle(130+mouseX/16,400,170+mouseX/16,400,110+mouseX/16+sin(mouseY)*8,350-mouseY/2);
  triangle(70+mouseX/16,400,100+mouseX/16,400,95+mouseX/16+sin(mouseY)*8,350-mouseY/2);
  
  fill(255,200,0);//yellowy orange
  //These flames are smaller than the others: the points are closer together and they 
  //rise slower (mouseY/4 instead of /2).
  triangle(-50+mouseX/16,400,40+mouseX/16,400,10+mouseX/16+sin(mouseY)*8,350-mouseY/4);
  triangle(20+mouseX/16,400,80+mouseX/16,400,40+mouseX/16+sin(mouseY)*8,350-mouseY/4);
  triangle(100+mouseX/16,400,150+mouseX/16,400,170+mouseX/16+sin(mouseY)*8,350-mouseY/4);
  triangle(200+mouseX/16,400,250+mouseX/16,400,250+mouseX/16+sin(mouseY)*8,350-mouseY/4);
  triangle(400+mouseX/16,400,360+mouseX/16,400,300+mouseX/16+sin(mouseY)*8,350-mouseY/4);
  triangle(150+mouseX/16,400,140+mouseX/16,400,170+mouseX/16+sin(mouseY)*8,350-mouseY/4);
  triangle(380+mouseX/16,400,360+mouseX/16,400,380+mouseX/16+sin(mouseY)*8,350-mouseY/4);
  triangle(230+mouseX/16,400,280+mouseX/16,400,250+mouseX/16+sin(mouseY)*8,350-mouseY/4);
  triangle(140+mouseX/16,400,160+mouseX/16,400,100+mouseX/16+sin(mouseY)*8,350-mouseY/4);
  triangle(80+mouseX/16,400,90+mouseX/16,400,85+mouseX/16+sin(mouseY)*8,350-mouseY/4);
  
  //the houses:
  
  //the houses have a parralax thingy of +mouseX/12
  
  rectMode(CORNERS); //I have to use corners mode to get the weird shrinking effects
  //The houses consist of a few shapes. The roof is two triangles and a rectangle,
  //which lower with the mouse, but the bottoms lower faster than the top, so's to 
  //have the roof "collapse" over the rest of the house.
  
  //The main rectangle of the house just descends with the mouse, and the details collapse
  //by having the bottom corner lower slower than the top one.
  fill(221-mouseY/2,52-mouseY/2,38-mouseY/2); //Roof color! red, but fades to silhouette by mouse position.
  //house0: This is just to imply there's another house offscreen to the left.
  triangle(10+mouseX/12,230+(mouseY/3),-50+mouseX/12,190+(mouseY/4),-50+mouseX/12,230+(mouseY/3));
  
  fill(127-mouseY/2,51-mouseY/2,0); // House color! brown, but fades to black.
  //house 0's rectangle
  rect(-120+mouseX/12,230+(mouseY/3),0+mouseX/12,350); //120 wide
  
  //house 0 needs one window to appear to be a complete house:
  fill(0+(mouseY/2),0,200-(mouseY/2)); //window color, the same color as the sky
  rect(-40+mouseX/12,250+mouseY/3,-20+mouseX/12,290+mouseY/4);
  
  //house1:
  fill(127-mouseY/2,51-mouseY/2,0); // House color! brown, but fades to black.
  
  rect(20+mouseX/12,230+(mouseY/3),140+mouseX/12,350); //120 wide
  //details
  fill(0+(mouseY/2),0,200-(mouseY/2)); //the same color as the sky
  //house1 window's and doors
  rect(40+mouseX/12,250+mouseY/3,60+mouseX/12,290+mouseY/4);
  rect(100+mouseX/12,250+mouseY/3,120+mouseX/12,290+mouseY/4);
  rect(70+mouseX/12,300+mouseY/3,90+mouseX/12,350+mouseY/4);
  fill(221-mouseY/2,52-mouseY/2,38-mouseY/2); //roof color
  //roof
  triangle(10+mouseX/12,230+(mouseY/3),60+mouseX/12,190+(mouseY/4),60+mouseX/12,230+(mouseY/3)); //50 wide, 40 tall (at least to start)
  rect(60+mouseX/12,190+(mouseY/4),100+mouseX/12,230+(mouseY/3));
  triangle(150+mouseX/12,230+(mouseY/3),100+mouseX/12,190+(mouseY/4),100+mouseX/12,230+(mouseY/3)); //50 wide, 40 tall (at least to start)

  //house2:
  fill(127-mouseY/2,51-mouseY/2,0); // House color! brown, but fades to black.
  
  rect(160+mouseX/12,230+(mouseY/3),280+mouseX/12,350);
  //details
  fill(0+(mouseY/2),0,200-(mouseY/2)); //the same color as the sky
  //house2 window's and doors
  rect(180+mouseX/12,250+mouseY/3,200+mouseX/12,290+mouseY/4);
  rect(240+mouseX/12,250+mouseY/3,260+mouseX/12,290+mouseY/4);
  rect(210+mouseX/12,300+mouseY/3,230+mouseX/12,350+mouseY/4);
  fill(221-mouseY/2,52-mouseY/2,38-mouseY/2); //roof color
  //roof
  triangle(150+mouseX/12,230+(mouseY/3),200+mouseX/12,190+(mouseY/4),200+mouseX/12,230+(mouseY/3)); //50 wide, 40 tall (at least to start)
  rect(200+mouseX/12,190+(mouseY/4),240+mouseX/12,230+(mouseY/3));
  triangle(290+mouseX/12,230+(mouseY/3),240+mouseX/12,190+(mouseY/4),240+mouseX/12,230+(mouseY/3)); //50 wide, 40 tall (at least to start)
  
  //house3:
  fill(127-mouseY/2,51-mouseY/2,0); // House color! brown, but fades to black.
  
  rect(300+mouseX/12,230+(mouseY/3),400+mouseX/12,350);
  //details
  fill(0+(mouseY/2),0,200-(mouseY/2)); //the same color as the sky
  //house3 window's and doors
  rect(320+mouseX/12,250+mouseY/3,340+mouseX/12,290+mouseY/4);
  rect(380+mouseX/12,250+mouseY/3,400+mouseX/12,290+mouseY/4);
  rect(350+mouseX/12,300+mouseY/3,370+mouseX/12,350+mouseY/4);
  fill(221-mouseY/2,52-mouseY/2,38-mouseY/2); //roof color
  //roof
  triangle(290+mouseX/12,230+(mouseY/3),340+mouseX/12,190+(mouseY/4),340+mouseX/12,230+(mouseY/3)); //50 wide, 40 tall (at least to start)
  rect(340+mouseX/12,190+(mouseY/4),380+mouseX/12,230+(mouseY/3));
  triangle(430+mouseX/12,230+(mouseY/3),380+mouseX/12,190+(mouseY/4),380+mouseX/12,230+(mouseY/3)); //50 wide, 40 tall (at least to start)
  
  
  
  //the lawn: //
  //doesn't have to move horizontally because it's one solid color.
  fill(115-mouseY/2,255-mouseY,76-mouseY); //the grass starts green, gets kinda brown
  //because red darkens slower.
  rect(-100+mouseX/10,350,500+mouseX/10,400); //slightly larger than the screen so parallax can happen
  //light from the fire: //moves horizontally at +mouseX/12 to match the houses.
  fill(255,200,0,100-mouseY/3); //light is orange and translucent, gets
  //less and less visible. rects extend as mouse down.
  //uses sin so it flickers like the fire.
  rect(0+mouseX/12,350,20+mouseX/12,350+(mouseY/5)-sin(mouseY)*3);
  rect(140+mouseX/12,350,160+mouseX/12,350+(mouseY/5)-sin(mouseY)*3);
  rect(280+mouseX/12,350,300+mouseX/12,350+(mouseY/5)-sin(mouseY)*3);
  //the kid:
   //the kid moves horizontally the fastest cause he's in the front.
   //+mouseX/6
  
  //hand:
  //a line for his hand, that gets bigger as the mouse moves down. the end attatched to the body moves faster, which angles the arm down.
  stroke(255-mouseY/2,219-mouseY/2,198-mouseY/2); //skin color, darkens.
  strokeWeight(4+mouseY/40);
  line(300+mouseX/6-mouseY/10,340-mouseY/6,270+mouseX/6-mouseY/10,330-mouseY/10);
  //the hand holds a stick, which works pretty much the same way.
  stroke(77-mouseY/2,31-mouseY/2,0); //darker brown than houses so you can see it when they overlap.
  line(270+mouseX/6-mouseY/10,330-mouseY/10,270+mouseX/6-mouseY/10,300-mouseY/10);
  noStroke();
  //his little fire:
  fill(255,60,0); //darker orange than other fire
  //the torch fire works the same as the other fire, but the sin is offset by 5 so it doesn't sync to the back fire.
  //the points also scale and move with the arm and torch
  triangle(265+mouseX/6-mouseY/10,300-mouseY/10,275+mouseX/6-mouseY/10,300-mouseY/10,260+mouseX/6+(sin(pmouseY-5)*5)-mouseY/10,300-mouseY/6); 
  triangle(265+mouseX/6-mouseY/10,300-mouseY/10,275+mouseX/6-mouseY/10,300-mouseY/10,270+mouseX/6+(sin(pmouseY-5)*5)-mouseY/10,300-mouseY/6);
  //pants:
  //a rect that scales up as mouse moves down
  fill(41-mouseY/2,29-mouseY/2,114-mouseY/2); //pants color, dark blue, darkens
  rect(285+mouseX/6-mouseY/14,390-mouseY/6,315+mouseX/6+mouseY/14,400);
  //shirt:
  // triangle that scales up as well, slightly more so than the pants because it looks better. 
  fill(94-mouseY/2,66-mouseY/2,255-mouseY/2); //shirt color, blue, darkens
  triangle(280+mouseX/6-mouseY/10,390-mouseY/6,320+mouseX/6+mouseY/10,390-mouseY/6,300+mouseX/6,300-mouseY/3);
  //face:
  //the centre of the circle is the top point of the body. it scales up as well.
  fill(255-mouseY/2,219-mouseY/2,198-mouseY/2); //skin color, darkens.
  ellipse(300+mouseX/6,300-mouseY/3,40+mouseY/6,40+mouseY/6);
}