
// AlienQuadSprite.java 
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Podtřída třídy AlienSprite.
   Přetěžuje:
      void playerHasMoved()   -- volá se při pohybu hráče
	  void move()             -- přesune vetřelece

   Tento vetřelec počítá směr kvadrantu pro následující 
   pohyb spritu (SV, JV, JZ, SZ). Výpočet se provádí kdykoli
   se hráč pohne.
   
   Směr získáme tak, že vyhledáme předmět, který je nejblíže
   hráči, a poté vypočítáme pozici jeho kvadrantu vzhledem k 
   poloze vetřelece.

   Tímto způsobem přidělíme vetřelci chování, při němž hlídá předměty,
   ke kterým se hráč přiblížil.   
*/

import java.awt.*;


public class AlienQuadSprite extends AlienSprite
{
  // kvadrant pro následný směr pohybu spritu
  private int currentQuad;
  

  public AlienQuadSprite(int x, int y, int w, int h, ImagesLoader imsLd,
                                       WorldDisplay wd)
  {  super(x, y, w, h, imsLd, wd); 
     currentQuad = getRandDirection();  // počáteční směr je náhodný
  } 


  public void playerHasMoved(Point playerLoc)
  /* Aktualizuj kvadrant dle směru k předmětu, který je nejblíže hráči
  */
  { if (world.hasPickupsLeft()) {
      Point nearPickup = world.nearestPickup(playerLoc);   // předmět nejblíže hráči
      currentQuad = calcQuadrant(nearPickup);
    }
  }  // konec metody: playerHasMoved()



  private int calcQuadrant(Point pickupPt)
  /* Přibližný výpočet kvadrantu spočívající v porovnání
     polohy předmětu a vetřelece. */
  {
    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;
   }  // konec metody: calcQuadrant()



  protected void move()
  /* Pokus se o pohyb ve směru kvadrantu v proměnné currentQuad. Je-li
     tato cesta blokována, pak vyber náhodně jiný směr. Tímto způsobem
     může v krajním případě dojít k zaseknutí spritu.
  */
  { int quad = currentQuad;
    Point newPt;
    while ((newPt = tryMove(quad)) == null)
      quad = getRandDirection(); 
      // cyklus by se nějakou chvíli mohl opakovat, nakonec by však mělo podařit najít cestu
    setMove(newPt, quad);
  }  // konec metody: move()


}  // konec třídy: AlienQuadSprite
