#define OBRAZ_PLANSZY

/*       Plik zawiera deklaracje klasy ObrazPlanszy podklasy klasy ObrazPlanszyAbs.
      Klasa ta posiada dodatkowo mozliwosc wyswietlania elementow swiata.
      Odwoluje sie do modulu z klasa ObrazElementuSwiata oraz ElementySwiata.       
      Posiada kolekcje obiektow obrazujacych elementy swiata ktore ma pokazywac
      (ObrazeElementuSwiata).
      Zdefiniowana jest w niej obsluga kursora pokazujacego ruszajacy sie
      obiekt obrazujacy zadany element swiata.
      
      
      Autor: Michal Wiktor Zmijewski (grupa 5)
*/      
                    
#include "naglowki/ObrazPlanszyAbs.h"
#include "naglowki/stale_Leming.h"
#include "naglowki/ElementySwiata.h"

  class ObrazPlanszy;
typedef int typ_stan;

#include "naglowki/ObrazElementuSwiata.h"

/* CZESC KONFIGURACYJNA ANIMACJI TERENU DO ODBIORU IMPULSU W OBRAZIEPLANSZY */
/* Nalezy odkomentowac jedna z definicji odpowiadajaca zadanej Animacji:*/

#define ANIMACJA_WYBIURCZA 
 /* kazdy animowany teren za kazdym razem losuje czy ma sie animowac */
//#define ANIMACJA_GRUPOWA
 /* za kazdym razem jest animowana tylko czesc elementow cyklicznie */
//#define ANIMACJA_DYSKRETNA
 /* co ktorys odbior impulsu nastepuje animacja wszystkich elementow */
 /* wpp brak animacji */ 


/* definicje typow */ 
typedef   map<ElementSwiata*,ObrazElementuSwiata*>  typ_kolekcja_elementow;
typedef   map<typ_stan,QwSpritePixmapSequence*>     typ_anim_stan;
typedef   map<typ_rodzaj,typ_anim_stan>             typ_anim_elementow;

/* deklaracja klasy obrazPlanszy */
class ObrazPlanszy : public ObrazPlanszyAbs {
    Q_OBJECT

public:
    ObrazPlanszy(QWidget* parent=0,const char* name=0, WFlags f=0);
    ObrazPlanszy(char*,char*,char*,Plansza& plan,QWidget* parent=0,
                                            const char* name=0, WFlags f=0);
    ~ObrazPlanszy();

    QwSpritePixmapSequence* animacja(typ_rodzaj rodz,int nr);
     /* usdostepnia animacje danego elementu swiata */
signals:
    void wyswietl();/* odbieraja go obrazy elementow swiata */
    void wcisnietyKursor(Para,int);/* jest wysylany do interfejsu jesli
      jest wlaczona obsluga kursora i prawy przycisk myszy zostal wcisniety */

public slots:
    void odbierzImpuls();/* odswierza rysunek */
    void odbierzImpulsPauza();/* odswierza rysunek podczas pauzy */
    void nieMaMyszki();/* kursor myszki jest poza widgetem */

    void dodajElementSwiata(Wejscie* ); /* metody dodajace obrazy zadanych elementow */
    void dodajElementSwiata(Wyjscie* ); 
    void dodajElementSwiata(Leming* ); 
    void dodajElementSwiata(Bloker* ); 
    void dodajElementSwiata(Pijus* ); 
    void dodajElementSwiata(SchodkarzGorny* ); 
    void dodajElementSwiata(SchodkarzDolny* ); 
    void dodajElementSwiata(SchodkarzPoziomy* ); 
    void dodajElementSwiata(KopaczPoziomy* ); 
    void dodajElementSwiata(KopaczPionowy* ); 
    void dodajElementSwiata(KopaczSkosnyWGore* ); 
    void dodajElementSwiata(KopaczSkosnyWDol* ); 
    void dodajElementSwiata(Bomba*); 

    void usunElementSwiata(ElementSwiata* ); /* usuwanie obrazu elementu swiata*/

    void kursorRodzaj(typ_rodzaj);/* wlaczenie kursora obrazujacego dany element swiata */

protected slots:
    void mouseMoveEvent(QMouseEvent*);
    void mousePressEvent(QMouseEvent*);

protected:
    typ_anim_elementow       anim_elementow; /* kolekcja animacji elementow swiata w poszczegolnych stanach */
    typ_kolekcja_elementow   kolekcja_elementow;/* kolekcja obrazow elementow swiata indeksowana tymi elementami */

    ObrazElementuSwiata     *kursor;

    void pobierzAnimacjeElementowSwiata(QWMatrix macierzSkali,QWMatrix macierzOdbicia);
        /* pobiera animacje elementow swiata w poszczegolnych stanach */
};/* ObrazPlanszy */