Do spisu modułów

2.3. Moduł ObrazPlanszy

 
2.3.3.1. ObrazPlanszyAbs
2.3.3.3. RozaWiatrow
2.3.3.4. Obraz
2.3.3.5. ObrazPlanszy
2.3.3.6. ObrazElementuSwiata i jej podklasy

Osoby pracujące nad modułem

  Autor: Michał Żmijewski  
  Weryfikator: Anna Doroś  
  Tester: Damian Wójtowicz  

Opis stałych i typów nieobiektowych

patrz:

#include <stale_ObrazPlanszy.h>

Poczatek


Klasa ObrazPlanszyAbs

ObrazPlanszyAbs jest klasą abstrakcyjną (należy w podklasach zdefiniować metodę odbierzImpuls) - podklasą QObject.
Odwoluje sie do klas Plansza i ObrazTerenu oraz do bibliotek: libSprite i Qt.
Jest odpowiedzialna za wizualizację planszy wirtualnej, a dokładnie tylko terenów w niej opisanych (tworzy ich rysunki). Rysunki terenów mogą być domyślne tzn. ich faktura jest wewnętrznie zdefiniowana, lub podane za pomaca pliku format najlepiej ppm dla rysunku własciwego, pbm dla maski.
Klasy dziedziczace magą na bierząco śledzić i uaktualniać rysunek terenów. Znajdują się tu odpowiednie narzędzia. Należy jedynie zdefiniować metodę odbierzImpuls (obecnie w pełni wirtualna).
Obiekt z podklasy dzidziczącej z tej klasy to widget posiadający scroollbary, będące RozaWiatrow (klasa zadeklarowana poniżej).
Można w nim śledzic myszkę.

#include <ObrazPlanszyAbs.h>

Funkcje publiczne
  • ObrazPlanszyAbs(const char*,Plansza&,QWidget* parent=0,const char* name=0,WFlags f=0)
  • ObrazPlanszyAbs(char*,char*,char*,Plansza&,QWidget* parent=0,const char* name=0,WFlags f=0)
  • QwSpritePixmapSequence* animacja(typ_teren rodz)
  • QPoint wspNaObrazie(QPoint)

Sloty publiczne

Atrybuty obiektowe chronione

  • plansza
- referencja na planszę wirtualna
  • powierzchnia
- obiekt klasy PowierzcniaPlanszy, na nim będą rysowane obrazki sprite'y
  • pixmapaPlanszy
- ewentualny wczytany rusunek planszy tzn. faktura terenów
  • maska
- kolekcja masek mask do wczytanych terenów tzn. są to dodatkowe maski nakładane na już istniejące terenów
  • anim_terenow
- kolekcja standardowych animacji terenów, (tereny z jedną klatką nie są animowane patrz. opis klasy ObrazTerenu. Standardowe animacje są używane przy dodawaniu nowych terenow lub gdy nie został podany plik z rysunkiem planszy
  • mapa_terenu
- kolekcja obiektów klasy ObrazTerenu odpowiedzialnych za wyświetlanie rysunków danego terenu lub ich animacji
  • mpos
- współrzedne kursora myszki względne w tym widgecie

Opis metod prywatnych patrz plik ObrazPlanszyAbs.h


ObrazPlanszyAbs::ObrazPlanszyAbs(const char*,Plansza&,QWidget* parent=0,const char* name=0,WFlags f=0)
Dostaje nazwę pliku z tłem dla planszy, referencję do planszy, i reszta tak jak dla widgetów w Qt.

ObrazPlanszyAbs::ObrazPlanszyAbs(char*,char*,char*,Plansza&,QWidget* parent=0,const char* name=0,WFlags f=0)
Dostaje nazwę pliku z tlem dla planszy, nazwę pliku z rysunkiem planszy, maskę do tego rysunku (formaty odpowiednio PPM,PBM), referencję do planszy. W przypadku braku pliku z rysunkiem nazwa powinna mieć w pierwszym polu znacznikkońca napisu '\0'.

QwSpritePixmapSequence* ObrazPlanszyAbs::animacja(typ_teren rodz)
Udostępnia animacje terenu .rodz'.

QPoint ObrazPlanszyAbs::wspNaObrazie(QPoint)
Przekształca względne współrzędne punktu na bezwzględne.

ObrazPlanszyAbs::odbierzImpuls() [abstrakcyjny]
Należy go zdefiniowac w podklasach.

ObrazPlanszyAbs::odbierzImpulsPauza() [abstrakcyjny]
Można go przedefiniowac w podklasach.

ObrazPlanszyAbs::zdjecie(char*)
Zapisuje aktualny rysunek planszy do zadanego pliku.

Poczatek


Klasa PowierzchniaPlanszy

Klasa pomocnicza klasy ObrazPlanszyAbs.
PowierzchniaPlanszy - obiekt tej klasy stanowi powierzchnie na której są wyświtlane elementy świata - sprite'y. Jest to podklasa QwImageSpriteField wewnętrznej klasy biblioteki libSprite.
Klasa abstrakcyjna - jest nad klasą wszystkich elementów świata oprócz terenu.

#include <ObrazPlanszyAbs.h>

Funkcje publiczne

PowierzchniaPlanszy::PowierzchniaPlanszy(QPoint rozmiar,int chunksize=16,int maxclusters=100)
Dostaje rozmiar planszy graficznej.

PowierzchniaPlanszy::PowierzchniaPlanszy(const char*,QPoint rozmiar,int chunksize=16,int maxclusters=100)
Jak wyżej, ale dodatkowo dostaje nazwę pliku z tłem. Może być pusty string.
Dopuszczalne formaty plików z tłem to PBM,GIF,PPM,PBM.
 

Poczatek


Klasa RozaWiatrow

Klasa pomocnicza klasy ObrazPlanszyAbs.
Jest to klasa pomocnicza wewnętrzna klasy Obraz, jest to windget zawierajacy "scrollbary" obrazu.
 
#include <ObrazPlanszyAbs.h>

Poczatek


Klasa Obraz

Klasa pomocnicza klasy ObrazPlanszyAbs.
Jest to wewnętrzny widget ObrazuPlanszyAbs zawierający powierzchnie planszy oraz rozeWiatrow jako scrollbary.

#include <ObrazPlanszyAbs.h>

Funkcje publiczne
  • Obraz(QwSpriteField* viewing=0, QWidget* parent=0, const char* name=0, WFlags f=0)
  • QPoint wspNaObrazie(QPoint)maxclusters=100)
  • void save()
  • void save(const char*)

Sloty

 

Opis metod prywatnych patrz plik ObrazPlanszyAbs.h


Obraz::Obraz(QwSpriteField* viewing=0, QWidget* parent=0, const char* name=0, WFlags f=0)
Konstruktor dostaje powierzchnię planszy.

QPoint wspNaObrazie(QPoint)maxclusters=100)
Zwraca współrzędne bezwzględne na rysunku planszy.

void Obraz::save()
Zapisuje rysunek całej planszy do pliku ../obrazki/plansza.png.

void Obraz::save(const char*)
Zapisuje rysunek całej planszy do pliku o nazwie będącej parametrem.

void Obraz::_vScroll(int)
Przesuwa w pionie wyświetlany fragment o zadaną ilość.

void Obraz::_hScroll(int)
Przesuwa w poziomie wyświetlany fragment.

Poczatek


 

Klasa PlanszyObraz

Klasa ta w stosunku do swojej nadklasy ObrazPlanszyAbs posiada dodatkowo możliwość wyświetlania elementów świata. Odwoluje się do klasy ObrazElementuSwiata oraz do modułu ElementySwiata.
Posiada kolekcję obiektów obrazujących elementy świata które ma pokazywać(ObrazeElementuSwiata).
Zdefiniowana jest w niej obsługa kursora pokazującego ruszający się obiekt obrazujący zadany element świata.
 
 
#include <ObrazPlanszy.h>
 
Funkcje publiczne
  • Konstruktory są analogiczne do występujacych w nadklasie ObrazPlanszyAbs
  • void pobierzAnimacjeElementowSwiata(QWMatrix macierzSkali,QWMatrix macierzOdbicia)

Sygnały

Sloty

Atrybuty obiektowe

  • anim_elementow
- kolekcja animacji elementów świata w poszczególnych stanach
  • kolekcja_elementow
- kolekcja obrazów elementów świata indeksowana tymi elementami
  • kursor
- wskaźnik na obiekt klasy obrazElementuSwiata pracujący w trybie kursora

void pobierzAnimacjeElementowSwiata(QWMatrix macierzSkali,QWMatrix macierzOdbicia)
Pobiera animacje elementów świata w poszczególnych stanach

void wyswietl()
Odbierają go obrazy elementów swiata.

void wcisnietyKursor(Para,int)
Jest wysyłany do interfejsu jesli jest włączona obsługa kursora i prawy przycisk myszy został wciśniety.

void odbierzImpuls()
Odświerza rysunek tzn. rysuje elementy świata, aktualizuje teren, ewentualnie scrolluje itp.

void odbierzImpulsPauza()
Odświerza rysunek podczas pauzy, nie jest wysyłany sygnał do elementów świata by się przerysowały w nowych pozycjach. Są rysowane w starych.

void nieMaMyszki()
Kursor jest poza widgetem.sloty dodajace obrazy zadanych elementów:

void dodajElementSwiata(Wejscie* ), void dodajElementSwiata(Wyjscie* ), void dodajElementSwiata(Leming* ), void dodajElementSwiata(Bloker* ), void dodajElementSwiata(SchodkarzGorny* ), void dodajElementSwiata(SchodkarzDolny* ), void dodajElementSwiata(SchodkarzPoziomy* ), void dodajElementSwiata(KopaczPoziomy* ), void dodajElementSwiata(KopaczPionowy* ), void dodajElementSwiata(KopaczSkosnyWGore* ), void dodajElementSwiata(KopaczSkosnyWDol* ), void dodajElementSwiata(Bomba*)
Sloty dodające obrazy zadanych elementów.

void usunElementSwiata(ElementSwiata* )
Usuwanie obrazu elementu świata.

void kursorRodzaj(typ_rodzaj)
Włączenie kursora obrazującego dany element świata.

Poczatek


Klasa ObrazTerenu i jej podklasy

Jest to klasa abstrakcyjna posiadająca następujące podklasy (wg hierarchii):

  • ObrazTerenu

    • ObrazTerenuDomyslny

      • ObrazTerenuDomyslnyAnimowany

    • ObrazTerenuZPixmapy

      • ObrazTerenuZPixmapyAnimowany

Są to klasy obiektów będących wizualizacją poszczególnych rodzajów terenów.Obiekty tych klas zarządzaja sprite'ami zadanego terenu.

 

#include <ObrazTerenu.h>

 

ObrazTerenuDomyslny w konstruktorze dostaje sekwecje klatek z rysunkami. Wybiera losowo jedna i ją wyświetla ze stopniem głębokości (oś z) zdefiniowanym w stale_ObrazPlanszy.h, a charakterystycznym dla danego terenu.

 

ObrazTerenuDomyslnyAnimowany dziedziczy z ObrazuTerenuDomyslnego. Z sekwencji klatek z rysunkami, którą dostaje w konstruktorze wybiera klatke o nr 0 jako stalą (tlo - stopień głębokości (oś z) charakterystyczny dla danego terenu) - reszta klatek jest używana do animacji. Stopień głębokości animacji (oś z) jest w stosunku do tla zwiekszony o oś z Leminga (tzn. Z_LEM).

 

ObrazTerenuZPixmapy dostaje qpixmapę całej planszy i z niej wycina rysunek przynależny sobie. Na rysunek może być nałożona dodatkowo maska (np.strzepiąca, schody). Domyślnie jest tylko pobierana maska odpowiadajaca fragmentowi wycietej pixmapy.

 

ObrazTerenuZPixmapyAnimowany dostaje dodatkowo sekwencje klatek animacji. Działa podobnie jak ObrazPlanszyDomyślnyAnimowany z tą różnica, że jako tło jest wczytywany odpowiadający fragment z zadanej pixmapy. Animacja o nr 0 jest pomijana.

 

Obiekty klas dopiskiem Animowany posiadają:

  • slot rysujSie()

który powoduje zmiane klatki z rysunkiem danego terenu - efekt animacji.

Atrybuty obiektowe
 
  • obraz
- wskaźnik na sprite terenu
  • wspPlanszy
- współrzędne terenu na planszy
  • wspObrazu
- współrzędne terenu na planszy ekranu graficznego
  • liczba_klatek
- wczytanych dla danego terenu
  • animacja
- posiadają tylko klasy z dopiskiem Animowany, sekwencja klatek
z animacją

Poczatek


Klasa ObrazElementuSwiata i jej podklasy

Jest to klasa abstrakcyjna. Jej podklasy odpowiedzialne są za wizualizacje elementów świata. Obiekty tych klas zarządzają sprite'ami odpowiadającymi zadanym elementom świata.

W konstruktorach podaje się wskaźnik na opowiadający element świata i wskaźnik na ObrazPlanszy. W przypadku braku pierwszego parametru jest przyjmowany tryb tzw. kursora tzn. będzie wyświetlany sprite obrazujący dany element i będzie następowala zmiana klatek lecz za każdym razem trzeba mu podać współrzędne wyświetlania na ogół współrzędne kursora myszki. W przypadku braku współrzędnych element stoi w miejscu. W trybie zwykłym każdy obiekt otrzymawszy sygnal na slot rysujSie() odczyta potrzebne informacje od odpowiadajacego mu elementowi świata takie jak: stan, zwrot_nosa, liczba_impulsow, licznik_impulsow, zapas sił ( odpowiednie dla danego elementu) i dobierze odpowiedni rysunek w odpowiednim miejscu na ekranie.

 

#include <ObrazElementuSwiata.h>

 

Atrybuty obiektowe

 

  • obrazPlanszy
- wskaźnik na ObrazPlanszy zarządcę
  • obraz
- wskaźnik na sprite odpowiadający danemu elementowi

 

Funkcje publiczne

Sloty


void pokazSie(QPoint pkt,QPoint mpos)
Metoda pokazująca leminga (kursor) w polu na planszy o współrzędnych. pkt, a na obrazie planszy mpos.
UWAGA !! funkcja ściśle uzależniona od obrazu planszy i jej trybu pracy. tzn. wylicza położenie kursora wzgledem widgetu obrazPlanszy a wzgledem siebie.

void pokazSie()
Każe tylko zmienić klatkę kursora.

void odwrocSie()
Odwraca element tzn. pobiera klatki odwróconego elementu.

rysujSie()
Pobiera właściwą animację dla danego elementu, wylicza jego położenie na podstawie elementu wirtualnego i go "wyświetla" w cudzyslowie gdyż wyświetlenie nastapi dopiero gdy obrazPlanszy zrobi update powierzchni planszy.

Poczatek