import processing.core.*; public class EnemyFish extends Fish { PApplet p; int fishColor; EnemyFish(PApplet p, PVector position, float size) { super(p, position, size); this.p = p; alive = true; PVector velocity = new PVector(p.random(-1, 1), p.random(-1, 1)); fishColor = p.color(p.random(20, 255), p.random(20, 255), p.random(20, 255)); } void update() { position.add(velocity); } void detectBound() { if (position.x + size * 5 > pondWidth && alive) { velocity.x = - velocity.x; } if (position.x < pondX + size * 5.5 && alive) { velocity.x = - velocity.x; } if (position.y > pondHeight - size * 1.5 && alive) { velocity.y = - velocity.y; } if (position.y < pondY + size * 2.5 + 50 && alive) { velocity.y = - velocity.y; } } boolean detectOffScreen() { if (position.x <= pondX + size * 5.5 || position.x + size * 5 >= pondWidth || position.y <= pondY+ size * 2.5 || position.y >= pondHeight- size * 1.5) { return true; } return false; } boolean detectCollision(Fish otherFish) { if (p.abs(position.x - otherFish.position.x) < (size *5 + otherFish.size * 6)&& p.abs(position.y - otherFish.position.y) < (size * 2 + otherFish.size *2.5)) { return true; } else { return false; } } void bounce(Fish otherFish) { float angle = p.atan2(position.y - otherFish.position.y, position.x - otherFish.position.x); velocity.x = 1 * p.cos(angle); velocity.y = 1 * p.sin(angle); otherFish.velocity.x = 1 * p.cos(angle - p.PI); otherFish.velocity.y = 1 * p.sin(angle - p.PI); } void drawFish() { p.pushMatrix(); p.translate(position.x, position.y); if (velocity.x > 0) { p.rotate(p.PI); p.scale(1, -1); } p.noStroke(); p.fill(fishColor); //tail p.triangle(0+size*6, 0-size*2, 0+size*5, 0, 0+size*6, 0+size*2); //body p.ellipse(0, 0, size*10, size*4); //tail deco p.stroke(255); p.strokeWeight(1); p.line(0+size*5, 0, 0+size*6, (float)(0-size*1.5)); p.line(0+size*5, 0, 0+size*6, 0-size); p.line(0+size*5, 0, 0+size*6, 0-size/2); p.line(0+size*5, 0, 0+size*6, 0); p.line(0+size*5, 0, 0+size*6, 0+size/2); p.line(0+size*5, 0, 0+size*6, 0+size); p.line(0+size*5, 0, 0+size*6, (float)(0+size*1.5)); //gill p.stroke(0); p.strokeWeight(1); p.arc((float)(0-size*3.5), 0, size, (float)(size*2.5), p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); //eye p.fill(255); p.noStroke(); p.ellipse(0-size*4, 0, size/2, size/2); p.fill(0); p.ellipse(0-size*4, 0, size/4, size/4); //fins p.fill(fishColor); p.triangle(0+size, 0+size*3, 0, 0+size*2, 0-size, 0+size*3); p.arc(0+size, (float)(0-size*1.5), size*3, size*2, p.PI, p.TWO_PI); //fin deco p.stroke(255); p.strokeWeight(1); p.line(0+size, (float)(0-size*1.8), 0, (float)(0-size*2.2)); p.line(0+size, (float)(0-size*1.8), 0+size*2, (float)(0-size*2.2)); p.line(0+size, (float)(0-size*1.8), 0+size, (float)(0-size*2.5)); p.noStroke(); p.fill(255); p.ellipse(0, (float)((0+size*2.2)), size/6, size/6); p.ellipse(0+size/4, (float)((0+size*2.4)), size/6, size/6); p.ellipse(0-size/4, (float)(0+size*2.4), size/6, size/6); p.ellipse(0, (float)(0+size*2.4), size/6, size/6); p.ellipse(0-size/2, (float)(0+size*2.6), size/6, size/6); p.ellipse(0+size/2, (float)(0+size*2.6), size/6, size/6); p.ellipse(0, (float)(0+size*2.6), size/6, size/6); p.ellipse((float)(0-size/1.5), (float)(0+size*2.8), size/6, size/6); p.ellipse((float)(0+size/1.5), (float)(0+size*2.8), size/6, size/6); p.ellipse(0, (float)(0+size*2.8), size/6, size/6); //body deco p.stroke(255); p.strokeWeight(1); p.noFill(); p.arc(0-size*(float)2.8, 0-size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)2.8, 0, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)2.8, 0+size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)2.0, 0-size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)2.0, 0+size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)2.0, 0, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)1.2, 0-size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)1.2, 0+size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)1.2, 0, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)0.4, 0-size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)0.4, 0+size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0-size*(float)0.4, 0, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)0.4, 0-size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)0.4, 0+size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)0.4, 0, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)1.2, 0-size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)1.2, 0+size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)1.2, 0, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)2.0, 0-size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)2.0, 0+size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)2.0, 0, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)2.8, 0-size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)2.8, 0+size, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)2.8, 0, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.arc(0+size*(float)3.6, 0, size, size, p.TWO_PI-p.HALF_PI, p.TWO_PI+p.HALF_PI); p.popMatrix(); } }