The Quadrant-Based Alien Sprite
AlienQuadSprite is a subclass of AlienSprite and overrides the playerHasMoved() and move() methods. AlienQuadSprite has the same basic statechart as AlienSprite (shown in Figure 13-15), but the plan move and move states are different.
In the plan move state, the alien calculates a quadrant direction (NE, SE, SW, or NW). The direction is chosen by finding the nearest pickup point to the player, and then calculating that pickup's quadrant direction relative to the alien. This gives the alien a "pickup-guarding" behavior, as the alien then moves towards the pickup that the player (probably) wants to collect.
Planning a Move
playerHasMoved() calculates a quadrant direction for the sprite:
// global
private int currentQuad;
public void playerHasMoved(Point playerLoc)
{
if (world.hasPickupsLeft()) {
Point nearPickup = world.nearestPickup(playerLoc);
// return coord of nearest pickup to the player
currentQuad = calcQuadrant(nearPickup);
}
}
private int calcQuadrant(Point pickupPt)
/* Roughly calculate a quadrant by comparing the
pickup's point with the alien's position. */
{
if ((pickupPt.x > xTile) && (pickupPt.y > yTile))
return SE;
else if ((pickupPt.x > xTile) && (pickupPt.y < yTile))
return NE;
else if ((pickupPt.x < xTile) && (pickupPt.y > yTile))
return SW;
else
return NW;
} // end of calcQuadrant()
calcQuadrant() could be more complex, but the emphasis is on speed. playerHasMoved() and calcQuadrant() will be called frequently—whenever the player moves—so ...