Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/*
Title: "The Duck, The Bird, and The Stardust"
 Artist: Adi Khanna
 Description: Press and hold the mouse button on either side of the canvas
 to accelerate the duck in that direction. Watch as the flying stardust illuminates 
 the duck in a variety of beautiful colors and gives it a SPEED BOOST!
 */

float duckPosX;
float duckPosY;
float duckSpeedX;

float birdPosX;
float birdPosY;

float firstWaterTrianglePosX;
float firstWaterTrianglePosY;
float secondWaterTrianglePosX;
float secondWaterTrianglePosY;

void setup() {
  frameRate(60);
  size(400, 400);
  initializeDuck();
  initializeBird();
  initializeWater();
}

//Set the initial speed and position of the duck...

void initializeDuck() {
  duckPosX = width/2;
  duckPosY = 290;
  duckSpeedX = 0;
}

//Set the initial position of the bird...

void initializeBird() {
  birdPosX = 450;
  birdPosY = 50;
}

//Set the initial position of each water layer... 

void initializeWater() {

  firstWaterTrianglePosX=0;
  firstWaterTrianglePosY=310;

  secondWaterTrianglePosX=width;
  secondWaterTrianglePosY=310;
}

void draw() {

  //Create a night sky...
  fill(0);
  rect(0, 0, width, height);

  //Set a background color for the water...
  fill(0, 0, 255);
  rect(0, 310, width, 140);

  drawDuck();
  lightUpDuck();
  updateDuckPosition();
  constrainDuck();

  drawBird();
  updateBirdPosition();
  moveBirdDown();
  moveBirdToRandomStartingPos();

  drawStardust();

  drawWater();
  updateWaterPosition();
}

//Draw the duck...

void drawDuck() {

  if (mouseX>width/2) {
    //draw the duck facing right...

    fill(255, 255, 255);
    stroke(0);

    triangle(duckPosX-40, duckPosY, duckPosX-20, duckPosY-20, duckPosX-20, duckPosY);
    triangle(duckPosX-40, duckPosY, duckPosX-20, duckPosY+20, duckPosX-20, duckPosY);
    rect(duckPosX-20, duckPosY-20, 20, 20);
    rect(duckPosX-20, duckPosY, 20, 20);
    rect(duckPosX, duckPosY-20, 20, 20);
    rect(duckPosX, duckPosY, 20, 20);
    triangle(duckPosX+20, duckPosY, duckPosX+20, duckPosY+20, duckPosX+40, duckPosY);
    triangle(duckPosX+20, duckPosY, duckPosX+20, duckPosY-20, duckPosX+40, duckPosY);
    quad(duckPosX+20, duckPosY-20, duckPosX+20, duckPosY-60, duckPosX+40, duckPosY-40, duckPosX+40, duckPosY);
    quad(duckPosX+20, duckPosY-60, duckPosX+40, duckPosY-70, duckPosX+60, duckPosY-60, duckPosX+40, duckPosY-40);
    triangle(duckPosX+40, duckPosY-40, duckPosX+70, duckPosY-40, duckPosX+60, duckPosY-60);
  } else if (mouseX<width/2) {
    //draw the duck facing left...

    fill(255, 255, 255);
    stroke(0);

    triangle(duckPosX-40, duckPosY, duckPosX-20, duckPosY-20, duckPosX-20, duckPosY);
    triangle(duckPosX-40, duckPosY, duckPosX-20, duckPosY+20, duckPosX-20, duckPosY);
    rect(duckPosX-20, duckPosY-20, 20, 20);
    rect(duckPosX-20, duckPosY, 20, 20);
    rect(duckPosX, duckPosY-20, 20, 20);
    rect(duckPosX, duckPosY, 20, 20);
    triangle(duckPosX+20, duckPosY, duckPosX+20, duckPosY+20, duckPosX+40, duckPosY);
    triangle(duckPosX+20, duckPosY, duckPosX+20, duckPosY-20, duckPosX+40, duckPosY);
    quad(duckPosX-20, duckPosY-20, duckPosX-20, duckPosY-60, duckPosX-40, duckPosY-40, duckPosX-40, duckPosY);
    quad(duckPosX-20, duckPosY-60, duckPosX-40, duckPosY-70, duckPosX-60, duckPosY-60, duckPosX-40, duckPosY-40);
    triangle(duckPosX-40, duckPosY-40, duckPosX-70, duckPosY-40, duckPosX-60, duckPosY-60);
  }
}

/*Light up the duck in random colors 
 and give it a speed boost when it collides with the stardust...*/

void lightUpDuck() {

  //light up the duck when it is facing right...

  if (birdPosY+50 > duckPosY-70 && mouseX>width/2) {
    fill(random(255), random(255), random(255));
    quad(duckPosX+20, duckPosY-60, duckPosX+40, duckPosY-70, duckPosX+60, duckPosY-60, duckPosX+40, duckPosY-40);
  }

  if (birdPosY+50 > duckPosY-60  && mouseX>width/2) {
    fill(random(255), random(255), random(255));
    triangle(duckPosX+40, duckPosY-40, duckPosX+70, duckPosY-40, duckPosX+60, duckPosY-60);
  }

  if (birdPosY+50 > duckPosY-60  && mouseX>width/2) {
    fill(random(255), random(255), random(255));
    quad(duckPosX+20, duckPosY-20, duckPosX+20, duckPosY-60, duckPosX+40, duckPosY-40, duckPosX+40, duckPosY);
  }

  if (birdPosY+50 > duckPosY-20 && mouseX>width/2) {
    fill(random(255), random(255), random(255));
    triangle(duckPosX-40, duckPosY, duckPosX-20, duckPosY-20, duckPosX-20, duckPosY);
    fill(random(255), random(255), random(255));
    rect(duckPosX-20, duckPosY-20, 20, 20);
    fill(random(255), random(255), random(255));
    rect(duckPosX, duckPosY-20, 20, 20);
    fill(random(255), random(255), random(255));
    triangle(duckPosX+20, duckPosY, duckPosX+20, duckPosY-20, duckPosX+40, duckPosY);
  }

  if (birdPosY+50 > duckPosY-20 && mouseX>width/2) {
    fill(random(255), random(255), random(255));
    triangle(duckPosX-40, duckPosY, duckPosX-20, duckPosY-20, duckPosX-20, duckPosY);
    fill(random(255), random(255), random(255));
    rect(duckPosX-20, duckPosY-20, 20, 20);
    fill(random(255), random(255), random(255));
    rect(duckPosX, duckPosY-20, 20, 20);
    fill(random(255), random(255), random(255));
    triangle(duckPosX+20, duckPosY, duckPosX+20, duckPosY-20, duckPosX+40, duckPosY);
  }

  if (birdPosY+50 > duckPosY-20 && mouseX>width/2) {
    fill(random(255), random(255), random(255));
    triangle(duckPosX-40, duckPosY, duckPosX-20, duckPosY+20, duckPosX-20, duckPosY);
    fill(random(255), random(255), random(255));
    rect(duckPosX-20, duckPosY, 20, 20);
    fill(random(255), random(255), random(255));
    rect(duckPosX, duckPosY, 20, 20);
    fill(random(255), random(255), random(255));
    triangle(duckPosX+20, duckPosY, duckPosX+20, duckPosY+20, duckPosX+40, duckPosY);
    
    duckSpeedX+=0.3;
  }

  //light up the duck when it is facing left...

  if (birdPosY+50 > duckPosY-70 && mouseX<width/2) {
    fill(random(255), random(255), random(255));
    quad(duckPosX-20, duckPosY-60, duckPosX-40, duckPosY-70, duckPosX-60, duckPosY-60, duckPosX-40, duckPosY-40);
  }

  if (birdPosY+50 > duckPosY-60  && mouseX<width/2) {
    fill(random(255), random(255), random(255));
    triangle(duckPosX-40, duckPosY-40, duckPosX-70, duckPosY-40, duckPosX-60, duckPosY-60);
  }

  if (birdPosY+50 > duckPosY-60  && mouseX<width/2) {
    fill(random(255), random(255), random(255));
    quad(duckPosX-20, duckPosY-20, duckPosX-20, duckPosY-60, duckPosX-40, duckPosY-40, duckPosX-40, duckPosY);
  }

  if (birdPosY+50 > duckPosY-20 && mouseX<width/2) {
    fill(random(255), random(255), random(255));
    triangle(duckPosX-40, duckPosY, duckPosX-20, duckPosY-20, duckPosX-20, duckPosY);
    fill(random(255), random(255), random(255));
    rect(duckPosX-20, duckPosY-20, 20, 20);
    fill(random(255), random(255), random(255));
    rect(duckPosX, duckPosY-20, 20, 20);
    fill(random(255), random(255), random(255));
    triangle(duckPosX+20, duckPosY, duckPosX+20, duckPosY-20, duckPosX+40, duckPosY);
  }

  if (birdPosY+50 > duckPosY-20 && mouseX<width/2) {
    fill(random(255), random(255), random(255));
    triangle(duckPosX-40, duckPosY, duckPosX-20, duckPosY-20, duckPosX-20, duckPosY);
    fill(random(255), random(255), random(255));
    rect(duckPosX-20, duckPosY-20, 20, 20);
    fill(random(255), random(255), random(255));
    rect(duckPosX, duckPosY-20, 20, 20);
    fill(random(255), random(255), random(255));
    triangle(duckPosX+20, duckPosY, duckPosX+20, duckPosY-20, duckPosX+40, duckPosY);
  }

  if (birdPosY+50 > duckPosY-20 && mouseX<width/2) {
    fill(random(255), random(255), random(255));
    triangle(duckPosX-40, duckPosY, duckPosX-20, duckPosY+20, duckPosX-20, duckPosY);
    fill(random(255), random(255), random(255));
    rect(duckPosX-20, duckPosY, 20, 20);
    fill(random(255), random(255), random(255));
    rect(duckPosX, duckPosY, 20, 20);
    fill(random(255), random(255), random(255));
    triangle(duckPosX+20, duckPosY, duckPosX+20, duckPosY+20, duckPosX+40, duckPosY);
    
    duckSpeedX-=0.3;
  }
}

/*Move and accelerate the duck to 
the side of the canvas that the player clicks on...*/

void updateDuckPosition() {

  if (mousePressed && mouseX>duckPosX) {
    duckSpeedX+=.01;
  } else if (mousePressed && mouseX<duckPosX) {
    duckSpeedX+=-.01;
  }

  duckPosX+=duckSpeedX;
}

//Ensure that the duck stays within the canvas...

void constrainDuck() {
  if (duckPosX>width-70) {
    duckSpeedX=0;
    duckPosX=width-70;
  } else if (duckPosX<70) {
    duckSpeedX=0;
    duckPosX=70;
  }
}

//Draw the bird...

void drawBird() {
  fill(random(255), random(255), random(255));
  triangle(birdPosX-50, birdPosY+10, birdPosX-30, birdPosY+10, birdPosX-30, birdPosY-10);
  fill(random(255), random(255), random(255));
  rect(birdPosX-30, birdPosY-10, 20, 20);
  fill(random(255), random(255), random(255));
  quad(birdPosX-10, birdPosY-10, birdPosX+10, birdPosY, birdPosX+10, birdPosY+20, birdPosX-10, birdPosY+10);
  fill(random(255), random(255), random(255));
  triangle(birdPosX-10, birdPosY-10, birdPosX+10, birdPosY, birdPosX+10, birdPosY-10);
  fill(random(255), random(255), random(255));
  triangle(birdPosX+10, birdPosY-10, birdPosX+10, birdPosY+20, birdPosX+30, birdPosY-10);
  fill(random(255), random(255), random(255));
  triangle(birdPosX+10, birdPosY-10, birdPosX+30, birdPosY-10, birdPosX+30, birdPosY-30);
  fill(random(255), random(255), random(255));
  triangle(birdPosX+10, birdPosY+20, birdPosX+30, birdPosY+20, birdPosX+20, birdPosY+5);
}

//Move the bird across the canvas from right to left

void updateBirdPosition() {
  birdPosX-=0.8;
}

//Move the bird downwards off-screen once it exits the canvas off the left side...

void moveBirdDown() {
  if (birdPosX<-50) {
    birdPosY+=0.8;
  }
}

/*Return the bird to a random starting position off-screen
 on the right side of the canvas... */

void moveBirdToRandomStartingPos() {
  if (birdPosY>height+50) {
    birdPosX=450;
    birdPosY=random(50, 150);
  }
}

//Draw the water...

void drawWater() {

  fill(0, 191, 255);
  noStroke();

  for (float y=firstWaterTrianglePosY; y<height; y+=40) {
    for (float x=firstWaterTrianglePosX; x<width; x+=40) {
      triangle(x, y, x+20, y-20, x+40, y);
    }
  }
}

//Make each layer of the water flow in opposite directions...

void updateWaterPosition() {

  firstWaterTrianglePosX-=0.2;
  secondWaterTrianglePosX+=0.2;

  for (float y=secondWaterTrianglePosY; y<height; y+=40) {
    for (float x=secondWaterTrianglePosX; x>0; x-=40) {
      triangle(x, y, x-20, y+20, x-40, y);
    }
  }
}

//Draw the stardust...

void drawStardust() {
  //The stardust must follow the bird in a rectangular configuration...
  stroke(random(255), random(255), random(255));
  for (int i=0; i<width; i++) {
    point(random(birdPosX+40, width), random(birdPosY-50, birdPosY+50));
  }
}