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

/* Okupantem dlaždice může být překážka, předmět nebo sprite,
   což je indikováno příslušným typem.

   Okupant dlaždice má unikátní jméno, souřadnice dlaždice (xTile, yTile)
   a souřadnice relativní vzhledem k levému hornímu rohu obrázku povrchu
   (xDraw, yDraw), na který se má vykreslovat.

   Kreslení zahrnuje připočtení posunu k souřadnicím povrchu okupanta,
   protože povrch se při pohybu hráče pohybuje.

   Sprite se vykresluje sám, ovšem před tím musí být umístěn do panelu JPanel.
*/

import java.awt.*;
import java.awt.image.*;


public class TileOccupier
{
  private String name; 
  private int type;      // BLOCK, PICKUP či SPRITE
  private BufferedImage image;
  private int xTile, yTile;    // souřadnice dlaždice
  private int xDraw, yDraw;    
           // souřadnice relativní k obrázku herní plochy, na kterou
           // by se měl držitel dlaždice vykreslit

  private TiledSprite sprite = null;   
    // používá se, když je držitel typu sprite


  public TileOccupier(String nm, int ty, int x, int y, BufferedImage im,
                          int xRowStart, int yRowStart, 
                          int xTileWidth, int yTileHeight)
  { name = nm; 
    type = ty;
    xTile = x; yTile = y;
    image = im;
    calcPosition(xRowStart, yRowStart, xTileWidth, yTileHeight);
  } // konec konstruktoru: TileOccupier()



  private void calcPosition(int xRowStart, int yRowStart, 
                          int xTileWidth, int yTileHeight)
  /* Vypočítá souřadnice (xDraw,yDraw) relativní k obrázku podlahy. 
     S pomocí těchto souřadnic se pak vykreslí obrázek okupanta tak,
     aby se jeho podstava jevila, jak by spočívala na dlaždici,
     vycentrovaná podle osy x a kousek nad středem ve směru y.
  */
  { // levý horní roh obrázku relativně k jeho dlaždici
    int xImOffset = xTileWidth/2 - image.getWidth()/2;    // ve středu
    int yImOffset = yTileHeight - image.getHeight() - yTileHeight/5;
                   // trošku výš od spodní části kosočtverce

    // levý horní roh obrázku relativně obrázku herní plochy
    xDraw = xRowStart + (xTile * xTileWidth) + xImOffset;
    if (yTile%2 == 0)    // on an sudý řádek
      yDraw = yRowStart + (yTile/2 * yTileHeight) + yImOffset;
    else       // on an odd row
      yDraw = yRowStart + ((yTile-1)/2 * yTileHeight) + yImOffset;
  } // konec metody: calcPosition()


  public String getName()
  { return name; }

  public int getType()
  {  return type; }


  public Point getTileLoc()
  {  return new Point(xTile, yTile);  }


  public void addSpriteRef(TiledSprite s)
  { if (type == WorldDisplay.SPRITE)
      sprite = s;
  }


  public void draw(Graphics g, int xOffset, int yOffset)
  /* Vykreslí okupanta posunutého od levého horního rohu panelu JPanel
     o (xOffset, yOffset).

     V případě spritu je kreslení ponecháno na něm samotném, 
     takže se použije jeho aktuální obrázek. Nejdříve jej
     však musíme správně umístit do panelu JPanel.
  */
  { if (type == WorldDisplay.SPRITE) {
      sprite.setPosition( xDraw+xOffset, yDraw+yOffset);  // umísti v panelu JPanel
      sprite.drawSprite(g);   // vykreslení ponechej na spritu
    }
    else      // entita je typu PICKUP nebo BLOCK
      g.drawImage( image, xDraw+xOffset, yDraw+yOffset, null);
  } // konec metody: draw()

}  // konec třídy: TileOccupier


