public class AsteroidField { /* The asteroid field class uses an array to keep track of all the asteroids at a given moment in time. We have defined procedures to allow us to see into the future in order to accurately predict future collisions with asteroids. This field also is updated if an asteroid is shrunk, split, or destroyed by a ship. */ public final static int MAX_ASTEROIDS = 40; public Asteroid[] asteroids; public int numAsteroids; public AsteroidField() // constructor { asteroids = new Asteroid[MAX_ASTEROIDS]; numAsteroids = MAX_ASTEROIDS / 2; for (int i = 0; i < numAsteroids; i++) asteroids[i] = new Asteroid(); // create random asteroids } public AsteroidField(AsteroidField f) // copy constructor { asteroids = new Asteroid[MAX_ASTEROIDS]; numAsteroids = f.numAsteroids; for (int i = 0; i < numAsteroids; i++) asteroids[i] = new Asteroid(f.asteroids[i]); } public boolean hasMaxAsteroids() { return numAsteroids >= MAX_ASTEROIDS; } public boolean inCollision(DPolygon poly) { for (int m = 0; m < numAsteroids; m++) if (poly.inCollision(asteroids[m])) return true; return false; } public int findCollision(DPolygon poly) { for (int m = 0; m < numAsteroids; m++) if (poly.inCollision(asteroids[m])) return m; return -1; } public void move() { for (int l = 0; l < numAsteroids; l++) asteroids[l].move(); } public void remove(Asteroid a) { int i; for (i = 0; i < numAsteroids && asteroids[i] != a; i++) ; if (asteroids[i] == a) asteroids[i] = asteroids[--numAsteroids]; } public void impact(Asteroid target) { if(target.radius <= 4.0) remove(target); else if (target.radius >= 9.0 && !hasMaxAsteroids()) split(target); else target.reshape(-2.0); } public void split(Asteroid a) { int i = 0; if (!hasMaxAsteroids()) for (i = 0; i < numAsteroids && asteroids[i] != a; i++) ; if (asteroids[i] == a) { Asteroid b = new Asteroid(a); a.reshape(-2.0 - Math.random()*a.radius/2.0); b.reshape(-2.0 - Math.random()*b.radius/2.0); a.speed += Math.random() - 0.5; a.direction += Math.PI * (Math.random() - 0.5); DPoint aPt = new DPoint(a.speed * Math.cos(a.direction), a.speed * Math.sin(a.speed)); DPoint cPt = new DPoint(b.speed * Math.cos(b.direction), b.speed * Math.sin(b.speed)); b.speed = aPt.distanceFrom(cPt); b.direction = Math.atan((aPt.y - cPt.y) / (aPt.x - cPt.x)); asteroids[numAsteroids] = b; numAsteroids++; } } // split() }