/* "Christmas Tree" Made by Kent Anderson-Brettell - Christmas is the time to be warm, happy, and surrounded by family. With a tree set up, and presents all ready under the tree, it is time to decorate the tree with ornaments and light the lights. - Place an ornament by hovering over and and holding down the left mouse button. While clicking, you can drag the ornament and place it on the tree by lifting the mouse button. - When all 8 ornaments are on the tree, the christmas lights will turn on. - WARNING: Sometimes the ornaments will eat each other. To avoid this, try to not hover over an ornament while you are carrying one. - If an ornament gets devoured, the default locations of all ornaments can be restored by hitting BACKSPACE Enjoy! */ //Set initial variables float o1x, o2x, o3x, o4x, o5x, o6x, o7x, o8x; float o1y, o2y, o3y, o4y, o5y, o6y, o7y, o8y; float o1w, o2w, o3w, o4w, o5w, o6w, o7w, o8w; float o1h, o2h, o3h, o4h, o5h, o6h, o7h, o8h; boolean grab1 = false; boolean grab2 = false; boolean grab3 = false; boolean grab4 = false; boolean grab5 = false; boolean grab6 = false; boolean grab7 = false; boolean grab8 = false; boolean inUse = false; boolean light1 = false; boolean light2 = false; boolean light3 = false; boolean light4 = false; boolean light5 = false; boolean light6 = false; boolean light7 = false; boolean light8 = false; void setup() { //Set canvas size size (400, 400); //Set object modes rectMode (CENTER); ellipseMode (RADIUS); //Set initial variable locations o1x = 50; o1y = 50; o1w = 15; o1h = 15; o2x = 50; o2y = 100; o2w = 15; o2h = 15; o3x = 50; o3y = 150; o3w = 15; o3h = 15; o4x = 50; o4y = 200; o4w = 15; o4h = 15; o5x = 350; o5y = 50; o5w = 15; o5h = 15; o6x = 350; o6y = 100; o6w = 15; o6h = 15; o7x = 350; o7y = 150; o7w = 15; o7h = 15; o8x = 350; o8y = 200; o8w = 15; o8h = 15; } void draw() { frameRate (60); noStroke (); //Draw background drawBackground(); //Determine if the lights should turn on lightBooleans(); //Draw rug drawRug(); //Draw presents behind the tree drawPresent(50, 350, 60, color(0)); drawPresent(220, 340, 45, color(230, 122, 7)); //Draw the tree drawTree(); //Draw presents in front of the tree drawPresent(150, 365, 50, color(1, 235, 213)); drawPresent(100, 380, 25, color(75, 167, 103)); drawPresent(300, 360, 40, color(100, 100, 100)); drawPresent(250, 380, 45, color(255)); //Draw lights and ornaments drawTreeLights(); drawOrnaments(); updateOrnaments(); //In case the ornaments devour each other emergencyReset(); } void drawBackground() { //Set background colour, and draw the window and floor background (255, 212, 233); fill (168, 124, 24); rect (200, 365, 400, 100); fill (255); rect (300, 130, 100, 150); fill (0, 26, 61); rect (300, 130, 90, 140); fill (255); rect (300, 130, 99, 5); } void drawRug() { //Draw a rug under the tree fill (74, 1, 0); ellipse (200, 365, 150, 30); } void drawTree() { //Draw the Christmas Tree noStroke(); fill (51, 33, 0); rect (200, 330, 60, 70); fill (0, 71, 8); triangle (200, 0, 350, 320, 50, 320); triangle (200, 0, 330, 250, 70, 250); triangle (200, 0, 305, 180, 95, 180); triangle (200, 0, 275, 110, 125, 110); } void drawPresent(int pX, int pY, int pWH, color c ) { //Draw a Christmas Present with the definitions given in Draw stroke(255); fill (c); //Draw main box rect(pX, pY, pWH, pWH); //Draw top of box quad(pX - pWH/2, pY - pWH/2, pX, pY - pWH/2 - pWH/5, pX + pWH, pY - pWH/2 - pWH/5, pX + pWH/2, pY - pWH/2); //Draw right of box quad(pX + pWH/2, pY + pWH/2, pX + pWH/2, pY - pWH/2, pX + pWH, pY - pWH/2 - pWH/5, pX + pWH, pY + pWH/2 - pWH/5); } void drawTreeLights() { //Set the colour of the lights to random if all ornaments are on the tree if (light1) { fill (random (0, 255), random (0, 255), random (0, 255)); frameRate (30); } else { fill (0); } //Draw top lights float bulb1X = 135; while (bulb1X <= 265) { ellipse (bulb1X, 110 + sin(bulb1X / 10)*10, 5, 10); bulb1X = bulb1X + 25; } //Draw middle lights float bulb2X = 110; while (bulb2X <= 295) { ellipse (bulb2X, 180 + sin(bulb2X / 10)*10, 5, 10); bulb2X = bulb2X + 25; } //Draw bottom lights float bulb3X = 80; while (bulb3X <= 320) { ellipse (bulb3X, 250 + sin(bulb3X / 10)*10, 5, 10); bulb3X = bulb3X + 25; } } void drawOrnaments() { //Draw 1st ornaments at its initial location fill (255, 255, 93); ellipse (o1x, o1y, o1w, o1h); //Draw 2nd ornaments at its initial location fill (31, 255, 138); ellipse (o2x, o2y, o2w, o2h); //Draw 3rd ornaments at its initial location fill (255); ellipse (o3x, o3y, o3w, o3h); //Draw 4th ornaments at its initial location fill (0, 0, 53); ellipse (o4x, o4y, o4w, o4h); //Draw 5th ornaments at its initial location fill (255, 246, 110); ellipse (o5x, o5y, o5w, o5h); //Draw 6th ornaments at its initial location fill (255, 144, 35); ellipse (o6x, o6y, o6w, o6h); //Draw 7th ornaments at its initial location fill (255, 150, 163); ellipse (o7x, o7y, o7w, o7h); //Draw 8th ornaments at its initial location fill (0, 255, 222); ellipse (o8x, o8y, o8w, o8h); } void updateOrnaments () { //Update Ornament 1 //Determine if mouse is over Ornament 1 if (mouseX < o1x + o1w && mouseX > o1x - o1w && mouseY < o1y + o1h && mouseY > o1y - o1h ) { grab1 = true; } else { grab1 = false; } //Determine if mouse is grabbing Ornament 1, and prevent from grabbing others if (mousePressed && grab1 && !inUse) { o1x = mouseX; o1y = mouseY; inUse = true; } else { inUse = false; } //Provide boundry box to screen if (o1x < 0) { o1x = 0; } if (o1x > 400) { o1x = 400; } if (o1y < 0) { o1y = 0; } if (o1y > 400) { o1y = 400; } //Update Ornament 2 //Determine if mouse is over Ornament 2 if (mouseX < o2x + o2w && mouseX > o2x - o2w && mouseY < o2y + o2h && mouseY > o2y - o2h ) { grab2 = true; } else { grab2 = false; } //Determine if mouse is grabbing Ornament 2, and prevent from grabbing others if (mousePressed && grab2 && !inUse) { o2x = mouseX; o2y = mouseY; inUse = true; } else { inUse = false; } //Provide boundry box to screen if (o2x < 0) { o2x = 0; } if (o2x > 400) { o2x = 400; } if (o2y < 0) { o2y = 0; } if (o2y > 400) { o2y = 400; } //Update Ornament 3 //Determine if mouse is over Ornament 3 if (mouseX < o3x + o3w && mouseX > o3x - o3w && mouseY < o3y + o3h && mouseY > o3y - o3h ) { grab3 = true; } else { grab3 = false; } //Determine if mouse is grabbing Ornament 3, and prevent from grabbing others if (mousePressed && grab3 && !inUse) { o3x = mouseX; o3y = mouseY; inUse = true; } else { inUse = false; } //Provide boundry box to screen if (o3x < 0) { o3x = 0; } if (o3x > 400) { o3x = 400; } if (o3y < 0) { o3y = 0; } if (o3y > 400) { o3y = 400; } //Update Ornament 4 //Determine if mouse is over Ornament 4 if (mouseX < o4x + o4w && mouseX > o4x - o4w && mouseY < o4y + o4h && mouseY > o4y - o4h ) { grab4 = true; } else { grab4 = false; } //Determine if mouse is grabbing Ornament 4, and prevent from grabbing others if (mousePressed && grab4 && !inUse) { o4x = mouseX; o4y = mouseY; inUse = true; } else { inUse = false; } //Provide boundry box to screen if (o4x < 0) { o4x = 0; } if (o4x > 400) { o4x = 400; } if (o4y < 0) { o4y = 0; } if (o4y > 400) { o4y = 400; } //Update Ornament 5 //Determine if mouse is over Ornament 5 if (mouseX < o5x + o5w && mouseX > o5x - o5w && mouseY < o5y + o5h && mouseY > o5y - o5h ) { grab5 = true; } else { grab5 = false; } //Determine if mouse is grabbing Ornament 5, and prevent from grabbing others if (mousePressed && grab5 && !inUse) { o5x = mouseX; o5y = mouseY; inUse = true; } else { inUse = false; } //Provide boundry box to screen if (o5x < 0) { o5x = 0; } if (o5x > 400) { o5x = 400; } if (o5y < 0) { o5y = 0; } if (o5y > 400) { o5y = 400; } //Update Ornament 6 //Determine if mouse is over Ornament 6 if (mouseX < o6x + o6w && mouseX > o6x - o6w && mouseY < o6y + o6h && mouseY > o6y - o6h ) { grab6 = true; } else { grab6 = false; } //Determine if mouse is grabbing Ornament 6, and prevent from grabbing others if (mousePressed && grab6 && !inUse) { o6x = mouseX; o6y = mouseY; inUse = true; } else { inUse = false; } //Provide boundry box to screen if (o6x < 0) { o6x = 0; } if (o6x > 400) { o6x = 400; } if (o6y < 0) { o6y = 0; } if (o6y > 400) { o6y = 400; } //Update Ornament 7 //Determine if mouse is over Ornament 7 if (mouseX < o7x + o7w && mouseX > o7x - o7w && mouseY < o7y + o7h && mouseY > o7y - o7h ) { grab7 = true; } else { grab7 = false; } //Determine if mouse is grabbing Ornament 7, and prevent from grabbing others if (mousePressed && grab7 && !inUse) { o7x = mouseX; o7y = mouseY; inUse = true; } else { inUse = false; } //Provide boundry box to screen if (o7x < 0) { o7x = 0; } if (o7x > 400) { o7x = 400; } if (o7y < 0) { o7y = 0; } if (o7y > 400) { o7y = 400; } //Update Ornament 8 //Determine if mouse is over Ornament 8 if (mouseX < o8x + o8w && mouseX > o8x - o8w && mouseY < o8y + o8h && mouseY > o8y - o8h ) { grab8 = true; } else { grab8 = false; } //Determine if mouse is grabbing Ornament 8, and prevent from grabbing others if (mousePressed && grab8 && !inUse) { o8x = mouseX; o8y = mouseY; inUse = true; } else { inUse = false; } //Provide boundry box to screen if (o8x < 0) { o8x = 0; } if (o8x > 400) { o8x = 400; } if (o8y < 0) { o8y = 0; } if (o8y > 400) { o8y = 400; } } void emergencyReset () { //If ornaments absorb each other, reset to initial locations when backspace is pressed if (keyCode == BACKSPACE) { o1x = 50; o1y = 50; o1w = 15; o1h = 15; o2x = 50; o2y = 100; o2w = 15; o2h = 15; o3x = 50; o3y = 150; o3w = 15; o3h = 15; o4x = 50; o4y = 200; o4w = 15; o4h = 15; o5x = 350; o5y = 50; o5w = 15; o5h = 15; o6x = 350; o6y = 100; o6w = 15; o6h = 15; o7x = 350; o7y = 150; o7w = 15; o7h = 15; o8x = 350; o8y = 200; o8w = 15; o8h = 15; keyCode = 0; } } void lightBooleans() { //Determine if all the ornaments are on the tree if ((o1x >80 && o1x <320 && o1y > 10 && o1y < 310) && (o2x >80 && o2x <320 && o2y > 10 && o2y < 310) && (o3x >80 && o3x <320 && o3y > 10 && o3y < 310) && (o4x >80 && o4x <320 && o4y > 10 && o4y < 310) && (o5x >80 && o5x <320 && o5y > 10 && o5y < 310) && (o6x >80 && o6x <320 && o6y > 10 && o6y < 310) && (o7x >80 && o7x <320 && o7y > 10 && o7y < 310) && (o8x >80 && o8x <320 && o8y > 10 && o8y < 310)) { light1 = true; } else { light1 = false; } }