/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.TmKYsUi9LqY/rev.115
*
* authors:
* Dan Ha
*
*
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
int level = 1;
int maxLevel= 4;
int numWalls;
int gunProjectileOffset = 30;
Goal goal;
int numGuns;
Gun[] gun;
Target target;
Wall[] walls;
boolean drawBG = true;
int width = 1024, height = 690;
float maxVel = 10;
int INSTR_state = -2;
int HOME_state = -1;
int START_state = 0;
int WIN_state = 1;
int LOSE_state = 2;
int state = WIN_state;
int lives;
int CAN_FIRE_state = 0;
int BALL_IN_PLAY_state = 1;
int turn_state = CAN_FIRE_state;
PImage playAgain, nextLevel;
PImage youLose, youWin;
PImage fishdownimg, fishleftimg, fishrightimg, fishimg;
PImage fire;
PImage backgroundImage, home, turtle, life, seaweed, seaweedHoriz, level1, level2, level3, level4, quit, instructions;
String URLDirectory = "http://stanford.edu/~andien/CS147/data/";
//String URLDirectory = "";
void setup() {
size(1024, 690, P2D);
playAgain = loadImage(URLDirectory + "playAgain.png");
youLose = loadImage(URLDirectory + "lose.png");
youWin = loadImage(URLDirectory + "win.jpg");
nextLevel = loadImage(URLDirectory + "nextLevel.png");
fire = loadImage(URLDirectory + "swimButton.png");
backgroundImage = loadImage(URLDirectory + "background.jpg");
turtle = loadImage(URLDirectory + "turtle.png");
life = loadImage(URLDirectory + "life.png");
seaweed = loadImage(URLDirectory + "seaweed.png");
seaweedHoriz = loadImage(URLDirectory + "seaweedHoriz.png");
level1 = loadImage(URLDirectory + "level1.png");
level2 = loadImage(URLDirectory + "level2.png");
level3 = loadImage(URLDirectory + "level3.png");
level4 = loadImage(URLDirectory + "level4.png");
quit = loadImage(URLDirectory + "quit.png");
home = loadImage(URLDirectory + "home.jpg");
instructions = loadImage(URLDirectory + "instructions.jpg");
fishdownimg = loadImage(URLDirectory + "fishDown.png");
fishleftimg = loadImage(URLDirectory + "fishLeft.png");
fishimg = loadImage(URLDirectory + "fish.png");
fishrightimg = loadImage(URLDirectory + "fishRight.png");
state = HOME_state;
reset();
}
void reset(){
lives = 5;
drawBG = true;
size(1024, 690, P2D);
Brain brain = new Brain(level);
gun = brain.initGuns();
goal = brain.initGoal();
target = brain.initTarget();
numGuns = brain.getNumGuns();
}
void update() {
for(int i=0; i<numGuns; i++) {
gun[i].update((int)target.posX, (int)target.posY);
}
if(goal.collided(target)) {
state = WIN_state;
}
else if(target.hitBounds) {
state = LOSE_state;
}
else if(target.justStopped) {
target.freeze();
target.justStopped = false;
if(lives <= 0) {
state = LOSE_state;
}
}
}
void checkWallCollisions() {
for(int i = 0; i < numWalls; i++) {
walls[i].collided();
}
}
void checkCollisions() {
boolean deductLife = false;
checkWallCollisions();
for(int i = 0; i < numGuns; i++) {
if(turn_state == BALL_IN_PLAY_state) gun[i].projectile.locked = true;
else gun[i].projectile.locked = false;
if(!gun[i].projectile.firing) continue;
if(target.hitProjectile(gun[i].projectile)) {
target.setVelocity(gun[i].projectile.velX, gun[i].projectile.velY, gun[i].projectile.getPscale());
gun[i].projectile.die();
deductLife = true;
}
}
if(deductLife) lives--;
}
void drawLives() {
for(int i = 0; i < lives; i++) {
image(life, 35 + i * 25, 10);
}
}
void drawWalls() {
for(int i = 0; i < numWalls; i++) {
walls[i].display();
}
}
void draw()
{
if(!drawBG) return;
image(backgroundImage,0,0);
if(state==START_state) {
if(level==1) image(level1,0,0);
else if(level==2) image(level2,0,0);
else if(level==3) image(level3,0,0);
else if(level==4) image(level4,0,0);
target.display();
update();
checkCollisions();
drawLives();
drawWalls();
for(int i=0; i<numGuns; i++) {
gun[i].display();
gun[i].projectile.display();
}
image(fire, width-150, height-150);
}
else if(state == HOME_state) {
image(home,0,0);
drawBG = false;
}
else if(state == INSTR_state) {
image(instructions,0,0);
}
else if(state == WIN_state) {
if(level == maxLevel) {
image(playAgain, 350, 250);
state = HOME_state;
level = 1;
reset();
}
else image(nextLevel, width/2-nextLevel.width/2, 150);
target.freeze();
drawBG = false;
return;
}
else if(state == LOSE_state) {
image(youLose, width/2-youLose.width/2, -100);
image(playAgain, width-175, 200);
image(quit, width-250, 100);
target.freeze();
return;
}
}
void mouseReleased() {
for(int i=0; i<numGuns; i++) {
gun[i].projectile.mouseReleased();
}
if(state == HOME_state) {
if(mouseX>=width/2-75 && mouseX <= width/2+75 && mouseY >= height/2 && mouseY <= height/2+150) state = START_state;
else if(mouseX>=width/2-50 && mouseX <= width/2+50 && mouseY >= height-50) state = INSTR_state;
}
else if(state == INSTR_state) {
if(mouseX>=155 && mouseX <= 205 && mouseY >= 550 && mouseY <= 620) state = HOME_state;
}
else if(state == WIN_state) {
if(mouseX>=width/2-50 && mouseX <= width/2+50 && mouseY >= height/2-50 && mouseY <= height/2+100) {
if(level < maxLevel) level++;
else level = 1;
state = START_state;
reset();
}
}
else if(state == LOSE_state) {
if(mouseX>=width-250 && mouseX <= width-150 && mouseY >= 100 && mouseY <= 200) {
state = HOME_state;
setup();
}
else if(mouseX>=width-175 && mouseX <= width-75 && mouseY >= 200 && mouseY <= 300) {
state = START_state;
setup();
}
}
drawBG = true;
}
void mousePressed() {
for(int i=0; i<numGuns; i++) {
gun[i].projectile.mousePressed();
}
if(mouseX>width-150&&mouseY>height-150&&mouseX<width-50&&mouseY<height-50) {
for(int i=0; i<numGuns; i++) {
gun[i].fire(target);
}
}
}
class Brain {
int level;
int numGuns = 0;
Goal goal;
Gun[] guns;
Target target;
Brain(int l) {
level = l;
walls = new Wall[10];
if(level == 4) {
lives = 10;
numWalls = 4;
walls[0] = new Wall(width * .2, height * .8, width * .7, 10);
walls[1] = new Wall(width * .2, height * .3, 20, height * .5);
walls[2] = new Wall(width * .2, height * .3, width * .5, 10);
walls[3] = new Wall(width * .5, height * .53, width * .4, 10);
}
else if(level == 3) {
lives = 6;
numWalls = 3;
walls[0] = new Wall(width * .75, 200, 10, height * .65 - 200);
walls[1] = new Wall(width * .25, height * .4, 400, 10);
walls[2] = new Wall(width * .25, height * .65, 550, 10);
}
else if(level == 2) {
numWalls = 1;
walls[0] = new Wall(300, 200, 10, 200);
}
else {
numWalls = 0;
}
}
Goal initGoal() {
if(level == 4) {
goal = new Goal(width/2 - 50, 0, 100, 20);
}
else if(level == 3) {
goal = new Goal(width - 40, 70, 40, 100);
}
else if(level == 2) {
goal = new Goal(0, 420, 20, 100);
}
else {
goal = new Goal(0, 300, 20, 80);
}
return goal;
}
Gun[] initGuns() {
guns = new Gun[4];
if(level == 4) {
numGuns = 3;
guns[0] = new Gun(2, 0);
guns[1] = new Gun(3, 1);
guns[2] = new Gun(4, 2);
}
else if(level == 3) {
numGuns = 3;
guns[0] = new Gun(1, 0);
guns[1] = new Gun(3, 1);
guns[2] = new Gun(4, 2);
}
else if(level == 2) {
numGuns = 3;
for(int i = 0; i < numGuns; i++) guns[i] = new Gun(i+1, i);
}
else {
numGuns = 1;
guns[0] = new Gun(2, 0);
}
return guns;
}
Target initTarget() {
if(level == 4) {
target = new Target(width * .8, height * .65, width, height);
}
else if(level == 3) {
target = new Target(width * .2, height * .6, width, height);
}
else if(level == 2) {
target = new Target(width * .8, height * .3, width, height);
}
else {
target = new Target(width/2, height/2, width, height);
}
return target;
}
int getNumGuns() {
return numGuns;
}
}
class Goal {
float xpos, ypos, width, height;
float padding = 0;
Goal(float xp, float yp, float w, float h) {
xpos = xp;
ypos = yp;
width = w;
height = h;
}
void display() { //colorMode
fill(color(00, 99, 00));
rect(xpos, ypos, width, height);
}
boolean collided(Target t) {
float xa = xpos - padding;
float xb = xpos + padding + width;
float ya = ypos;
float yb = ypos + height;
//CHECK CORNERS
if (t.collided(xa, ya) || t.collided(xa, yb) || t.collided(xb, ya) || t.collided(xb, yb)) return true;
//CHECK BETWEEN
float tx = t.posX;
float ty = t.posY;
float tr = t.radius/2;
if(xa <= tx - tr && tx - tr <= xb && ya <= ty - tr && ty - tr <= yb) {
return true;
}
if(xa <= tx + tr && tx + tr <= xb && ya <= ty + tr && ty + tr <= yb) {
return true;
}
return false;
}
}
class Target {
float posX, posY;
float velocityX, velocityY, acceleration;
float radius;
float boundsX;
float boundsY;
float padding = 00;
float margin = 5;
float frictionX = 0;
float frictionY = 0;
boolean hitBounds = false;
boolean justStopped = false;
Target(float x, float y, float w, float h) {
radius = 58;
posX = x;
posY = y;
boundsX = w;
boundsY = h;
acceleration = 0;
}
void reset() {
posX = boundsX/2;
posY = boundsY/2;
acceleration = 0;
velocityX = 0;
velocityY = 0;
}
//returns true if a point x, y is colliding with the target
boolean collided(float x, float y) {
if(x >= (posX-radius/2) && y >= (posY-radius/2)) {
if(x <= (posX+radius/2) && y <= (posY+radius/2)) {
return true;
}
}
return false;
}
boolean hitProjectile(Projectile p) {
return p.collision;
}
void checkBounds() {
if(posX - radius/2 <= padding) {
hitBounds = true;
freeze();
posX = radius/2;
//velocityX = abs(velocityX);
velocityX = 0;
}
if(posX + radius/2 >= boundsX - padding) {
hitBounds = true;
freeze();
posX = boundsX - radius;
velocityX = 0;//velocityX = -abs(velocityX);
}
if(posY - radius/2 <= padding) {
hitBounds = true;
freeze();
posY = radius/2;
velocityY = 0;//velocityY = abs(velocityY);
}
if(posY + radius/2 >= boundsY - padding) {
freeze();
hitBounds = true;
posY = boundsY - radius/2;
velocityY = 0;//velocityY = -abs(velocityY);
}
}
void setVelocity(float x, float y, float scale) {
velocityX += x*scale;
velocityY += y*scale;
frictionX = velocityX / 40;
frictionY = velocityY / 40;
}
void setPos(float x, float y) {
posX = x;
posY = y;
}
void updateVelocity() {
velocityX += acceleration;
velocityY += acceleration;
}
void moveTarget() {
if(abs(velocityX) <= 0.25 && velocityX != 0) {
frictionX = 0;
velocityX = 0;
justStopped = true;
}
if(abs(velocityY) <= 0.25 && velocityY != 0) {
frictionY = 0;
velocityY = 0;
justStopped = true;
}
if(velocityX < 0) {
velocityX += abs(frictionX);
}
else {
velocityX -= abs(frictionX);
}
if(velocityY < 0) {
velocityY += abs(frictionY);
}
else {
velocityY -= abs(frictionY);
}
posX += velocityX;
posY += velocityY;
checkBounds();
updateVelocity();
}
void freeze() {
velocityX = 0;
velocityY = 0;
frictionY = 0;
acceleration = 0;
frictionX = 0;
}
void display() {
moveTarget();
image(turtle, posX-turtle.width/2, posY-turtle.height/2);
}
}
class Wall {
float xpos, ypos, wallWidth, wallHeight;
float padding = 0;
Wall(float xp, float yp, float w, float h) {
xpos = xp;
ypos = yp;
wallWidth = w;
wallHeight = h;
}
void display() {
if(wallWidth>wallHeight) image(seaweedHoriz, xpos, ypos, wallWidth, seaweedHoriz.height);
else image(seaweed, xpos, ypos, seaweed.width, wallHeight);
}
void collided() {
float xa = xpos;
float xb = xpos + wallWidth;
float ya = ypos;
float yb = ypos + wallHeight;
float tx = target.posX;
float ty = target.posY;
float tr = target.radius/2;
if(target.velocityX == 0 && target.velocityY != 0) {
if((xa < tx - tr && tx - tr < xb) || (xa < tx + tr && tx + tr < xb)) {
//CHECK IF TOP OF BALL IS INSIDE THE BOUNDS
//CHECK IF BOTTOM OF BALL IS INSIDE THE BOUNDS
if(target.velocityY < 0) {
if(ya <= ty - tr && ty - tr <= yb) {
target.velocityY = abs(target.velocityY);
target.posY += target.velocityY;
}
}
else if(target.velocityY > 0) {
if(ya <= ty + tr && ty + tr <= yb) {
target.velocityY = -abs(target.velocityY);
target.posY += target.velocityY;
}
}
}
}
else if(target.velocityY == 0 && target.velocityX != 0) {
if((ya < ty - tr && ty - tr < yb) || (ya < ty + tr && ty + tr < yb)) {
if(target.velocityX < 0) {
if(xa <= tx - tr && tx - tr <= xb) {
target.velocityX = abs(target.velocityX);
target.posX += target.velocityX;
}
}
else if(target.velocityX > 0) {
if(xa <= tx + tr && tx + tr <= xb) {
target.velocityX = -abs(target.velocityX);
target.posX += target.velocityX;
}
}
}
}
else if (target.velocityY != 0 && target.velocityX != 0) {
if(target.velocityY > 0) {
if(target.velocityX > 0) {
//FORWARD DOWN
if(wallHeight > wallWidth) {
if(ya - tr <= ty && ty <= yb + tr) {
if(xa <= tx + tr && tx + tr <= xb) {
target.velocityX = -abs(target.velocityX);
}
}
}
else {
if((xa - tr <= tx && tx <= xb + tr)) {
if(ya <= ty + tr && ty + tr <= yb) {
target.velocityY = -abs(target.velocityY);
}
}
}
}
else {
//BACKWARD DOWN
if(wallHeight > wallWidth) {
if(ya - tr <= ty && ty <= yb + tr) {
if(xa <= tx - tr && tx - tr <= xb) {
target.velocityX = abs(target.velocityX);
}
}
}
else {
if((xa - tr <= tx && tx <= xb + tr)) {
if(ya <= ty + tr && ty + tr <= yb) {
target.velocityY = -abs(target.velocityY);
}
}
}
}
}
else {
if(target.velocityX > 0) {
//FORWARD UP
if(wallHeight > wallWidth) {
if((ya < ty - tr && ty - tr < yb) || (ya < ty + tr && ty + tr < yb)) {
if(xa <= tx + tr && tx + tr <= xb) {
target.velocityX = -abs(target.velocityX);
}
}
}
else {
if((xa - tr <= tx && tx <= xb + tr)) {
if(ya <= ty - tr && ty - tr <= yb) {
target.velocityY = abs(target.velocityY);
}
}
}
}
else {
//BACKWARD UP
if(wallHeight > wallWidth) {
if((ya < ty - tr && ty - tr < yb) || (ya < ty + tr && ty + tr < yb)) {
if(xa <= tx - tr && tx - tr <= xb) {
target.velocityX = abs(target.velocityX);
}
}
}
else {
if((xa - tr <= tx && tx <= xb + tr)) {
if(ya <= ty - tr && ty - tr <= yb) {
target.velocityY = abs(target.velocityY);
}
}
}
}
}
}
}
}
class Gun {
float xpos, ypos; // position of the ball
float gunX, gunY;
int deviceSide; // deviceSide: the side of the iPad when held vertically; 1 = top, clockwise.
float gunWidth, gunHeight, dimWidth, dimHeight;
float buttonWidth, buttonHeight;
float buttonX, buttonY, trackX1, trackX2, trackY1, trackY2;
Projectile projectile;
int index;
Gun(int ds, int i) {
index = i;
dimWidth = 100; // dimesnions of the gun as a vertical shape, never changes
dimHeight = 150;
gunWidth = 80; // dimensions of shape displayed (depends on orientation)
gunHeight = 120;
buttonWidth = 50;
buttonHeight = 50;
deviceSide = ds;
projectile = new Projectile(ds, i);
projectile.update(xpos, ypos, trackX1, trackX2, trackY1, trackY2);
}
void update(float x, float y) { // x and y are ball coordinates
if(deviceSide==1) {
xpos = x + 10;
ypos = 0;
buttonX = xpos;
buttonY = 15;
trackX1 = xpos + gunProjectileOffset;
trackX2 = xpos + gunProjectileOffset;
trackY1 = 25;
trackY2 = dimHeight-25;
gunX = xpos-25;
gunY = 0;
gunWidth = dimWidth;
gunHeight = dimHeight;
}
else if(deviceSide==2) {
xpos = width-buttonHeight;
ypos = y;
buttonX = width-buttonHeight-15;
buttonY = ypos + 15;
trackX1 = width-dimHeight+25;
trackX2 = width-25;
trackY1 = ypos + gunProjectileOffset;
trackY2 = ypos + gunProjectileOffset;
gunX = width-dimHeight;
gunY = ypos-25;
gunWidth = dimHeight;
gunHeight = dimWidth;
}
else if(deviceSide==3) {
xpos = x;
ypos = height-gunHeight;
buttonX = xpos+15;
buttonY = height-buttonHeight-15;
trackX1 = xpos + gunProjectileOffset;
trackX2 = xpos + gunProjectileOffset;
trackY1 = height-gunHeight+25;
trackY2 = height-25;
gunX = xpos-25;
gunY = height-gunHeight;
gunWidth = dimWidth;
gunHeight = dimHeight;
}
else if(deviceSide==4) {
xpos = 0;
ypos = y;
buttonX = 15;
buttonY = ypos+15;
trackX1 = 25;
trackX2 = dimHeight-25;
trackY1 = ypos + gunProjectileOffset;
trackY2 = ypos + gunProjectileOffset;
gunX = 0;
gunY = ypos-25;
gunWidth = dimHeight;
gunHeight = dimWidth;
}
projectile.update(xpos, ypos, trackX1, trackX2, trackY1, trackY2);
}
void display() {
fill(25);
// rect(gunX,gunY,gunWidth,gunHeight); // gun body
strokeWeight(10);
stroke(50,30);
// projectile track
line(trackX1,trackY1,trackX2,trackY2);
noStroke();
}
boolean checkFire() {
if(mouseX>buttonX&&mouseY>buttonY&&mouseX<buttonX+buttonWidth&&mouseY<buttonY+buttonHeight) return true;
return false;
}
boolean checkInside() {
if (mouseX>gunX&&mouseY>gunY&&mouseX<gunX+gunWidth&&mouseY<gunY+gunHeight) return true;
else return false;
}
void fire(Target t) {
projectile.fire(t);
}
}
class Marker {
float posX;
float posY;
float radius = 50;
color cl;
Marker(float x, float y) {
posX = x;
posY = y;
}
boolean collided(Target t) {
return (t.collided(posX-radius, posY-radius) &&
t.collided(posX, posY));
}
void setColor(color c) {
cl = c;
}
void draw() {
fill(cl);
ellipse(posX, posY, radius, radius);
fill(color(0,0,0));
}
}
class Projectile {
float xpos, ypos;
float xpace, ypace;
int orientation; // orientation matches deviceSide in Gun. (down=1, left=2, up=3, right=4)
float gunX, gunY;
float fixedX, fixedY;
float trackX1, trackX2, trackY1, trackY2, tracklength;
float pscale;
PImage arrow;
float firelength = 0;
boolean firing;
boolean adjusted, hidden;
boolean dragging=false;
float velX = 10, velY = 10;
boolean locked = false;
float maxPscale = 1;
float minPscale = 0;
boolean collision = false;
int collisionCounter = -1;
float maxVel = 10;
int gunNum = 0;
Projectile (int o, int gn) {
gunNum = gn;
hidden = true;
orientation = o;
pscale = minPscale;
if(orientation==1) {
arrow = fishdownimg;
ypos=25;
velX = 0;
}
else if(orientation==2) {
arrow = fishleftimg;
xpos=width-arrow.width*pscale-25;
velX = -velX;
velY = 0;
}
else if(orientation==3) {
arrow = fishimg;
ypos=height-arrow.height*pscale-25;
velY = -velY;
velX = 0;
}
else if(orientation==4) {
arrow = fishrightimg;
xpos=25;
velY = 0;
}
firing=false;
}
void update(float x, float y, float tx1, float tx2, float ty1, float ty2) { // x and y are gun coordinates, t-variables denote the track.
gunX = x;
gunY = y;
trackX1 = tx1;
trackX2 = tx2;
trackY1 = ty1;
trackY2 = ty2;
if(orientation==1 || orientation==3) tracklength = abs(trackY2-trackY1);
else tracklength = abs(trackX2-trackX1);
if(orientation==1) {
xpos = trackX1 -arrow.width/2;
if(dragging && !firing) {
if(mouseX>trackX1-25&&mouseX<trackX2+25) {
if(mouseY>trackY1&&mouseY<trackY2) pscale = (mouseY-trackY1)*1.0/tracklength;
else if(mouseY<=trackY1) pscale = minPscale;
else if(mouseY>=trackY2) pscale= maxPscale;
if(pscale > minPscale) adjusted = true;
fixedY = ypos;
velX = 0;
velY = maxVel * pscale;
}
}
if(firing) {
ypos+=(ypace);
}
if(ypos>height) {
die();
}
}
else if(orientation==2) {
ypos = trackY1 -arrow.height/2;
if(dragging && !firing) {
if(mouseY>trackY1-25&&mouseY<trackY2+25) {
if(mouseX>trackX1&&mouseX<trackX2) {
xpos=mouseX;
}
else if(mouseX<=trackX1) {
float llength = trackX2 - trackX1;
xpos=trackX1;
}
else {
xpos=trackX2;
}
fixedX=xpos;
pscale = (trackX2-fixedX)*1.0/tracklength;
if(mouseX > trackX2 || pscale < .1) pscale = minPscale;
if(pscale > minPscale) adjusted = true;
pscale = (pscale > maxPscale) ? maxPscale : pscale;
velX = maxVel * pscale * -1;
velY = 0;
}
}
if(firing) {
xpos+= (xpace);
}
if(xpos<0-arrow.width) {
die();
}
}
else if(orientation==3) {
xpos = trackX1 -arrow.width/2;
if(dragging && !firing) {
if(mouseX>trackX1-25&&mouseX<trackX2+25) {
if(mouseY>trackY1&&mouseY<trackY2) ypos=mouseY;
else if(mouseY<=trackY1 && mouseY>trackY1-100) ypos=trackY1;
else {
ypos=trackY2;
}
fixedY=ypos;
pscale = (trackY2-fixedY)*1.0/tracklength;
if(pscale < .2) pscale = minPscale;
pscale = (pscale > maxPscale) ? maxPscale : pscale;
if(pscale > minPscale) adjusted = true;
velX = 0;
velY = maxVel * pscale * -1;
}
}
if(firing) {
ypos+=(ypace);
}
if( ypos< 0-arrow.height) {
die();
}
}
else if(orientation==4) {
ypos = trackY1-arrow.height/2;
if(dragging && !firing) {
if(mouseY>trackY1-25&&mouseY<trackY2+25) {
if(mouseX>trackX1+5&&mouseX<trackX2) pscale = (mouseX-trackX1)*1.0/tracklength;
else if(mouseX<=trackX1+5) pscale= minPscale;
else if(mouseX>=trackX2) pscale = maxPscale;
fixedX=xpos;
velX = maxVel * pscale;
velY = 0;
xpos = (mouseX > trackX2) ? trackX2 : mouseX;
}
}
if(pscale > minPscale) adjusted = true;
if(firing) {
xpos+=(xpace);
}
if(xpos>width) {
die();
}
}
}
void display() {
if(adjusted) hidden = false;
if(hidden) return;
if(orientation==1) {
image(arrow, xpos - 10 - gunProjectileOffset +arrow.width/2-arrow.width*pscale/2, ypos, arrow.width*pscale, tracklength*pscale);
}
else if (orientation==3) {
float moveYOffset = 0;
image(arrow, xpos - gunProjectileOffset +arrow.width/2-arrow.width*pscale/2, ypos, arrow.width*pscale, tracklength*pscale);
}
else if (orientation == 2) {
if(pscale > 0) {
if(firing && firelength == 0) firelength = trackX2 - xpos;
if(firing) image(arrow, xpos, ypos - gunProjectileOffset+arrow.height/2-arrow.height*pscale/2, firelength, arrow.height*pscale);
else image(arrow, xpos, ypos - gunProjectileOffset+arrow.height/2-arrow.height*pscale/2, trackX2 - xpos, arrow.height*pscale);
}
}
else if (orientation == 4) {
float moveXOffset = 0;
if(firing) {
moveXOffset = xpos - 20 - trackX1;
image(arrow, trackX1 + moveXOffset, ypos - gunProjectileOffset+arrow.height/2-arrow.height*pscale/2, tracklength - 20, arrow.height*pscale);
}
else {
image(arrow, trackX1 + moveXOffset, ypos - gunProjectileOffset+arrow.height/2-arrow.height*pscale/2, xpos - 20, arrow.height*pscale);
}
}
collisionCounter--;
if(collisionCounter == 0) {
collision = true;
collisionCounter = -1;
}
}
void fire(Target t) {
if(adjusted) {
if(!locked) {
firing=true;
int pace = 40;
if(orientation == 1) ypace = (t.posY - (ypos + trackY2-trackY1)) / pace;
if(orientation == 2) xpace = (t.posX - xpos) / pace;
if(orientation == 3) ypace = (t.posY - ypos) / pace;
if(orientation == 4) {
xpos = trackX1;
xpace = (t.posX - (xpos + trackX2-trackX1)) / pace;
}
collisionCounter = pace;
adjusted = false;
}
}
}
float getPscale() {
return (pscale > maxPscale) ? maxPscale : pscale;
}
void die() {
firelength = 0;
collision = false;
hidden = true;
xpace = 0;
ypace = 0;
pscale = 0;
if(orientation==1) {
firing=false;
adjusted = false;
ypos=25;
fixedY=ypos;
}
else if(orientation==2) {
adjusted = false;
firing=false;
xpos=trackX2-arrow.width*pscale;
fixedX=xpos;
}
else if(orientation==3) {
adjusted = false;
firing=false;
ypos=trackY2-arrow.height*pscale;
fixedY=ypos;
}
else if(orientation==4) {
adjusted = false;
firing=false;
xpos=trackX1;
fixedY=ypos;
;
}
}
void mousePressed() {
if(gun[gunNum].checkInside()) dragging=true;
}
void mouseReleased() {
dragging=false;
}
float tipX() {
return ypos;
}
float tipY() {
return xpos;
}
float velX() {
return velX;
}
float velY() {
return velY;
}
}