/*
Copyright 2009 by Sean Luke
Licensed under the Academic Free License version 3.0
See the file "LICENSE" for more information
*/
package sim.app.asteroids;
import sim.engine.*;
import sim.field.continuous.*;
import sim.util.*;
import ec.util.*;
import java.awt.geom.*;
import java.awt.*;
import sim.portrayal.*;
/** A Bullet is an element representing a bullet shot from a Ship. Bullets have a finite lifetime
which is set up when they are constructed, after which they end themselves automatically.
When a Bullet collides with an Asteroid or a Ship, it causes a collision. Bullets have zero
rotational velocity.
*/
public class Bullet extends Element
{
private static final long serialVersionUID = 1;
/** How much to translate the Bullet each timestep. */
public static final double VELOCITY = 1;
/** The default lifetime of a bullet. */
public static final int LIFETIME = 100;
/** Constructs a Bullet and adds it to the field and to the schedule. */
public Bullet(Asteroids asteroids, MutableDouble2D velocity, Double2D location, int lifetime)
{
this.shape = new Ellipse2D.Double(-1,-1,2,2);
this.velocity = velocity;
this.rotationalVelocity = 0;
stopper = asteroids.schedule.scheduleRepeating(this);
asteroids.field.setObjectLocation(this, location);
asteroids.schedule.scheduleOnceIn(lifetime,
new Steppable()
{
public void step(SimState state)
{
end((Asteroids) state);
}
});
}
/** Tests for collisions, then moves the Bullet appropriately. */
public void step(SimState state)
{
testForHit((Asteroids)state);
super.step(state);
}
/** Bullets are white. */
public Color getColor() { return Color.white; }
/** Tests if we've collided with an asteroid. If so, we break apart the Asteroid and end ourselves.
Ships test for collision with Bullets on their own, not here. */
public void testForHit(Asteroids asteroids)
{
// just check ALL the asteroids, yes it's expensive but there aren't enough of them to matter
Bag a = asteroids.field.getAllObjects();
for(int i = 0; i < a.numObjs; i++)
{
Object obj = (a.objs[i]);
if (obj instanceof Asteroid)
{
Asteroid asteroid = (Asteroid)(a.objs[i]);
if (asteroid.collisionWithElement(asteroids, this))
{
end(asteroids);
asteroid.breakApart(asteroids);
asteroids.score++;
break;
}
}
}
}
}