package posuvné_šipky;

import rup.česky.společně.P;

import rup.česky.tvary.AktivníPlátno;
import rup.česky.tvary.Barva;
import rup.česky.tvary.IPosuvný;
import rup.česky.tvary.Kreslítko;


/*******************************************************************************
 * Třída Šipka definuje šipku pohybující se po animačním plátně.
 *
 * @author     Rudolf Pecinovský
 * @version    0.00.000,  0.0.2003
 */
public class Šipka implements IPosuvný
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    private static final AktivníPlátno AP = AktivníPlátno.getPlátno();


//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================

    /** Počet dosud vytvořených instancí. */
    private static int počet = 0;


//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Pořadí vytvoření dané instance v rámci třídy. */
    private final int pořadí = ++počet;


//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    private IŠipka šipka;



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

    /***************************************************************************
     * Vytvoří na zadaných souřadnicích novou, na východ 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 Šipka(int x, int y, Barva barva)
    {
        šipka = new VŠipka( x, y, barva );
    }

    

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

    /***************************************************************************
     * Vrátí vodorovnou souřadnici šipky.
     *
     * @return  x-ová souřadnice šipky
     */
    public int getX()
    {
        return šipka.getX();
    }


    /***************************************************************************
     * Vrátí svislou souřadnici šipky.
     *
     * @return  y-ová souřadnice šipky
     */
    public int getY()
    {
        return šipka.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)
    {
        šipka.setPozice( x, 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)
    {
        šipka.nakresli( g );
    }

    

//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================
//== PŘEKRYTÉ ABSTRAKTNÍ METODY RODIČOVSKÉ TŘÍDY ===============================
//== PŘEKRYTÉ KONKRÉTNÍ METODY RODIČOVSKÉ TŘÍDY ================================

    /***************************************************************************
     * Převede instanci na řetězec. Používá se především při ladění.
     *
     * @return Řetězcová reprezentace dané instance.
     */
    public String toString()
    {
        return P.názevTřídy( this ) + "_" + pořadí;
        //Nebude-li importováno P, lze použít
        //return this.getClass().getName() + "_" + pořadí;
    }



//== 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 void vlevoVbok()
    {
        šipka = šipka.doleva();
        AP.překresli();
    }



    /***************************************************************************
     * Posune šipku na další políčko ve směru, do kterého je natočena.
     */
    public void vpřed()
    {
        šipka.vpřed();
        AP.překresli();
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== TESTY A METODA MAIN =======================================================
}

