package děla;

import rup.česky.tvary.Barva;
import rup.česky.tvary.AktivníPlátno;
import rup.česky.tvary.IKreslený;
import rup.česky.tvary.Multipřesouvač;
import rup.česky.tvary.Obdélník;
import rup.česky.tvary.Text;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;


/*******************************************************************************
 * Třída Dělo_1 demonstruje možnosti reakce na událost klávesnice.
 * 
 * Oproti třídě Dělo
 *
 * @author    Rudolf Pecinovský
 * @version   0.00.000,  0.0.2003
 */
public class Dělo_11b extends KeyAdapter implements IKreslený
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
    
    /* Aplikační okno, v němž se všechno odehrává. */
    protected static final AktivníPlátno AP = AktivníPlátno.getPlátno();
    
    /* Společný mulitpřesouvač všech pohyblivých předmětů ve hře. */
    protected static final Multipřesouvač MP = Multipřesouvač.getInstance();
    
    protected static final int   RYCHLOST_STŘELY    = 200;
    
    private static final int   VELIKOST_ZÁSOBNÍKU = 100;
    private static final int   VÝŠKA_PODSTAVCE = 20;
    private static final Barva BARVA_PODSTAVCE = Barva.ZELENÁ;
    private static final Barva BARVA_HLAVNĚ    = Barva.ČERNÁ;
    
    private static final int   X_POSUN_POPISKU = 5;
    private static final int   Y_POSUN_POPISKU = 3;
    private static final Barva BARVA_POPISKU = Barva.ČERNÁ;
    
    protected static final int VÝŠKA_PLÁTNA;
    static 
    {
        //VÝŠKA_PLÁTNA = P.zadej( "Zadej rozměr plátna", 500 );
        VÝŠKA_PLÁTNA = 300;
        AP.setKrokRozměr( 1, VÝŠKA_PLÁTNA, VÝŠKA_PLÁTNA );
    }
    
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
    
    private static int počet = 0;
    
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
    
    protected final Obdélník podstavec;
    protected final Obdélník hlaveň;
    protected final char     spoušť;
    protected final String   odpal;
    
    
    
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
    
    protected int  xPos;
    protected Text popisek;
    protected int  nábojů = VELIKOST_ZÁSOBNÍKU;
    
    
    
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

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

    /***************************************************************************
     * Implicitní konstruktor třídy Třída
     */
    public Dělo_11b(int x, char spoušť)
    {
        this.xPos = x;
        //Šířka podstavce a výška hlavně bude rovna pětinásobku průměru střely
        podstavec = new Obdélník( 
                        x - 2*Střela.PRŮMĚR, 
                        VÝŠKA_PLÁTNA - VÝŠKA_PODSTAVCE,
                        5 * Střela.PRŮMĚR,
                        VÝŠKA_PODSTAVCE,
                        BARVA_PODSTAVCE );
        hlaveň = new Obdélník(
                        x - 1, 
                        VÝŠKA_PLÁTNA - VÝŠKA_PODSTAVCE - 3*Střela.PRŮMĚR,
                        Střela.PRŮMĚR + 2,
                        3*Střela.PRŮMĚR,
                        BARVA_HLAVNĚ );
        this.spoušť  = spoušť;
        this.odpal   = "[" + spoušť + "] ";
        this.popisek = new Text( 
                        odpal + nábojů,
                        podstavec.getX() + X_POSUN_POPISKU, 
			podstavec.getY() + Y_POSUN_POPISKU, 
			BARVA_POPISKU );
        AP.přidej( this );
        AP.přihlašKlávesnici( this );
    }

    

//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================
    
    public void nakresli(rup.česky.tvary.Kreslítko kreslítko)
    {
        podstavec.nakresli( kreslítko );
        hlaveň   .nakresli( kreslítko );
        popisek  .nakresli( kreslítko );
    }    

    
//== PŘEKRYTÉ ABSTRAKTNÍ METODY RODIČOVSKÉ TŘÍDY ===============================
//== PŘEKRYTÉ KONKRÉTNÍ METODY RODIČOVSKÉ TŘÍDY ================================
    
    public void keyPressed( KeyEvent ke )
    {
        if( ke.getKeyChar() == spoušť )
        {
            Střela střela = new Střela( xPos, VÝŠKA_PLÁTNA );
            AP.přidejPod( this, střela );
            MP.přesuň( střela, xPos, 0, RYCHLOST_STŘELY );
        }
    }

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

    /***************************************************************************
     * Testovací metoda.
     * -
     * @param args Parametry příkazového řádku se nepoužívají.
     */
    public static void start_11b()
    {
        new Dělo_11b( 100, 'n' );
        new Dělo_11b( 200, 'm' );
    }


}

