package posuvné_šipky;

import rup.česky.tvary.AktivníPlátno;
import rup.česky.tvary.Barva;
import rup.česky.tvary.Kreslítko;
import rup.česky.tvary.Přesouvač;
import rup.česky.tvary.Směr8;

import rup.česky.tvary.Trojúhelník;
import rup.česky.tvary.Obdélník;


/*******************************************************************************
 * Třída JŠipka definuje šipku otočenou na jih.
 *
 * @author     Rudolf Pecinovský
 * @version    0.00.000,  0.0.2003
 */
public class JŠipka implements IŠipka
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
    
    private static final AktivníPlátno AP = AktivníPlátno.getPlátno();
    private static final Přesouvač přes = new Přesouvač( 5 );
    
    
//== ŘETĚZCOVÉ LITERÁLY ========================================================
//== ATRIBUTY TŘÍDY ============================================================
//== ATRIBUTY INSTANCÍ =========================================================
    
    private Trojúhelník špička;
    private Obdélník    tělo;
    
    

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří na zadaných souřadnicích novou, na jih otočenou šipku
     * zadané barvy.
     *
     * @param x  x-ová políčková souřadnice
     * @param y  y-ová políčková souřadnice
     * @param barva  barva šipky
     */
    public JŠipka(int x, int y, Barva barva)
    {
        int krok = AP.getKrok();
        int k2   = krok/2;
        špička = new Trojúhelník( x*krok, y*krok + k2, krok, k2, barva, 
                                  Směr8.JIH );
        tělo   = new Obdélník( x*krok + krok/4, y*krok, k2, k2, barva );
    }

    

//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí vodorovnou souřadnici šipky.
     *
     * @return  x-ová souřadnice šipky
     */
    public int getX()
    {
        return špička.getX();
    }
    
    
    /***************************************************************************
     * Vrátí svislou souřadnici šipky.
     *
     * @return  y-ová souřadnice šipky
     */
    public int getY()
    {
        return tělo.getY();
    }
    
    
    /***************************************************************************
     * Nastaví vodorovnou a svislou souřadnici šipky.
     *
     * @param x  Zadávaná x-ová souřadnice
     * @param y  Zadávaná y-ová souřadnice
     */
    public void setPozice(int x, int y)
    {
        int krok = AP.getKrok();
        špička.setPozice( x,          y + krok/2 );
        tělo  .setPozice( x + krok/4, y );
    }
    
    

//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================

    /***************************************************************************
     * Nakreslí šipku zadaným kreslítkem.
     *
     * @param g Kreslítko (objekt typu Graphics2D), kterým se šipka nakreslí.
     */
    public void nakresli(Kreslítko g)
    {
        špička.nakresli( g );
        tělo.  nakresli( g );
    }



//== PŘEKRYTÉ ABSTRAKTNÍ METODY RODIČOVSKÉ TŘÍDY ===============================
//== PŘEKRYTÉ KONKRÉTNÍ METODY RODIČOVSKÉ TŘÍDY ================================
//== NOVĚ ZAVEDENÉ METODY INSTANCÍ =============================================

    /***************************************************************************
     * Vrátí šipku, která je na stejné pozici, pouze je otočená o 90° vlevo.
     *
     * @return Šipka natočená do nového směru.
     */
    public IŠipka doleva()
    {
        int krok = AP.getKrok();
        return new VŠipka( getX()/krok, getY()/krok, špička.getBarva() );
    }
    

    /***************************************************************************
     * Posune šipku na další políčko ve směru, do kterého je natočena.
     */
    public void vpřed()
    {
        přes.přesunNa( this, getX(),  getY()+AP.getKrok() );
        AP.odstraň( this );  //Přesouvač ji nasadil, odstranit se musí sama
    }
    
    
    
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== TESTY A METODA MAIN =======================================================
}

