//Gold digging! Interactive Toy
//Zhipu Chen
//10/2/2017 10h TimeSpt
//State position variables for rope
float ropeY;
//State position variables for machine
float machineX, machineY;
float machineSizeX, machineSizeY;
//Variable for machine, bricks and rope's movement speed
int machineSpeed, ropeSpeed, gold1Speed, gold2Speed, gold3Speed, gold4Speed, gold5Speed;
//State variables for gold bricks
float gold1Y, gold2Y, gold3Y, gold4Y, gold5Y, gold1X, gold2X, gold3X, gold4X, gold5X;
float gold1SizeY, gold2SizeY, gold3SizeY, gold4SizeY, gold5SizeY, gold1SizeX, gold2SizeX, gold3SizeX, gold4SizeX, gold5SizeX;
//State variables for the rope status and the bricks status
boolean ropeLosed;
boolean ropeHooked;
boolean gold1Hooked, gold2Hooked, gold3Hooked, gold4Hooked, gold5Hooked;
void setup()
{
frameRate(60);
size(400, 400);
//Set machine position
machineSizeX=20;
machineSizeY=20;
//Set speed
machineSpeed=5;
ropeSpeed=3;
gold1Speed=1;
gold2Speed=2;
gold3Speed=3;
gold4Speed=4;
gold5Speed=5;
//Set the machine position
machineX=width/2;
machineY=40;
//The rope's end is on the machine
ropeY=machineY;
//Initial rope and bricks status
ropeLosed=false;
gold1Hooked=false;
gold2Hooked=false;
gold3Hooked=false;
gold4Hooked=false;
gold5Hooked=false;
generateGoldBricks();
}
void draw()
{
background(225);
drawBackgrounds();
machineWave();
hookBricks();
moveRope();
moveBricks();
drawGoldBricks();
}
void drawBackgrounds()
{
noStroke();
fill(150, 90, 0);
rect(0, 60, width, 60);
fill(130, 70, 39);
rect(0, 120, width, 60);
fill(115, 60, 39);
rect(0, 180, width, 60);
fill(100, 40, 39);
rect(0, 240, width, 60);
fill(90, 30, 39);
rect(0, 300, width, 60);
fill(60, 15, 39);
rect(0, 360, width, 60);
}
//Generate Bricks randomly
void generateGoldBricks()
{
rectMode(CORNER);
gold1Y=random(80, height);
gold2Y=random(80, height);
gold3Y=random(80, height);
gold4Y=random(80, height);
gold5Y=random(80, height);
gold1X=random(80, 350);
gold2X=random(80, 350);
gold3X=random(80, 350);
gold4X=random(80, 350);
gold5X=random(80, 350);
gold1SizeY=random(10, 70);
gold2SizeY=random(10, 70);
gold3SizeY=random(10, 70);
gold4SizeY=random(10, 70);
gold5SizeY=random(10, 70);
gold1SizeX=random(10, 70);
gold2SizeX=random(10, 70);
gold3SizeX=random(10, 70);
gold4SizeX=random(10, 70);
gold5SizeX=random(10, 70);
}
void drawGoldBricks()
{
rectMode(CORNER);
strokeWeight(3);
stroke(150, 150, 100);
//Gold
fill(200, 200, 10);
//Draw gold bricks if they have not been hooked up yet
if (!checkHookedUp(gold1Y))
{
rect(gold1X, gold1Y, gold1SizeX, gold1SizeY);
}
if (!checkHookedUp(gold2Y))
{
rect(gold2X, gold2Y, gold2SizeX, gold2SizeY);
}
if (!checkHookedUp(gold3Y))
{
rect(gold3X, gold3Y, gold3SizeX, gold3SizeY);
}
if (!checkHookedUp(gold4Y))
{
rect(gold4X, gold4Y, gold4SizeX, gold4SizeY);
}
if (!checkHookedUp(gold5Y))
{
rect(gold5X, gold5Y, gold5SizeX, gold5SizeY);
}
}
void machineWave()
{
//Move the machine, stop the machine when losing the rope
if (!mousePressed&&ropeY==machineY)
{
machineX+=machineSpeed;
}
//prevent the machine moving out of screen
if (machineX>width||machineX<0)
{
machineSpeed*=-1;
}
ellipseMode(CENTER);
//Fill with green when all gold bricks have been picked up
if (gold1Y==0&&gold2Y==0&&gold3Y==0&&gold4Y==0&&gold5Y==0)
{
stroke(0);
//green
fill(0, 225, 0);
}
//Fill with blue while machine is waving
else if (ropeY==machineY)
{
stroke(0);
//blue
fill(0, 0, 225);
} else
{
//Fill with red when machine is oprating
stroke(0);
//red
fill(225, 0, 0);
}
ellipse(machineX, machineY, machineSizeX, machineSizeY);
}
void moveRope()
{
//Press mouse to lose the rope
if (mousePressed)
{
ropeLosed=true;
}
//Rope keeps going down if no object was hit
if (ropeLosed&&!ropeHooked)
{
ropeY+=ropeSpeed;
//Roll back the rope when it hits the bottom
if (ropeY>=height)
{
ropeLosed=false;
}
} else
{
ropeY-=ropeSpeed;
}
//Set rope max length
ropeY=constrain(ropeY, 40, height);
stroke(0);
strokeWeight(2);
line(machineX, machineY, machineX, ropeY);
}
//Check if the rope hit any brick
boolean hitCheck(float ropeBotX, float ropeBotY, float brickX, float brickY, float brickSizeX, float brickSizeY)
{
if (ropeBotX>=brickX && ropeBotX<=brickX+brickSizeX && ropeBotY>=brickY&&ropeBotY<=brickY+brickSizeY)
{
return true;
} else
{
return false;
}
}
//To check if the brick has been hooked up
boolean checkHookedUp(float brickY)
{
if (brickY<=machineY)
return true;
else
return false;
}
//Drag bricks up when the rope hits them
void hookBricks()
{
if (hitCheck(machineX, ropeY, gold1X, gold1Y, gold1SizeX, gold1SizeY)==true&&ropeHooked==false)
{
gold1Hooked=true;
ropeHooked=true;
ropeLosed=false;
} else if (hitCheck(machineX, ropeY, gold2X, gold2Y, gold2SizeX, gold2SizeY)==true&&ropeHooked==false)
{
gold2Hooked=true;
ropeHooked=true;
ropeLosed=false;
} else if (hitCheck(machineX, ropeY, gold3X, gold3Y, gold3SizeX, gold3SizeY)==true&&ropeHooked==false)
{
gold3Hooked=true;
ropeHooked=true;
ropeLosed=false;
} else if (hitCheck(machineX, ropeY, gold4X, gold4Y, gold4SizeX, gold4SizeY)==true&&ropeHooked==false)
{
gold4Hooked=true;
ropeHooked=true;
ropeLosed=false;
} else if (hitCheck(machineX, ropeY, gold5X, gold5Y, gold5SizeX, gold5SizeY)==true&&ropeHooked==false)
{
gold5Hooked=true;
ropeHooked=true;
ropeLosed=false;
}
if (gold1Hooked)
{
gold1Y=ropeY;
if (checkHookedUp(gold1Y))
{
//Erase the brick once it's hooked up
ropeHooked=false;
gold1Hooked=false;
gold1Y=0;
gold1X=0;
gold1SizeX=0;
gold1SizeY=0;
}
} else if (gold2Hooked)
{
gold2Y=ropeY;
if (checkHookedUp(gold2Y))
{
ropeHooked=false;
gold2Hooked=false;
gold2Y=0;
gold2X=0;
gold2SizeX=0;
gold2SizeY=0;
}
} else if (gold3Hooked)
{
gold3Y=ropeY;
if (checkHookedUp(gold3Y))
{
ropeHooked=false;
gold3Hooked=false;
gold3Y=0;
gold3X=0;
gold3SizeX=0;
gold3SizeY=0;
}
} else if (gold4Hooked)
{
gold4Y=ropeY;
if (checkHookedUp(gold4Y))
{
ropeHooked=false;
gold4Hooked=false;
gold4Y=0;
gold4X=0;
gold4SizeX=0;
gold4SizeY=0;
}
} else if (gold5Hooked)
{
gold5Y=ropeY;
if (checkHookedUp(gold5Y))
{
ropeHooked=false;
gold5Hooked=false;
gold5Y=0;
gold5X=0;
gold5SizeX=0;
gold5SizeY=0;
}
}
}
//Make bricks run in different speed
void moveBricks()
{
if (!gold1Hooked)
{
gold1X+=gold1Speed;
if (gold1X>width||gold1X<0)
{
gold1Speed*=-1;
}
}
if (!gold2Hooked) {
gold2X+=gold2Speed;
if (gold2X>width||gold2X<0)
{
gold2Speed*=-1;
}
}
if (!gold3Hooked) {
gold3X+=gold3Speed;
if (gold3X>width||gold3X<0)
{
gold3Speed*=-1;
}
}
if (!gold4Hooked) {
gold4X+=gold4Speed;
if (gold4X>width||gold4X<0)
{
gold4Speed*=-1;
}
}
if (!gold5Hooked) {
gold5X+=gold5Speed;
if (gold5X>width||gold5X<0)
{
gold5Speed*=-1;
}
}
}