/*
Interactive Toy Assignment
Target Shot
By: Jonah GM
How to play:
Objective: Shoot the brown wooden planks for points
CONTROLS:
-move cursor/rectile to left or right of screen to move left and right
-Click to shoot
-To reload, simply Click when out of ammo
Other Info:
-You have a one minute time limit to recieve a score
-When the time is up, click the red square to play again
-Your score is printed as text
-You can't shoot without a bullet in the chamber :b
Other-Other :b
-There is one known bug, that being sometimes the target will not die and the player
will not recieve a point. To fix that, simply move left or right slightly, then shoot target
-Dev Cheat: Hold mouse click after shooting a target to recieve highest possible score
*/
//User defined variables
//Int(Whole Numbers) Boolean(True/False) Float(Decimal Numbers)
int lookLeftRight;
int bulletsShot = 0;
int score = 0;
int timer = 60000;
boolean bullet1=true;
boolean bullet2=true;
boolean bullet3=true;
boolean bullet4=true;
boolean bullet5=true;
boolean ammo = true;
boolean targetAlive = true;
//Random(Random number between given# and given#)
//w=width h=height
float targetxw = random(5, 100);
float targetyh = random(1, 100);
float targetx = random(60, 740);
float targety = random(60, 290);
float hitBoxx = 0;
float hitBoxy = 0;
float hitBoxxw = 0;
float hitBoxyh = 0;
//Setup (Done Once)
void setup () {
//Size of applet
size(400, 400);
//Don't show cursor
noCursor();
//No outline on screen
noStroke();
}
//Draw (Done Constantly)
void draw() {
//Backround Colour of white
background(255);
//Call user defined functions
drawBackground();
drawTarget();
drawBooth();
drawBullets();
drawCrosshair();
scrollFunction();
bulletsFunction();
targetShotFunction();
hitBoxFunction();
scoreFunction();
timeFunction ();
}
//Define "drawCrosshair"
void drawCrosshair () {
fill(0);
rect(mouseX-3, mouseY-3, 5, 5);
rect(mouseX-3, mouseY-35, 5, 25);
rect(mouseX-3, mouseY+10, 5, 25);
rect(mouseX-38, mouseY-3, 25, 5);
rect(mouseX+13, mouseY-3, 25, 5);
}
//Define "drawBooth"
void drawBooth() {
//Top Bar
stroke(1);
fill(200);
rect(0, 0, 800, 50);
//Left Side Bar
fill(190);
rect(0+lookLeftRight, 0, 50, 400);
//Right Side Bar
rect(750+lookLeftRight, 0, 50, 400);
//Bottom Bar
fill(170);
rect(0, 330, 400, 400);
//Individual Steel Planks
fill(0);
//Front Bar Look Over
fill(190);
rect(50+lookLeftRight, 300, 700, 30);
//Starting at 10, at a limit of 800 pixels on grid, continously draw code
//below in 20 pixel intervals
for (int i=10; i<800; i += 20) {
line(i+lookLeftRight, 330, i+lookLeftRight, 400);
}
}
//Define "drawBullets"
void drawBullets() {
//First Bullet
if (bullet1 == true) {
fill(191, 22, 22);
rect(30, 10, 20, 20);
fill(213, 187, 43);
rect(30, 30, 20, 10);
} else if (bullet1 == false) {
noFill();
stroke(1);
rect(30, 10, 20, 30);
}
//Second Bullet
if (bullet2 == true) {
fill(191, 22, 22);
rect(60, 10, 20, 20);
fill(213, 187, 43);
rect(60, 30, 20, 10);
} else if (bullet2 == false) {
noFill();
stroke(1);
rect(60, 10, 20, 30);
}
//Third Bullet
if (bullet3 == true) {
fill(191, 22, 22);
rect(90, 10, 20, 20);
fill(213, 187, 43);
rect(90, 30, 20, 10);
} else if (bullet3 == false) {
noFill();
stroke(1);
rect(90, 10, 20, 30);
}
//Fourth Bullet
if (bullet4 == true) {
fill(191, 22, 22);
rect(120, 10, 20, 20);
fill(213, 187, 43);
rect(120, 30, 20, 10);
} else if (bullet4 == false) {
noFill();
stroke(1);
rect(120, 10, 20, 30);
}
//Fifth Bullet
if (bullet5 == true) {
fill(191, 22, 22);
rect(150, 10, 20, 20);
fill(213, 187, 43);
rect(150, 30, 20, 10);
} else if (bullet5 == false) {
noFill();
stroke(1);
rect(150, 10, 20, 30);
}
noStroke();
}
//Define "scrollFunction"
void scrollFunction() {
//If the mouse is less than -NUMBER-, execute code below
if (mouseX < width/9) {
lookLeftRight = lookLeftRight +10;
//If the mouse is more than -NUMBER-, execute code below
} else if (mouseX > width/1.1) {
lookLeftRight = lookLeftRight -10;
}
//Limit variable lookLeftRight to -400 and 0
lookLeftRight = constrain(lookLeftRight, -400, 0);
}
//Define "bulletFunction"
void bulletsFunction () {
//Shooting Bullets
//frameCount: If -NUMBER- frames pass, execute code below (By default, there is
//60 frames per second
if (mousePressed && bullet5 == true && frameCount > bulletsShot + 10) {
bullet5 = false;
bulletsShot = frameCount;
} else if (mousePressed && bullet5 == false && bullet4 == true && frameCount > bulletsShot + 10) {
bullet4 = false;
bulletsShot = frameCount;
} else if (mousePressed && bullet4 == false && bullet3 == true && frameCount > bulletsShot + 10) {
bullet3 = false;
bulletsShot = frameCount;
}
if (mousePressed && bullet3 == false && bullet2 == true && frameCount > bulletsShot + 10) {
bullet2 = false;
bulletsShot = frameCount;
}
if (mousePressed && bullet2 == false && bullet1 == true && frameCount > bulletsShot + 10) {
bullet1 = false;
bulletsShot = frameCount;
}
//Reload
if (mousePressed && bullet1 == false && frameCount > bulletsShot + 60) {
bullet1 = true;
bullet2 = true;
bullet3 = true;
bullet4 = true;
bullet5 = true;
bulletsShot = frameCount;
}
}
//Define "drawTarget"
void drawTarget() {
if (targetAlive == true) {
fill(136, 71, 38);
rect(targetx+lookLeftRight, targety, targetxw, targetyh);
}
//Give the target new values to spawn elsewhere
if (targetAlive == false) {
targetxw = random(5, 100);
targetyh = random(1, 100);
targetx = random(60, 740);
targety = random(60, 290);
}
}
//Define "hitBoxFunction"
void hitBoxFunction() {
if (targetAlive == true) {
hitBoxx = targetx+lookLeftRight;
hitBoxy = targety;
hitBoxxw = targetx + targetxw+lookLeftRight;
hitBoxyh = targety + targetyh;
}
}
//Define "targetShotFunction"
void targetShotFunction() {
//No ammo
if (bullet1 == false && frameCount > bulletsShot + 60) {
ammo = false;
//Has ammo
} else if (bullet1==true && frameCount > bulletsShot + 60) {
ammo = true;
}
//If specified requirements are met, the target has been shot
if (mouseX>=hitBoxx && mouseX<=hitBoxxw && mouseY>=hitBoxy && mouseY<=hitBoxyh && mousePressed && targetAlive==true && ammo ==true) {
fill(255, 253, 57);
rect(0, 0, 400, 400);
targetAlive = false;
}
//Respawn the target
if (targetAlive==false && frameCount > bulletsShot + 60) {
targetAlive=true;
}
}
//Define "scoreFunction"
void scoreFunction() {
//Add to player's score when the target has been killed
if (targetAlive == false && frameCount > bulletsShot + 59) {
score = score + 1;
println("Score:" +score);
}
//I'd use the code below if it were in Chapter1-7, but sadly it's not. :b
//text("Score:" +score, 300,20);
}
//Define "timeFunction"
void timeFunction () {
int time=0;
time = time+millis();
if (time > timer) {
fill(255);
rect(0, 0, 400, 400);
cursor();
println("GG. Your score is "+score+". Click the red box to play again!");
fill(220, 0, 0);
rect(150, 150, 100, 100);
//Reset score, ammo, and have new timer limit so player can play again
if (mouseX>=150 && mouseX<=250 && mouseY>=150 && mouseY<=250 && mousePressed) {
timer = 60000 + millis();
score = 0;
bullet1 = true;
bullet2 = true;
bullet3 = true;
bullet4 = true;
bullet5 = true;
noCursor();
}
}
//Developer tool
//println(millis());
}
//Define "drawBackground"
void drawBackground() {
fill(24, 197, 255);
rect(0, 0, 400, 70);
fill(55, 193, 239);
rect(0, 70, 400, 20);
fill(52, 187, 232);
rect(0, 90, 400, 20);
fill(47, 189, 44);
rect(0, 110, 400, 300);
}
/*
REFERANCE
Understanding how to use millis()
https://stackoverflow.com/questions/12417937/create-a-simple-countdown-in-processing
*/