Pole to element prostokątnej mapy, który porządkuje
na niej jednostki, budynki i inne obiety animowane powiązane z polem. Równocześnie pole
posiada referencję do znajdującego się na nim obiektu.
Pole posiada atrybuty jak typ terenu, czy obecność tzw. mgły wojny.
Pole może posiadać dodatkowo obiekt statyczny powiązany z polem, ale nie
kolidujący z obiektem dynamicznym (np. krater, bądź koleiny).
Zapiszmy te informacje jako kod w języku C.
|
Poniżej zapisuję wyliczenie typów obiektów powiązanych z polem. Obecnie to wyliczenie
przybiera 4 wartości, ale może być rozszerzone o nowe w miarę potrzeb. |
/* Typ obiektu na polu */
enum
{
BRAK, /* Na tym polu nie ma obiektu */
BUDYNEK, /* To pole zajmuje budynek */
JEDNOSTKA,
OBIEKT_ANIMOWANY
};
|
Poniżej znajduje się definicja stałych
flagowych. Wyliczenie póki co składa się tylko z atrybutu Mgła Wojny,
które mówi, czy dane pole zostało już odkryte przez gracza. |
/* Flagi pola */
#define BIT_MGLA_WOJNY 0 /* Pole jest ukryte */
#define FLAGA_MGLA_WOJNY (1L << BIT_MGLA_WOJNY)
|
I wreszcie, struktura pojedyńczego pola:
|
/* Struktura pojedynczego pola */
struct Pole
{
union
{
struct Budynek *budynek;
struct Jednostka *jednostka;
struct ObiektAnimowany *obiekt_animowany;
} obiekt;
struct ObiektStatyczny *obiekt_statyczny; /* Obiekt
powiązany z polem, ale go nie zajmujący (np. krater lub koleiny) */
UBYTE rodzaj_obiektu; /* Typ wyliczeniowy opisany wyżej */
UBYTE rodzaj_terenu; /* Typ wyliczeniowy */
ULONG flagi;
};
|
Klasa Mapa oprócz prostokątnej tablicy pól zawiera w sobie informację o
wszystkich obiektach powiązanych z mapą. Przechowuje zatem
jednostki, budynki, obiekty statyczne i animowane.
Mapa będzie tworzona na podstawie struktury
NowaMapa, która przechowuje wszystkie informacje potrzebne do
utworzenia mapy.
|
Najpierw zdefiniuję strukturę mapy.
|
/* Struktura mapy wiążacej planszę złożoną z pól, struktury budynków, jednostek
* i obiektów statycznych oraz animowanych.
*/
struct Mapa
{
struct Pole *mapa;
UBYTE szerokosc, wysokosc;
/* Zestawienie obiektów na mapie */
struct Budynek *budynki;
struct Jednostka *jednostki;
struct ObiektAnimowany *obiekty_animowane;
struct ObiektStatyczny *obiekty_statyczne;
};
|
Zdefiniujmy wstępną postać struktury NowaMapa, która zawiera tylko wymiary oraz
tablicę, w której przechowuje typ terenu dla każdego pola.
|
struct NowaMapa
{
/* Tablica, w której każdy element odpowiada terenowi danego pola */
UBYTE *teren;
UBYTE szerokosc, wysokosc;
};
|
Rodzaj terenu stanowi wyliczenie, a atrybuty terenu importowane są z zewnętrznej struktury.
Oto własności terenu:
|
/* Flagi cech terenu */
#define BIT_MOZLIWOSC_BUDOWY 0 /* Można tu budować budynki */
#define FLAGA_MOZLIWOSC_BUDOWY (1L << BIT_MOZLIWOSC_BUDOWY)
#define BIT_MOZLIWOSC_RUCHU 1 /* Jednostki mogą się po tym poruszać */
#define FLAGA_MOZLIWOSC_RUCHU (1L << BIT_MOZLIWOSC_RUCHU)
struct CechyTerenu
{
ULONG flagi;
UWORD szybkosc_poruszania; /* Szybkość poruszania się jednostek */
};
|
Klasy Budynek oraz CechyBudynku będą bardzo rozbudowana. Na razie skupmy się na
podstawowych atrybutach tych klas.
|
/* Status budynku */
enum {
WZNOSZONY,
GOTOWY
};
struct Budynek {
UWORD x, y; /* Współrzędne (w polach) lewego górnego rogu na mapie */
UWORD typ; /* Typ budynku (referencja do struktury CechyBudynku) */
ULONG flagi; /* Cechy boolowskie */
UWORD status;
UWORD pozostaly_czas; /* Czas pozostały do zakończenia obecnej czynności */
};
#define NAZWA_MAX 32
/* Cechy poszczególnych typów budynków */
struct CechyBudynku {
UBYTE nazwa[ NAZWA_MAX ]; /* Nazwa budynku */
UBYTE szerokosc, wysokosc; /* Rozmiary (w polach) budynku */
};
|
|