Nawigacja Opis
  1. Wprowadzenie do projektu
  2. Plan ramowy pracy
  3. Wymienienie atrybutów klas
  4. Szczegółowy opis klas
Realizacja planu szczegółowego Słowniczek

Zajmiemy się teraz planem szczegółowym projektu i realizacją jego punktów.

  • Klasy odpowiedzialny za logikę
    • Podstawowa realizacja klas związanych z Mapą
      • Mapa (+ Nowa)
      • Pole (+ Cechy)
      • ObiektStatyczny (+ Nowy/ Cechy) - statyczna dekoracja na mapie
    • Realizacja klas Obiektów w grze strategicznej
      • Budynek (+ Nowy/ Cechy)
      • Jednostka (+ Nowa/ Cechy)
      • ObiektAnimowany (+ Nowy/ Cechy) - animowana dekoracja na mapie
      • Pocisk (+ Nowy/ Cechy)
      • Wybuch (+ Nowy/ Cechy)
  • Klasy odpowiedzialne za grafikę (w trakcie projektowania)
  • Klasy odpowiedzialne za interfejs użytkownika (w trakcie projektowania)
Każdy rozdział poświęcony realizacji klasy będzie posiadał następujący zestaw podpunktów:
  • Struktura klasy
  • Początkowe atrybuty egzemplarzu klasy
  • Atrybuty typów klasy
  • Funkcje operujące na klasie

Mapa, Pole i CechyTerenu. Budynek, CechyBudynku

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 */
};

Moje namiary: robert( DOT )szacki( AT )gmail( dot )COM