package vooga.towerdefense.action.movement;
import vooga.towerdefense.action.TargetedAction;
import vooga.towerdefense.attributes.Attribute;
import util.Location;
import util.Vector;
/**
* Action to move from one location to another location, or to a target. If
* followTarget is true, projectile follows target, else it moves in straight line
* in target's direction.
*
* @author Xu Rui
*
*/
public class TrackTarget extends TargetedAction {
private Vector myHeading;
private Location myCenter;
private Location myDestination;
private Attribute mySpeed;
private boolean isTargetTracking;
private boolean headingSet;
public TrackTarget (Location start, Location destination,
Attribute movespeed, boolean followTarget) {
super();
mySpeed = movespeed;
myCenter = start;
myDestination = destination;
isTargetTracking = followTarget;
headingSet = false;
}
public void update(double elapsedTime) {
if (isEnabled()) {
executeAction(elapsedTime);
}
else {
updateFollowUpActions(elapsedTime);
}
}
@Override
public void executeAction (double elapsedTime) {
myDestination = getSingleTarget().getCenter();
setFollowTarget(isTargetTracking);
Vector v = new Vector(myHeading.getDirection(), mySpeed.getValue());
v.scale(elapsedTime / 1000);
myCenter.translate(v);
updateTargetedFollowUpActions(getTargets());
}
/**
* Set whether projectile follows path of target, or shoots off in initial
* target direction.
*
* @param follow
*/
public void setFollowTarget (boolean follow) {
if (headingSet && !follow) {
return;
}
else {
myHeading =
new Vector(Vector.angleBetween(myDestination, myCenter), mySpeed.getValue());
headingSet = true;
}
}
}