package letadla;

import rup.česky.tvary.Barva;

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

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


/*******************************************************************************
 * Třída Sbl_Třída slouží k ...
 *
 * @author    Rudolf Pecinovský
 * @version   0.00.000,  0.0.2003
 */
public class Střelba extends KeyAdapter
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /* Aplikační okno, v němž se všechno odehrává. */
    private 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. */
    private static final Multipřesouvač MP = Multipřesouvač.getInstance();

    /** Všechny střely budou mít stejnou rychlost. */
    public static final int RYCHLOST = 200;


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

    /* Příznak umožňující spustit pouze jednu instanci hry. */
    private static boolean spuštěno = false;



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

    /* Instance představující sestřelovaná letadla. */
    private final Letadlo letadlo;

    /* Instance představující hlaveň protiletadlového děla. */
    private final Obdélník hlaveň;

    /* Vodorovná souřadnice hlavně a střely. */
    private final int xStřely;



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

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

    /***************************************************************************
     * Konstruktor je soukromý, aby třída mohla zabezpečit,
     * že bude vytvořena jediná instance.
     *
     * @param šířkaNebe        Šířka zobrazované části nebe v bodech.
     * @param výškaNebe        Výška zobrazované části nebe v bodech.
     * @param délkaLetadla     Vodorovný rozměr přelétávajících letadel.
     * @param rychlostLetadla  Rychlost letadel v bodech za sekundu.
     */
    private Střelba( int šířkaNebe,    int výškaNebe,
                     int délkaLetadla, int rychlostLetadla)
    {
        spuštěno = true;    //Aby nebylo možo vytvořit další instanci

        //Nastav bodovou velikost plátna a udělej z něj nebe
        AP.setKrokRozměr( 1,  šířkaNebe,  výškaNebe );
        AP.setBarvaPozadí( Barva.AZUROVÁ );

        //Střílet budeme z poloviny plátna
        xStřely = (AP.getŠířka() - Střela.PRŮMĚR) / 2;
        int výškaHlavně = Střela.PRŮMĚR * 3;

        //Hlaveň bude na každé straně o 1 bod širší než střela
        //podle toho se musí upravit její rozměr i vodorovná pozice
        hlaveň  = new Obdélník(
                     xStřely - 1,                       //x
                     AP.getVýška() - výškaHlavně,       //y
                     Střela.PRŮMĚR + 2,                 //šířka
                     výškaHlavně,                       //výška
                     Barva.ČERNÁ );                     //barva
        AP.přidej( hlaveň );

        letadlo = new Letadlo( délkaLetadla, rychlostLetadla, MP );

        //Přihlaš se jako posluchač klávesnice
        AP.přihlašKlávesnici( this );
    }



//== 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 ================================

    /***************************************************************************
     * Metoda reagující na události klávesnice.
     *
     * @param ke   Událost klávesnice, na níž se bude reagovat.
     */
    public void keyPressed( KeyEvent ke )
    {
        if( ke.getKeyChar() == ' ' )
        {
            Střela střela = new Střela( xStřely, letadlo );
            MP.přesuň( střela, xStřely, Letadlo.VÝŠKA_OSY, RYCHLOST );
       }
    }



//== 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 =======================================================


    /***************************************************************************
     * Spustí hru se zadanými parametry. Pokusí-li se někdo spustit další
     * instanci hry, vyhodí výjimku IllegalStateException.
     *
     * @param šířkaNebe        Šířka zobrazované části nebe v bodech.
     * @param výškaNebe        Výška zobrazované části nebe v bodech.
     * @param délkaLetadla     Vodorovný rozměr přelétávajících letadel.
     * @param rychlostLetadla  Rychlost letadel v bodech za sekundu.
     */
    public static void start( int šířkaNebe,    int výškaNebe,
                              int délkaLetadla, int rychlostLetadla)
    {
        if( spuštěno )
            throw new IllegalStateException(
                "Hra již běží - nelze spustit současně několik instaníc hry" );
        new Střelba( šířkaNebe, výškaNebe, rychlostLetadla, délkaLetadla );
    }


}

