
/**
 * Trida Presouvac slouzi k pohybu s instancemi trid
 * implementujicich rozhrani IPosuvny.
 *
 * @author     Rudolf Pecinovsky
 * @version    1.00, 10.1.2003
 */
public class Presouvac 
{
//== VEREJNE KONSTANTY =========================================================
//== SOUKROME KONSTANTY ========================================================
//== ATRIBUTY TRIDY ============================================================
    
    /** Tento atribut je tu pouze pro zjednodušení psaní. */
    private static AnimPlatno platno = AnimPlatno.getPlatno();

//== ATRIBUTY INSTANCI =========================================================

    /** Specifikuje rychlost posunu objektu danou instanci posunovace. */
    private int rychlost;
    
    
//== PRISTUPOVE METODY ATRIBUTU TRIDY ==========================================
//== OSTATNI METODY TRIDY ======================================================

//== KONSTRUKTORY ==============================================================
    
    /**
     * Vytvori presouvace, ktery bude presouvat objekty rychlosti 1.
     */
    public Presouvac() 
    {
        this( 1 );
    }//public Presouvac()
    
    
    /**
     * Vytvori presouvace, ktery bude presouvat objekty zadanou rychlosti.
     * 
     * @param rychlost rychlost, kterou bude presouvac pohybovat 
     *                 se sverenymi objekty. 
     */
    public Presouvac( int rychlost ) 
    {
        if( rychlost <= 0 )
            throw new IllegalArgumentException(
                "Zadana rychlost musi byt nezaporna!" );
        this.rychlost = rychlost;
    }//public Presouvac()
    

    
//== PRISTUPOVE METODY ATRIBUTU INSTANCI =======================================
//== OSTATNI METODY INSTANCI ===================================================

    /**
     * Presune zadany objekt o pozadovany pocet bodu.
     *
     * @param objekt  presouvany objekt
     * @param doprava  pocet bodu, o nez se objekt presune doprava
     * @param dolu  pocet bodu, o nez se objekt presune dolu
     */
    public void presunO( IPosuvny objekt, int doprava, int dolu ) 
    {
        double vzdalenost = Math.sqrt(doprava*doprava + dolu*dolu);
        double kroku = (int)(vzdalenost / rychlost);
        double dx = doprava / kroku;
        double dy = dolu / kroku;
        double x  = objekt.getX();
        double y  = objekt.getY();
        
        for(int i=(int)kroku;   i > 0;   i-- )
        {
            x = x + dx;
            y = y + dy;
            platno.nekresli();
            objekt.setPozice( (int)(x+0.5), (int)(y+0.5) );
            platno.vratKresli();
            platno.prekresli();
            platno.cekej(10);
        }
    }//public void presunO( IPosuvny objekt, int doprava, int dolu )
    

    /**
     * Presune zadany objekt do pozadovane pozice.
     *
     * @param objekt  presouvany objekt
     * @param x  x-ova souradnice pozadovane cilove pozice
     * @param y  y-ova souradnice pozadovane cilove pozice
     */
    public void presunNa( IPosuvny objekt, int x, int y ) 
    {
        presunO( objekt, x-objekt.getX(), y-objekt.getY() );
    }//public void presunNa( IPosuvny objekt, int x, int y ) 
    
    
    
    /**
     * Metoda prevadi instanci na retezec - 
     * pouziva se vetsinou pro ucely ladeni. 
     * Mela by ji definovat kazda trida a uvest v ni 
     * vsechny potrebne informace o vnitrnim stavu instance.
     *
     * @return     retezec informujici o vnitrnim stavu instance
     */
    public String toString() 
    {
        //Nasledujici prikaz nahradte vlastnim kodem
        return super.toString() + ", rychlost=" + rychlost;
    }//public String toString()


//== SOUKROME A POMOCNE METODY =================================================
//== VNORENE A VNITRNI TRIDY ===================================================
        
}//public class Presouvac
