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