/* Interactive Toy Assinment
Rachel Theil
PROG Lindy
991396531
*/
//declare variables
boolean targetVisable = true;
int shapeSize = 50;
int timer = 0;
int visableTime = 60;
int numberOfTargets = int(random(2, 6));
int backgroundColo = 255;
float x = 0;
float y = 0;
//positions of all of targets
PVector[] positions = new PVector[numberOfTargets];
// the save data for if targets are hit in different spots
boolean[] targetHit = new boolean[numberOfTargets];
boolean[] targetSuperHit = new boolean[numberOfTargets];
boolean[] targetCritHit = new boolean[numberOfTargets];
//check if a target is hit or not
boolean[] hit = new boolean[numberOfTargets];
//setup+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void setup() {
//create the window
size (400, 400);
background(255);
}
//draw the program ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void draw() {
//clear the background every frame and redraw it
//clear();
background(backgroundColo);
//make targets that appear and disapear after a certian time
if (targetVisable) {
//when the time is at the beginning make a new set of targets and cooardinates for each
if (timer == 0) {
//create a random number of target each round
numberOfTargets = int(random(2, 6));
//replace the number of targets in the the arrays to get the proper length for each array
positions = new PVector[numberOfTargets];
targetHit = new boolean[numberOfTargets];
targetSuperHit = new boolean[numberOfTargets];
targetCritHit = new boolean[numberOfTargets];
hit = new boolean[numberOfTargets];
//draw the number of targets spesified by numberOfTargets
for (int i=0; i<positions.length; i++) {
//set the x and y values for each target and then draw them on the first frame
x = random(35, 366);
y = random(35, 366);
positions[i] = new PVector(x, y);
//check the staus of each target and draw the approiate one
checkTargets(i);
}
}
//redraw each target for each frame
else if (timer > 0) {
for (int i=0; i<positions.length; i++) {
//check the staus of each target and draw the approiate one
checkTargets(i);
}
}
//make the background colour darken over time to make a visual timer
backgroundColo = backgroundColo - 2;
}
//if the timer dose not equal the total time then increase the timer
if (timer != visableTime *3.5) {
timer++;
}
//once the target is visable for a short time make it invisable
if (timer == visableTime * 2) {
targetVisable = false;
//make the backgound colour black when the time is up
backgroundColo = 0;
//reset all targets upon the cut to balck
for (int k = 0; k < positions.length; k++) {
targetHit[k] = false;
targetSuperHit[k] = false;
targetCritHit[k] = false;
hit[k] = false;
}
}
//then make new targets after a short time and reset the timer
else if (timer == visableTime * 3.5) {
targetVisable = true;
timer = 0;
//reset the background colour
backgroundColo = 255;
}
}
//check the status of each target++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void checkTargets(int arrayNumber) {
//if the target is not hit then make a gray target
if (targetHit[arrayNumber] == false) {
drawTarget(positions[arrayNumber]);
}
//if the target is hit in the centre turn it green
else if (targetCritHit[arrayNumber] == true) {
drawCritTarget(positions[arrayNumber]);
// make it so the target can only be hit once
hit[arrayNumber] = true;
}
//if the target is hit in the middle ring turn it cyan
else if (targetSuperHit[arrayNumber] == true) {
drawSuperTarget(positions[arrayNumber]);
// make it so the target can only be hit once
hit[arrayNumber] = true;
}
//if the target is hit in the outer ring then make a dark blue target
else if (targetHit[arrayNumber] == true) {
drawHitTarget(positions[arrayNumber]);
// make it so the target can only be hit once
hit[arrayNumber] = true;
}
//if all the targets are clicked then make them yellow
if (checkAllValues(targetHit) == true) {
drawAllHitTarget(positions[arrayNumber]);
}
}
//Make a square gray target+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void drawTarget(PVector position) {
//if the target is not hit then make a gray target
fill(70);
rect(position.x-(shapeSize/2), position.y-(shapeSize/2), shapeSize, shapeSize );
fill(180);
rect(position.x -(shapeSize/3), position.y -(shapeSize/3), shapeSize/1.5, shapeSize/1.5);
fill(255);
rect(position.x-(shapeSize/8), position.y-(shapeSize/8), shapeSize/4, shapeSize/4);
}
//make a hit blue target++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void drawHitTarget(PVector position) {
//if the target is hit in the outer ring make it blue
fill(124, 149, 245);
rect(position.x-(shapeSize/2), position.y-(shapeSize/2), shapeSize, shapeSize );
fill(43, 62, 137);
rect(position.x -(shapeSize/3), position.y -(shapeSize/3), shapeSize/1.5, shapeSize/1.5);
fill(31, 31, 64);
rect(position.x-(shapeSize/8), position.y-(shapeSize/8), shapeSize/4, shapeSize/4);
}
//make a hit cyan target++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void drawSuperTarget(PVector position) {
//if the target is hit in the middle make it cyan
fill(124, 245, 242);
rect(position.x-(shapeSize/2), position.y-(shapeSize/2), shapeSize, shapeSize );
fill(60, 152, 150);
rect(position.x -(shapeSize/3), position.y -(shapeSize/3), shapeSize/1.5, shapeSize/1.5);
fill(23, 72, 80);
rect(position.x-(shapeSize/8), position.y-(shapeSize/8), shapeSize/4, shapeSize/4);
}
//make a hit green target++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void drawCritTarget(PVector position) {
//if the target is hit in the centre ring make it green
fill(198, 255, 220);
rect(position.x-(shapeSize/2), position.y-(shapeSize/2), shapeSize, shapeSize );
fill(98, 191, 134);
rect(position.x -(shapeSize/3), position.y -(shapeSize/3), shapeSize/1.5, shapeSize/1.5);
fill(32, 100, 59);
rect(position.x-(shapeSize/8), position.y-(shapeSize/8), shapeSize/4, shapeSize/4);
}
//make a yellow target when all targets are hit++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void drawAllHitTarget(PVector position) {
//if all targets are hit make them yellow
fill(251, 252, 156);
rect(position.x-(shapeSize/2), position.y-(shapeSize/2), shapeSize, shapeSize );
fill(183, 150, 78);
rect(position.x -(shapeSize/3), position.y -(shapeSize/3), shapeSize/1.5, shapeSize/1.5);
fill(106, 88, 50);
rect(position.x-(shapeSize/8), position.y-(shapeSize/8), shapeSize/4, shapeSize/4);
}
//checked if the targets are hit++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void mousePressed() {
//if a target is clicked then make that target's state be hit depending on where its clicked
for (int j = 0; j<positions.length; j++) {
if(hit[j] == false) {
//check for outer ring boundaries
if (targetVisable && mouseX >= positions[j].x-(shapeSize/2)&& mouseX <= positions[j].x+(shapeSize/2) && mouseY <= positions[j].y+(shapeSize/2) && mouseY >= positions[j].y-(shapeSize/2)) {
targetHit[j] = true;
}
//check middle ring boundaries
if (targetVisable && mouseX >= positions[j].x-(shapeSize/3)&& mouseX <= positions[j].x+(shapeSize/3) && mouseY <= positions[j].y+(shapeSize/3) && mouseY >= positions[j].y-(shapeSize/3)) {
targetSuperHit[j] = true;
}
//check centre ring boundaries
if (targetVisable && mouseX >= positions[j].x-(shapeSize/8)&& mouseX <= positions[j].x+(shapeSize/8) && mouseY <= positions[j].y+(shapeSize/8) && mouseY >= positions[j].y-(shapeSize/8)) {
targetCritHit[j] = true;
}
}
}
}
// check if all the targets get hit ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
boolean checkAllValues(boolean [] array) {
for (int i = 0; i < array.length; i ++) {
// if a target is not hit then return false
if (array[i] == false) {
return false;
}
}
// if all targets are hit then return true
return true;
}