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

/* Sprite má pozici, rychlost (ve formě kroků),
   obrázek a může být deaktivován.

   O obrázek sprite se stará objekt typu ImagesLoader a o
   jejich střídání objekt typu ImagesPlayer.

   ------------------
   Přidáno: getImage()

*/

import java.awt.*;
import javax.swing.*;
import java.awt.image.*;


public class Sprite 
{
  // implicitní přírustky (tj. jak daleko postoupit při další aktualizaci)
  private static final int XSTEP = 5; 
  private static final int YSTEP = 5;

  // defaultní rozměry neexistuje-li obrázek
  private static final int SIZE = 12;   

  // vztahuje se k obrázku
  private ImagesLoader imsLoader;
  private String imageName;
  private BufferedImage image;
  private int width, height;     // rozměry obrázku

  private ImagesPlayer player;  // pro přehrání cyklické řady obrázků
  private boolean isLooping;

  private int pWidth, pHeight;   // rozměry panelu

  private boolean isActive = true;      
  // sprite se aktualizuje a překresluje pouze je-li aktivní

  // chráněnné proměnné
  protected int locx, locy;        // umístění spritu
  protected int dx, dy;            // o kolik se při aktualizaci pohnout



  public Sprite(int x, int y, int w, int h, ImagesLoader imsLd, String name) 
  { 
    locx = x; locy = y;
    pWidth = w; pHeight = h;
    dx = XSTEP; dy = YSTEP;

    imsLoader = imsLd;
    setImage(name);    // implicitní obrázek spritu jmenuje 'name'
  } // konec metody: metody: Sprite()


  public void setImage(String name)
  // přiřadí jméno obrázku spritu
  {
    imageName = name;
    image = imsLoader.getImage(imageName);
    if (image == null) {    // žádný obrázek toho jména nebyl nalezen
      System.out.println("Žádný obrázek pro sprite " + imageName);
      width = SIZE;
      height = SIZE;
    }
    else {
      width = image.getWidth();
      height = image.getHeight();
    }
    // nepřehrává se žádný cyklus obrázků 
    player = null;
    isLooping = false;
  }  // konec metody: metody: setImage()



  public BufferedImage getImage()
  // nová metoda v aplikaci AlienTiles
  { if (isLooping)
      return player.getCurrentImage();
    else
      return image;
  }  // konec metody: metody: getImage()


  public void loopImage(int animPeriod, double seqDuration)
  /* Zapíná cyklické přehrávání sekvence. Celkový čás cyklu
     je dán parametrem seqDuretion. Interval aktualizací určuje
     parametr animPeriod. */
  {
    if (imsLoader.numImages(imageName) > 1) {      
      player = new ImagesPlayer(imageName, animPeriod, seqDuration,
                                       true, imsLoader);
      isLooping = true;
    }
    else
      System.out.println(imageName + " není sekvence obrázků");
  }  // konec metody: metody: loopImage()


  public void stopLooping()
  {
    if (isLooping) {
      player.stop();
      isLooping = false;
    }
  }  // konec metody: metody: stopLooping()


  public int getWidth()    // šířka obrázku spritu
  {  return width;  }

  public int getHeight()   // výška obrázku spritu
  {  return height;  }

  public int getPWidth()   // šířka obklopujícího panelu
  {  return pWidth;  }

  public int getPHeight()  // výška obklopujícího panelu
  {  return pHeight;  }


  public boolean isActive() 
  {  return isActive;  }

  public void setActive(boolean a) 
  {  isActive = a;  }

  public void setPosition(int x, int y)
  {  locx = x; locy = y;  }

  public void translate(int xDist, int yDist)
  {  locx += xDist;  locy += yDist;  }

  public int getXPosn()
  {  return locx;  }

  public int getYPosn()
  {  return locy;  }


  public void setStep(int dx, int dy)
  {  this.dx = dx; this.dy = dy; }

  public int getXStep()
  {  return dx;  }

  public int getYStep()
  {  return dy;  }


  public Rectangle getMyRectangle()
  {  return  new Rectangle(locx, locy, width, height);  }


  public void updateSprite()
  // přesune sprite
  {
    if (isActive()) {
      locx += dx;
      locy += dy;
      if (isLooping)
        player.updateTick();  // aktualizuj přehrávač
    }
  } // konec metody: metody: updateSprite()



  public void drawSprite(Graphics g) 
  {
    if (isActive()) {
      if (image == null) {   // sprite nemá obrázek
        g.setColor(Color.yellow);   // místo něj tedy vykresli žluté kolečko
        g.fillOval(locx, locy, SIZE, SIZE);
        g.setColor(Color.black);
      }
      else {
        if (isLooping)
          image = player.getCurrentImage();
        g.drawImage(image, locx, locy, null);
      }
    }
  } // konec metody: metody: drawSprite()

}  // konec metody: třídy: Sprite
