/*
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));
}
}