////////////////////////////////////////////////////////////////////////////////////////////////
////PLANT CARE 101 (interactive toy) (by Bernice Wong) ////
//// Click on fertilizer or waterpot and carry them over the plants to see what happens! ////
////////////////////////////////////////////////////////////////////////////////////////////////
int x5, y5, w5, h5; // dimensions of waterpot's rect
float x1, y1,x2, y2, x3, y3, x4, y4; // dimensions of plantpot 1's quad
float r1; // x of plant's pot rect
float fX, fY;
boolean doFertilizerGrow = false; // boolean for fertilizer "growing" when mouse hovers over it
boolean doWaterPotGrow = false; // boolean for waterpot "growing" when mouse hovers over it
boolean waterPotCircle = false; // boolean for waterpot's "circles"
// variables for Plant 1 (Cactus)
int P1BodyRectY = 270;
int P1BodyRectH = 70;
float P1BodyEllipseY = 235;
// variables for Plant 2 (Flower)
int P2BodyRectY = 260; // P2 body rectangle Y
float P2BodyRectH = 120; // P2 body rectangle Height
float P2BodyEllipse1Y = 210; // P2 body ellipse Y for ellipse 1
float P2BodyEllipse2Y = 228; // P2 body ellipse Y for ellipse 2
// variables for Plant 1, 2, and 3's colours
int colourCounter1 = 0;
int colourCounter2 = 0;
int colourCounter3 = 0;
color c = color(200, 173, 144); // plant 1 colour
color f = color(210, 173, 144); // plant 2 colour
color o = color(190, 173, 144); // Plant 3 colour
void setup() {
size (400, 400);
}
void draw() {
background(115, 131, 175); // fill background
drawGrid(); // draw grid
drawWindow(); // draw window
drawTable(); // draw table
shelf(0, 100); // draw shelves
shelf(275, 100);
fertilizer(70, 65, 75, 70); // draw fertilizer
waterPot(333, 65, 66, 70); // draw waterpot
plantCactus(P1BodyRectY, P1BodyRectH, P1BodyEllipseY, c); // draw plant 1 (cactus)
plantFlower(P2BodyRectY, P2BodyRectH, P2BodyEllipse1Y, P2BodyEllipse2Y, f); // draw plant 2 (flower)
plantOther(o); // draw plant 3 (other)
plantChange(); // function for when plants change states either due to fertilizer or waterpot
plantPot(30, 290, 110, 290, 95, 340, 45, 340, 20); //draw plant pots
plantPot(160, 290, 240, 290, 225, 340, 175, 340, 150);
plantPot(290, 290, 370, 290, 355, 340, 305, 340, 280);
fertilizerGrow(); // function for when fertilizer "grows" due to mouse hover
waterPotGrow(); // function for when waterpot "grows" due to mouse hover
}
////////BACKGROUND RELATED FUNCTIONS ////////
// function to draw grid
void drawGrid(){
int gridX1 = 25; // strarting vertical line X value
int gridY1 = 0; // starting vertical line Y value
int gridSpacing = 75; // spacing between each line
int len1 = 330; // ending value of vertical lines
int gridY2 = 25; // starting horizontal line X value
int gridX2 = 0; // starting horizontal line Y value
int len2 = 400; // ending value of horizontal lines
int endLegsX = 400; // maximum length of vertical lines
int endLegsY = 400; // maximum length of horizontal lines
while (gridX1 <= endLegsX) { // when X value of first vertical line of grid is less than or equal to the end length of legs, a new line is drawn
stroke(91, 101, 130);
strokeWeight(3);
line (gridX1, gridY1, gridX1, gridY1 + len1);
gridX1 = gridX1 + gridSpacing;
}
while (gridY2 <= endLegsY){ // when Y value of horizonal first line of grid is less than or equal to the length of legs, a new line is drawn
stroke(91, 101, 130);
line (gridX2, gridY2, gridX2 + len2, gridY2);
gridY2 = gridY2 + gridSpacing;
}
}
// function to draw table
void drawTable(){
fill(103, 114, 145);
rectMode(CORNER);
rect(0, 330, 400, 70);
}
// function to draw window
void drawWindow(){
int sunX = 200; // starting X and Y position of sun
int sunY = 100;
int x = 110; // corner of window (100, 60)
int y = 60;
int w = 180; // width of window
int h = 200; // height of window
noStroke();
fill(182, 232, 239);
rectMode(CORNER);
rect(x, y, w,h);
fill(255);
if (mouseX == 200 && mouseY == 100){ // if mouseX is equal to 200 and mouseY is equal to 100, sun starts at (200, 100)
sunX = 200;
sunY = 100;
ellipse(sunX, sunY, 40, 40);
} else if (mouseX >= x+20 && mouseX <= x+h-40 && mouseY >= y && mouseY <= y+w){ // if mouseX is less than the distance of the window to the wall...
sunX = mouseX;
sunY = 100;
ellipse(sunX, sunY, 40, 40);
} else if (mouseX >= x+20 && mouseX <= x+h-40 && mouseY >= 0 && mouseY <= y){
sunX = mouseX;
sunY = 100;
ellipse(sunX, sunY, 40, 40);
} else if (mouseX >= x+20 && mouseX <= x+h-40 && mouseY >= y+h && mouseY <=400){
sunX = mouseX;
sunY = 100;
ellipse(sunX, sunY, 40, 40);
} else if (mouseX <= 130){ // if mouseX is less than or equal to 130, sun's position is 130, 100
sunX = 130;
sunY = 100;
ellipse(sunX, sunY, 40, 40);
} else if (mouseX >=270){ // if mouseX is more than or equal to 270, sun's position is 270, 100
sunX = 270;
sunY = 100;
ellipse(sunX, sunY, 40, 40);
}
fill(153, 163, 193); // window frame rectangles
rectMode(CORNER);
rect(110, 50, 15, 200);
rect(275, 50, 15, 200);
rect(98, 250, 200, 15);
rect(110, 50, 175, 15);
rect(110, 120, 175, 10);
rect(110, 180, 175, 10);
rect(195, 50, 10, 200);
}
// function to draw shelf
void shelf(float x, float y) {
fill(99, 113, 153);
rectMode(CORNER);
rect(x, y, 125, 10);
}
// function to draw plant pots
void plantPot(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4, float r1){
noStroke();
fill (81, 88, 107);
quad(x1, y1, x2, y2, x3, y3, x4, y4);
rectMode(CORNER);
rect(r1, 280, 100, 10);
}
////////WATER POT RELATED FUNCTIONS ////////
// function to draw waterpot pot
void waterPot(float x5, float y5 , float w5, float h5) {
int quadX1 = 300; int quadY1 = 50; // variables for water pot's spout
int quadX2 = 300; int quadY2 = 80;
int quadX3 = 280; int quadY3 = 30;
int quadX4 = 290; int quadY4 = 30;
noStroke();
fill(168, 174, 193);
rectMode(CENTER);
rect(x5, y5, w5, h5);
quad(quadX1, quadY1, quadX2, quadY2, quadX3, quadY3, quadX4, quadY4);
}
void waterPotGrow(){ // make water pot bigger when mouse hovers over it
int quadX1 = 300; int quadY1 = 50; // variables for water pot's spout
int quadX2 = 300; int quadY2 = 80;
int quadX3 = 280; int quadY3 = 30;
int quadX4 = 290; int quadY4 = 30;
int x = 333; // water pot rect x value
int y = 65; // water pot rect y value
float w = 66; // water pot width
float h = 70; // water pot height
int waterX = mouseX; // water droplet x value
int waterY = mouseY; // water droplet y value
if (mousePressed && mouseX >= quadX1 && mouseX <= quadX1 + w && mouseY >= quadY3 && mouseY <=quadY3 + h){ //water pot follows mouse when mouse presses on it
fill(168, 174, 193);
w = w + 5;
h = h + 5;
waterPot(x, y, w, h);
quad(quadX1, quadY1, quadX2, quadY2, quadX3, quadY3, quadX4, quadY4);
doWaterPotGrow = true;
}else if (mouseX >= quadX1 && mouseX <= quadX1 + w && mouseY >= quadY3 && mouseY <=quadY3 + h){ // if mouse hovers water pot, water pot it enlarges
w = w + 4;
h = h + 4;
waterPot(x -2, y -2, w, h);
quad(quadX1 -4, quadY1 , quadX2 -4, quadY2, quadX3 -4, quadY3, quadX4 -4, quadY4);
doWaterPotGrow = false;
}
if (doWaterPotGrow == true && mouseX >= 0 && mouseX <= 400 && mouseY >= 0 && mouseY <= 400){ // if water pot is clicked, water falls
x = mouseX; // water pot X follows mouse when water pot is clicked
y = mouseY; // water pot Y follows mouse when water pot is clicked
waterPot(x, y, w, h);
quad(quadX1 - 333 + mouseX, quadY1 - 65 + mouseY, quadX2 - 333 + mouseX, quadY2 - 65 + mouseY, quadX3 - 333 + mouseX, quadY3 - 65 + mouseY, quadX4 - 333 + mouseX, quadY4 - 65 + mouseY);
fill(168, 174, 193);
waterY = waterY/5 + mouseY++; // water droplet Y is water droplet's value divided by 5, with mouseY + 1 value added
fill(255);
ellipseMode(CENTER);
ellipse(waterX - 40 , waterY, 10, 10);
ellipse(waterX - 45 , waterY - 50, 10, 10);
ellipse(waterX + 5 - 40, waterY + 10, 10, 10);
ellipse(waterX - 15 - 40, waterY + 30, 10, 10);
}
if (doFertilizerGrow == true){ // if fertilizer is already selected, waterpot isn't allowed to be selected
doWaterPotGrow = false;
}
}
////////FERTILIZER RELATED FUNCTIONS ////////
void fertilizer(float fX, float fY, float w, float h) { // draw basic fertilizer
fill(112, 111, 119);
noStroke();
rectMode(CENTER);
rect(fX, fY, w, h);
}
void fertilizerGrow(){
float x = 70; // fertilizer rect's x
float y = 65; // fertilizer rect's y
float w = 75; // fertilizer width
float h = 70; // fertilizer height
int fcX = mouseX; // fertilizer cube x
int fcY = mouseY; // fertilizer cube y
if (mousePressed && mouseX >= 25 && mouseX <= 25 + w && mouseY >= 30 && mouseY <= 30 + h){
doFertilizerGrow = true;
w = 80;
h = 75;
fertilizer (x, y, w, h);
} else if (mouseX >= 25 && mouseX <= 25 + w && mouseY >= 30 && mouseY <= 30 + h){ // when mouse hovers fertilizer, it grows
fill(112, 111, 119);
x = 70;
y = 65;
w = 80;
h = 75;
fertilizer(x, y, w, h);
doFertilizerGrow = false;
}
if (doFertilizerGrow == true && mouseX >= 0 && mouseX <= 400 && mouseY >=0 && mouseY <=400){
x = mouseX;
y = mouseY;
fertilizer(x, y, w, h);
fill(186, 196, 209);
fcY = mouseY/5 + mouseY++;
rectMode(CENTER);
rect(fcX, fcY, 10,10); // small cube
rect(fcX + 5, fcY + 10, 10,10);
rect(fcX - 15, fcY + 30, 10,10);
}
if (doWaterPotGrow == true){ // if water pot is already selected, fertilizer isn't allowed to be selected
doFertilizerGrow = false;
}
}
////////PLANT RELATED FUNCTIONS ////////
// function for 1st plant (cactus)
void plantCactus(int P1BodyRectY, int P1BodyRectH, float P1BodyEllipseY, color c) {
noStroke();
fill(c);
rectMode(CENTER);
rect(70, P1BodyRectY, 40, P1BodyRectH); // main body of cactus
ellipseMode(CENTER);
ellipse(70, P1BodyEllipseY, 40, 30); // main top of cactus
rectMode(CORNER);
rect(90, 260, 20, 10);
rect(100, 250, 10, 10);
ellipseMode(CENTER);
ellipse(105, 250, 10, 10);
rectMode(CORNER);
rect(30, 245, 20, 10);
rect(30, 235, 10, 10);
ellipseMode(CENTER);
ellipse(35, 235, 10, 10);
}
// function for 2nd plant (flower)
void plantFlower(int P2BodyRectY, float P2BodyRectH, float P2BodyEllipse1Y, float P2BodyEllipse2Y, color f) {
noStroke();
fill(f);
rectMode(CENTER);
rect(200, P2BodyRectY, 5, P2BodyRectH);
ellipseMode(CENTER);
ellipse(200, P2BodyEllipse1Y, 20, 20);
ellipse(200, P2BodyEllipse2Y, 15, 15);
}
// function for 3rd plant (other)
void plantOther(color o) {
stroke(o);
strokeWeight(10);
line(300, 230, 335, 325);
line(320, 210, 330, 325);
}
// functions dealing with changing states of plants
void plantChange(){
int Ax = 0; // area above plant 1 (from 0 - 132)
int Bx = 133; // area above plant 2 (from 133 - 266)
int Cx = 267; // area above plant 3 (from 267 - 400)
int y = 129; // y value areas above plants
int w = 133; // widths of areas above plants
int h = 150; // heights of areas above plants
noStroke(); // Area A (area 1)
noFill();
rectMode(CORNER);
rect(Ax, y, w, h);
noFill(); // Area B (area 2)
rectMode(CORNER);
rect(Bx, y, w + 1, h);
noFill(); // Area C (area 3)
rectMode(CORNER);
rect(Cx, y, w, h);
///// when fertilizer is over certain areas, colours change //////
if (doFertilizerGrow == true && mouseX >= Ax && mouseX <= Bx && mouseY >=y && mouseY <= y+h){ // When fertilizer is above Area A, colour of plant 1 changes
color c = color(130, 173, 144);
plantCactus(P1BodyRectY, P1BodyRectH, P1BodyEllipseY, c);
}
if (doFertilizerGrow == true && mouseX >= Bx && mouseX <= Cx && mouseY >= y && mouseY <=y+h){ // When fertilizer is above Area B, colour of plant 2 changs
color f = color(110, 173, 144);
plantFlower( P2BodyRectY, P2BodyRectH, P2BodyEllipse1Y, P2BodyEllipse2Y, f);
}
if (doFertilizerGrow == true && mouseX >= Cx && mouseX <=Ax+Bx+Cx && mouseY >= y && mouseY <=y+h){ // When fertilizer is above Area C, colour of plant 3 changes
color o = color(130, 173, 144);
stroke(o);
plantOther(o);
}
//// when water is over certain areas, y and heights of plants change//
if (doWaterPotGrow == true && mouseX >= Ax && mouseX <= Bx && mouseY >=y && mouseY <= y+h){ // When waterpot is above Area A, height of plant changes
P1BodyRectH = constrain( P1BodyRectH, 0, 100); //
P1BodyEllipseY = constrain( P1BodyEllipseY, 220, 235);
for (int i = 0; i<300; i++);
P1BodyRectH = P1BodyRectH + 1;
P1BodyEllipseY = P1BodyEllipseY - 0.5;
plantCactus(P1BodyRectY, P1BodyRectH, P1BodyEllipseY, c);
y--;
}
if (doWaterPotGrow == true && mouseX >=Bx && mouseX <= Cx && mouseY >= y && mouseY <= y + h){ // When water pot is above Area B, height of plant 2 changes
P2BodyRectH = constrain( P2BodyRectH, 0, 155);
P2BodyEllipse1Y = constrain ( P2BodyEllipse1Y, 165, 210);
P2BodyEllipse2Y = constrain ( P2BodyEllipse2Y, 178, 228);
for (int i = 0; i<300; i++);
P2BodyRectH = P2BodyRectH + 1;
P2BodyEllipse1Y = P2BodyEllipse1Y - 0.5;
P2BodyEllipse2Y = P2BodyEllipse2Y - 0.5;
plantFlower(P2BodyRectY, P2BodyRectH, P2BodyEllipse1Y, P2BodyEllipse2Y, f);
}
if (doWaterPotGrow == true && mouseX >=Cx && mouseX <=Ax+Bx+Cx && mouseY >=y && mouseY <y+h){ // When water pot is above Area C, plant 3 is changed to a random colour
color o = color(random(255), random (255), random (255));
stroke(o);
plantOther(o);
}
}