Tworzenie gry strategicznej typu Dune 2.


Poprzedni wpis (6) | Następny wpis (Plan Ramowy)

Wpis 7 (28.09.2016)

Temat: Dokładny opis struktur oraz funkcji modułu logicznego (bez implementacji)

Teraz zajmę się prototypami oraz strukturami danych poszczególnych modułów (jeszcze bez implementacji).

I. Moduł logiczny

1. Struktura mapy

Mapa zawiera tak naprawdę wszystkie elementy gry. Zawiera w sobie nie tylko planszę złożoną z pól, ale też struktury i jednostki. Wydzielona zostanie struktura NowaMapa opisująca początkowe parametry mapy. Ta struktura będzie używana przez funkcję tworzącą nową mapę.

Prostokątna tablica pól jest zdefiniowana jako osobna struktura. Elementem Tablicy Pól jest oczywiście pojedyncze pole. Każdy budynek, jednostka i efekt specjalny również ma swoja własną strukturę.

/* Struktura opisuje pojedyncze pole na mapie, które porządkuje obiekty
 * oraz posiada własny zestaw cech (rodzaj terenu). Pole zawiera też
 * informację o aktualnie powiązanych z nim budynków, jednostek bądź
 * efektów specjalnych. Pole zawiera też informację, czy aktualnie
 * zawartość pola jest widoczna, czy zasłonięta dla danego gracza.
 */
struct Pole;

/* Struktura opisuje własności typu terenu (np. szybkość poruszania
 * się jednostek, możliwość wnoszenia budynków itp.)
 */
struct CechyTerenu;

/* Struktura opisuje dwuwymiarową tablicę struktur Pole.
 * Jest to podstawowy składnik mapy, na którym toczy się gra.
 */
struct TablicaPol;

/* Struktura opisuje budynek na mapie i jego bieżące atrybuty.
 * Budynek zajmuje jedno, bądź kilka sąsiadujących ze sobą pól
 * na mapie, może być zaznaczony oraz, w zależności od typu,
 * może coś produkować na zlecenie (fabryka) lub wykonywać inną pracę.
 * Jest to jeden z podstawowych elementów gry strategicznej.
 */
struct Budynek;

/* Struktura opisuje wszystkie początkowe cechy nowego budynku, jak
 * przynależność, położenie i typ.
 */
struct NowyBudynek;

/* Struktura opisuje cechy poszczególnych typów budynków, takie jak
 * koszt, czas budowy, max. liczba punktów wytrzymałości, pobierana
 * energia elektryczna itp.
 */
struct CechyBudynku;

/* Struktura opisuje jednostkę na mapie i jej bieżące atrybuty.
 * Obok budynku, jest to drugi podstawowy element gry strategicznej.
 * Naziemna jednostka zajmuje jedno pole na mapie. Może być zaznaczona i
 * można wydawać jej rozkazy ruchu. Jednostka przemieszcza się między
 * sąsiednimi polami.
 */
struct Jednostka;

/* Struktura przechowuje wszystkie początkowe cechy nowej jednostki,
 * jak przynależność, położenie i typ.
 */
struct NowaJednostka;

/* Struktura opisuje cechy poszczególnych typów jednostek, takie jak
 * koszt, czas szkolenia, max. liczba punktów wytrzymałości, ilość
 * amunicji, szybkość poruszania się, rodzaj pancerza, czestotliwość
 * ataku, zasięg broni, zasięg widoczności itp.
 */
struct CechyJednostki;

/* Struktura opisuje punkt na mapie (np. cel ruchu, bądź ataku).
 * Nie muszą to być koniecznie stałe współrzędne, ale położenie danej
 * jednostki lub budynku na mapie. Wówczas punkt się przemieszcza
 * wraz z jednostką.
 */
struct Punkt;

/* Struktura opisuje efekt specjalny na mapie i jego bieżące atrybuty.
 * Efekt specjalny to wszelakiego rodzaju wybuchy, pociski, rakiety,
 * jak również kratery, koleiny itp. Atrybuty to: położenie, trajektoria
 * w przypadku efektów ruchomych, czas życia, ilość obrażeń, które zadaje
 * itp.
 */
struct EfektSpecjalny;

/* Struktura opisuje początkowe cechy nowego efektu specjalnego, jak
 * położenie i typ.
 */
struct NowyEfektSpecjalny;

/* Struktura opisuje cechy poszczególnych typów efektów specjalnych
 * Są to początkowe atrybuty, które przybiera efekt specjalny danego
 * typu.
 */
struct CechyEfektuSpecjalnego;

/* Struktura opisuje stronę konfliktu i jej bieżące atrybuty.
 * Podstawowym atrybutem jest liczba kredytów, ale może być też informacja
 * o ilości produkowanej i zużywanej energii elektrycznej,
 * status przeładowania super-broni itp.
 */
struct Strona;

/* Struktura przechowuje informację o nowej stronie konfliktu jak
 * początkowa liczba kredytów, kolor itp.
 */
struct NowaStrona;

/* Struktura opisuje charakterystykę każdej ze stron.
 * Mogą się tu zawierać cechy charakterystyczne typu drzewko rozwoju,
 * rodzaje jednoste i inne, typowe dla danej strony konfliktu własnośći.
 */
struct CechyStron;

/* Struktura opisuje mapę w grze ze wszystkimi elementami.
 * Konsoliduje elementy typu TablicaPol, Budynek, Jednostka,
 * EfektSpecjalny i Strona.
 */
struct Mapa;

/* Struktura opisuje początkowe parametry mapy.
 * Tutaj definiuje się rozmiar mapy i inne cechy początkowe.
 */
struct NowaMapa;
Teraz opiszmy prototypy funkcji:
/* Funkcje tworzące obiekty na podstawie cech początkowych */

/* Funkcja UtworzMape tworzy nową mape o pożądanych cechach początkowych. */
struct Mapa          *UtworzMape          ( struct NowaMapa *cechy   );

/* Podczas lub po utworzeniu Mapy można dodawać do niej różne obiekty:
 * Strony, Jednostki, Budynki i Efekty Specjalne. Robi się to dwuetapowo:
 * najpierw tworzy się daną strukturę, a następnie dodaje się ją do mapy.
 * Tutaj zestaw funkcji do tworzenia.
 */
struct Strona        *UtworzStrone        ( struct NowaStrona *cechy );
struct EfektSpecjany *UtworzEfektSpecjalny( struct NowyEfektSpecjalny *cechy );
struct Jednostka     *UtworzJednostke     ( struct NowaJednostka *cechy );
struct Budynek       *UtworzBudynek       ( struct NowyBudynek *cechy );

/* Teraz funkcje umieszczające obiekty na mapie w wyznaczonym punkcie
 * startowym. Punkt startowy dla strony konfliktu sygnalizuje położenie
 * bazy. W trybie gry (nie edytora) równocześnie te funkcje dodają te
 * obiekty jako słuchaczy zdarzeń cyklicznych. Oznacza to, że co pewien
 * czas wywoływane są funkcje cyklicznej obsługi tych obiektów.
 * Funkcje te generują zdarzenie "Dodano stronę/efekt specjalny/jednostkę/
 * budynek". Zdarzenie tego typu może być rejestrowane przez moduł
 * graficzny, który opcjonalnie doda element graficzny reprezentujący
 * dodany obiekt i ew. go wyświetli, jeśli jest aktualnie widoczny
 * poprzez moduł interfejsu.
 */
LONG DodajStrone        ( struct Mapa *, struct Strona *, struct Punkt * );
LONG DodajEfektSpecjalny( struct Mapa *, struct EfektSpecjalny *, struct Punkt * );
LONG DodajJednostke     ( struct Mapa *, struct Jednostka *, struct Punkt * );
LONG DodajBudynek       ( struct Mapa *, struct Budynek *, struct Punkt * );

/* Analogicznie funkcje usuwające obiekty z mapy, przydatne gdy
 * dany obiekt jest zniszczony. Obiekt zostanie logicznie z mapy usunięty,
 * zaś moduł graficzny zajmie się usunięciem elementu graficznego
 * reprezentującego obiekt po otrzymaniu wiadomości.
 */
LONG UsunStrone         ( struct Mapa *, struct Strona * );
LONG UsunEfektSpecjalny ( struct Mapa *, struct EfektSpecjalny * );
LONG UsunJednostke      ( struct Mapa *, struct Jednostka * );
LONG UsunBudynek        ( struct Mapa *, struct Budynek * );

/* Funkcje obsługujące cykl życia obiektu. */

LONG CyklBudynku          ( struct Budynek * );
LONG CyklJednostki        ( struct Jednostka * );
LONG CyklEfektuSpecjalnego( struct EfektSpecjalny * );
LONG CyklStrony           ( struct Strona * );
LONG CyklMapy             ( struct Mapa * );

2. Wydarzenia, polecenia i akcje.

Wydarzenia zachodzą w wielu sytuacjach. Typów wydarzeń będzie bardzo dużo. Budynek, który zakończy budowę generuje odpowiednie wydarzenie. Gracz, który naciśnie przycisk generuje odpowiednie wydarzenie, co może zakończyć się przesłaniem przez koordynatora interfejsu polecenia ruchu do jednostki.

Są też wydarzenia cykliczne, czyli odbywające się co jakiś czas. Przykładowo budynki i jednostki muszą być obsługiwane cyklicznie, żeby kontrolować postęp budowy czy ruch jednostki.

Wszystkie te rzeczy obsługiwane są w jeden sposób. Kiedy zachodzi jakieś zdarzenie to sprawdzane jest, czy jest zarejestrowany słuchacz dla tego typu zdarzeń. Słuchacz to struktura opisująca funkcję, jaką należy wykonać po zajściu zdarzenia, podając za parametr to zdarzenie.

/* Struktura opisuje słuchacza zdarzeń, który podejmuje akcję po przyjęciu
 * zdarzenia.
 */
struct Sluchacz;

/* Warto też zdefiniować Listę słuchaczy. */
struct ListaSluchaczy;

/* Struktura opisuje pojedyncze zdarzenie */
struct Zdarzenie;

/* Struktura opisuje typ zdarzenia */
struct TypZdarzenia;

/* Dodaje słuchacza do listy słuchaczy */
LONG DodajSluchacza( struct ListaSluchaczy **, struct Sluchacz * );

/* Tworzy strukturę zdarzenia danego typu */
struct Zdarzenie *NoweZdarzenie( struct TypZdarzenia * );

/* Wysyła zdarzenie do słuchacza */
LONG WyslijZdarzenie( struct Sluchacz *, struct Zdarzenie * );

II. Moduł interfejsu użytkownika

Ten moduł jest odpowiedzialny za wyświetlenie i obsługę interfejsu użytkownika, łącznie z wyświetleniem mapy. Grafikę mapy pobiera z modułu graficznego, zaś informacje o mapie i jej obiektach (np. celem sprawdzenie, czy na danym polu znajduje się obiekt do zaznaczenia) pobiera z modułu logicznego. Szczegóły tego modułu później.

Robert Szacki e-mail: robert.szacki(małpa)gmail.com