package balón;

import rup.česky.společně.P;
import rup.česky.tvary.Barva;
import rup.česky.tvary.Kreslítko;
import rup.česky.tvary.Kruh;


/*******************************************************************************
 * Třída Balón_12a simuluje pružný padající balón, který padá zrychleně dolů
 * a po dopadu se odrazí stejnou rychlostí, takže skáče donekonečna.
 *
 * @author    Rudolf Pecinovský
 * @version   0.00.000,  0.0.2003
 */
public final class Balón_12b extends Kruh
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Změna rychlosti za jeden snímek. */
    private static final int IMPLICITNÍ_VELIKOST = 20;

    /** Změna rychlosti za jeden snímek. */
    private static final Barva IMPLICITNÍ_BARVA = Barva.ČERVENÁ;

    /** Gravitační zrychlení. **/
    private static final double GRAVITAČNÍ_ZRYCHLENÍ  = 400;

    /** Počet překreslení za sekundu. */
    private static final int FREKVENCE = 50;

    /** Čekání mezi snímky. */
    private static final int PERIODA = 1000 / FREKVENCE;

    /** Změna rychlosti za jeden snímek. */
    private static final double SNÍMKOVÉ_ZRYCHLENÍ =
                                    GRAVITAČNÍ_ZRYCHLENÍ / FREKVENCE;



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

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

    /***************************************************************************
     * Implicitní konstruktor vytvoří v levém horním rohu aktivního plátna
     * balón o průměru 25 a nechá jej spadnout.
     */
    public Balón_12b()
    {
        this( 0, 0, IMPLICITNÍ_VELIKOST, IMPLICITNÍ_BARVA );
    }


    /***************************************************************************
     * Vytvoří nový balón na zadané pozici a o zadaném průměru
     * a nechá jej spadnout.
     */
    public Balón_12b(int x, int y, int průměr, Barva barva)
    {
        super( x, y, průměr, barva );
        AP.přidej( this );
        spadni();
    }



//== 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 ================================
//== NOVĚ ZAVEDENÉ METODY INSTANCÍ =============================================

    /***************************************************************************
     * Přesune balón do zadané pozice a nechá jej odtud spadnout.
     */
    public void přesuňNa( int x, int y )
    {
        setPozice( x, y );  //Nastavení pozice můžeš svěřit rodiči
        spadni();           //Začni padat
    }


    /***************************************************************************
     * Simuluje poskakování balónu v gravitačním poli.
     * Balón se po dopadu odrazí stejnou rychlostí jako dopadl.
     */
    private void spadni()
    {
        double konečné_y = AP.getBVýška() - getVýška();
        double rychlost  = 0;
        double y = getY();

        for(;;)
        {
            while( y < konečné_y )
            {
                rychlost += SNÍMKOVÉ_ZRYCHLENÍ;
                y += rychlost / FREKVENCE;
                //Rodičovská verze setPozice vyžaduje celočíselné parametry -
                // aktuální svislou souřadnici proto musíme přetypovat
                setPozice( xPos, (int)y );
                P.čekej( PERIODA );
            }
            //setPozice( xPos, (int)konečné_y);
            y = konečné_y - 1;     //Aby opět vstoupil do cyklu while
            rychlost = -rychlost;
        }
    }


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

    /***************************************************************************
     * Test vytvoří implicitní balón a nechá jej spadnout.
     * Pak vytvoří druhý balón a po jeho dopadu přesune první do nové pozice
     * a opět jej odtud nechá spadnout.
     */
    public static void test()
    {
        AP.odstraňVše();
        //Velikost aktivního plátna ne nastavena na obrazovku 1024×768
        AP.setKrokRozměr( 50, 3 , 15 );
        AP.setMřížka( true );

        Balón_12b b1 = new Balón_12b();
        Balón_12b b2 = new Balón_12b( 100, 100, 50, Barva.MODRÁ );
        b1.přesuňNa( 50, 50 );
    }


}

