/* Night Sky and Sea By: Vicky Liu Control the little girl by using left and right keys to collect stars dropping from the night sky references: https://forum.processing.org/one/topic/shrinking-and-growing-shapes.html http://www-acad.sheridanc.on.ca/PROG14998/2016/interactive-toy/john_yue_interactive_toy/index.html */ //girl variables float girlX=110; float girlY=320; //star variables float starX= random(10, 390); float starY= 0; float speed= 0.3; void setup() { size(400, 400); rectMode(CORNER); ellipseMode(RADIUS); } void draw() { frameRate(60); background(12, 20, 33); drawSea(); drawSeaLightEffect(); drawPurplePlanet(); drawDarkBluePlanet(); drawBluePlanet(); drawBlackPlanet(); drawStarsInSky(); drawGirl(); moveGirl(); drawStar(); } //sea void drawSea() { fill(0); rect(0, 300, 400, 5); fill(24, 64, 91); rect(0, 304, 400, 25); fill(27, 73, 103); rect(0, 328, 400, 25); fill(31, 83, 118); rect(0, 352, 400, 25); fill(35, 93, 132); rect(0, 376, 400, 25); } //light effect on sea void drawSeaLightEffect() { //dark blue fill(10, 39, 55); rect(0+sin(frameCount*0.3), 360, 110, 20); rect(40+sin(frameCount*0.3), 320, 100, 5); rect(140, 350, 100+sin(frameCount*0.3), 7); rect(180+sin(frameCount*0.3), 330, 80, 3); rect(280, 320, 150+sin(frameCount*0.3), 4); rect(210+sin(frameCount*0.3), 312, 140, 3); rect(320, 340, 80+sin(frameCount*0.3), 4); rect(310+sin(frameCount*0.3), 370, 90, 20); //ight blue fill(81+sin(frameCount*0.3), 123, 209); rect(138, 322, 60+sin(frameCount*0.3), 8); rect(248, 320, 42+sin(frameCount*0.3), 4); rect(288, 313, 71+sin(frameCount*0.3), 6); rect(240+sin(frameCount*0.3), 340, 80, 9); //dark green fill(59, 118, 132); rect(210+sin(frameCount*0.3), 320, 130, 5); rect(190, 320, 80+sin(frameCount*0.3), 2); rect(230+sin(frameCount*0.3), 330, 50, 10); rect(320+sin(frameCount*0.3), 328, 80, 4); //light green fill(208, 249, 241); rect(240, 312, 60+sin(frameCount*0.3), 3); rect(230, 320, 15+sin(frameCount*0.3), 2); rect(258+sin(frameCount*0.3), 330, 20, 3); rect(330+sin(frameCount*0.3), 328, 20, 4); rect(238, 340, 30+sin(frameCount*0.3), 4); } //dark blue planet, shrinks and enlarges float darkBlueRadius=60; boolean ellipseIsShrinking= false; void drawDarkBluePlanet() { fill(9, 31, 52); ellipse(320, 160, darkBlueRadius, darkBlueRadius); // Make smaller if shrinking, bigger otherwise if (ellipseIsShrinking) darkBlueRadius--; else darkBlueRadius++; // Test if instructions should be reversed if (darkBlueRadius == 60 || darkBlueRadius == 100) ellipseIsShrinking = !ellipseIsShrinking; } //black planet, shrinks and enlarges float blackRadius=30; boolean ellipse2IsShrinking= false; void drawBlackPlanet() { fill(9, 10, 12); ellipse(130, 120, blackRadius, blackRadius); // Make smaller if shrinking, bigger otherwise if (ellipse2IsShrinking) blackRadius--; else blackRadius++; // Test if instructions should be reversed if (blackRadius == 1 || blackRadius == 35) ellipse2IsShrinking = !ellipse2IsShrinking; } //purple planet, transparency decreases as radius increases void drawPurplePlanet() { int purpleTrans=255; int purpleRadius=10; while (purpleRadius<= 70) { noStroke(); fill(44, 38, 62, purpleTrans); ellipse(30+sin(frameCount*0.1), 220, purpleRadius, purpleRadius); purpleRadius= purpleRadius+10; purpleTrans= purpleTrans-30; } } //blue planet, transparency decreases as radius increases void drawBluePlanet() { int blueTrans=255; int blueRadius=10; while (blueRadius<= 140) { fill(46, 65, 98, blueTrans); ellipse(350, 50+sin(frameCount*0.1), blueRadius, blueRadius); blueRadius= blueRadius+10; blueTrans= blueTrans-10; } } //stars in the sky void drawStarsInSky() { stroke(155, 130, 204, 150); strokeWeight(4); point(20, 20); point(40, 30); point(80, 80); point(50, 120); point(80, 160); point(140, 240); point(200, 120); point(360, 260); point(170, 70); point(230, 280); point(160, 190); point(280, 260); } //girl void drawGirl() { noStroke(); fill(255, 175, 185); ellipse(girlX, girlY, 10, 10); stroke(247, 215, 221); strokeWeight(2); fill(247, 215, 221); line(girlX-6, girlY+20, girlX-12, girlY+27); line(girlX+6, girlY+20, girlX+12, girlY+27); noStroke(); fill(227, 166, 222); quad(girlX-6, girlY+20, girlX+6, girlY+20, girlX+10, girlY+32, girlX-10, girlY+32); fill(255, 175, 185); quad(girlX-10, girlY, girlX+10, girlY, girlX+16, girlY+20, girlX-16, girlY+20); fill(56, 40, 46); ellipse(girlX, girlY+35, 16, 2); fill(255, 229, 239); ellipse(girlX+2, girlY-6, 3, 2); ellipse(girlX+7, girlY-2, 1, 2); } //girl moving horizontally with left and right keys void moveGirl() { if (keyPressed) { if (keyCode == LEFT) { girlX = girlX - 2; } else if (keyCode == RIGHT) { girlX = girlX + 2; } } //keep girl constrained within the screen girlX= constrain(girlX, 0, 400); } //stars void drawStar() { fill(207, 198, 229); triangle(starX, starY-13, starX+8, starY+3, starX-8, starY+3); triangle(starX, starY-5, starX+12, starY-3, starX+4, starY+6); triangle(starX, starY+5, starX-12, starY-3, starX+4, starY-6); triangle(starX-6, starY, starX+8, starY, starX+8, starY+13); triangle(starX+6, starY, starX-8, starY, starX-8, starY+13); //star falls from the sky, and then accelerates starY= starY+speed; speed= speed+ 0.1; //if stars drop in the sea if (starY>= 360) { drawStarSinks(); starX = random(10, 390); starY = 0; speed = 0; } //if star drops on the girl if (starX>= girlX-50 && starX<= girlX+50&& starY>= girlY&& starY< girlY+30) { starX= random(10, 390); starY= 0; speed= 0; drawGirlGlows(); } } //Star sinks in the sea void drawStarSinks() { frameRate(5); fill(6, 23, 32); ellipse(starX, starY+3, 24, 6); fill(207, 198, 229); ellipse(starX, starY-2, 8, 3); } //Girl's head glows void drawGirlGlows() { frameRate(5); fill(245, 237, 255, 100); ellipse(girlX, girlY, 20, 20); fill(245, 237, 255, 60); ellipse(girlX, girlY, 30, 30); }