sketch
//Michelle Dang
//mtdang
//Section D
var cloud = [];
var water = [];
var offset = 0;
mountain = [];
var inc = 0.01;
var xoff = 0;
function newWater(px, py, pw) {
var p = {x: px, y: py, w: pw,
right: watRight};
return p;
}
// compute the location of the right end of a platform
function watRight() {
return this.x + this.w;
}
function setup() {
createCanvas(480, 300);
// create an initial collection of cloud
for (var i = 0; i < 10; i++){
var rx = random(width);
cloud[i] = makeCloud(rx);
}
for (var i=0; i<10; i++) {
var rx = random(width);
}
var pl = newWater(0, 210, 60); // first platform
water.push(pl);
for (var i=0; i<width/5+1; i++) {
var n = noise(xoff)
var value = map(n, 0, 1, 0, height);
xoff+=inc;
mountain.push(value);
}
frameRate(10);
}
function draw() {
background(220)
//background
noStroke()
displayHorizon();
updateAndDisplaycloud();
removecloudThatHaveSlippedOutOfView();
addNewcloudWithSomeRandomProbability();
//mountainss
beginShape()
fill("blue")
vertex(0, height); //bottom left corner of mountain
for (var i=0; i<width/5; i++) {
vertex(i*6, mountain[i]) //mountain surface
}
vertex(width, height) //bottom right corner of mountain
endShape();
mountain.shift();
mountain.push(map(noise(xoff), 0, 1, 0, 300));
xoff+= inc;
//water and sand
fill(235, 226, 160)
rect(0, 250, width, 200);
fill(98, 147, 204)
rect(0, 200, width, 50);
fill("blue");
noStroke(0);
for (var i = 0; i < water.length; i++) {
var p = water[i];
rect(p.x - offset, p.y, p.w, 10, 10);
}
// if first platform is offscreen to left, remove it
if (water.length > 0 & water[0].right() < offset) {
water.shift();
}
// if last platform is totally within canvas, make a new one
var lastPlat = water[water.length-1];
if (lastPlat.right() - offset < width) {
var p = newWater(10+lastPlat.right(), // start location
random(210, 235), // height of new platform
60); // all water have width 200 for now
water.push(p); // add to our array of water
}
offset += 1;
}
function updateAndDisplaycloud(){
// Update the building's positions, and display them.
for (var i = 0; i < cloud.length; i++){
cloud[i].move();
cloud[i].display();
}
}
function removecloudThatHaveSlippedOutOfView(){
// If a building has dropped off the left edge,
// remove it from the array. This is quite tricky, but
// we've seen something like this before with particles.
// The easy part is scanning the array to find cloud
// to remove. The tricky part is if we remove them
// immediately, we'll alter the array, and our plan to
// step through each item in the array might not work.
// Our solution is to just copy all the cloud
// we want to keep into a new array.
var cloudToKeep = [];
for (var i = 0; i < cloud.length; i++){
if (cloud[i].x + cloud[i].breadth > 0) {
cloudToKeep.push(cloud[i]);
}
}
cloud = cloudToKeep; // remember the surviving cloud
}
function addNewcloudWithSomeRandomProbability() {
// With a very tiny probability, add a new building to the end.
var newCloudLikelihood = 0.007;
if (random(0,1) < newCloudLikelihood) {
cloud.push(makeCloud(width));
}
}
// method to update position of building every frame
function cloudMove() {
this.x += this.speed;
}
// draw the building and some windows
function cloudDisplay() {
var floorHeight = 5;
var bHeight = 30;
var cHeight = 40;
fill(255);
noStroke()
push();
translate(this.x, height - 40);
rect(0, -bHeight-100, this.breadth, bHeight, 20);
rect(20, -bHeight-100, this.breadth, bHeight+10, 20);
rect(20, -bHeight-200, this.breadth, cHeight, 20);
stroke(200);
pop();
}
function makeCloud(birthLocationX) {
var bldg = {x: birthLocationX,
breadth: 60,
speed: -1.0,
nFloors: round(random(2, 7)),
move: cloudMove,
display: cloudDisplay}
return bldg;
}
function displayHorizon(){
stroke(0);
line (0,height-50, width, height-50);
}