[#37]
Re: Pomysł gry strategicznej
@Minniat,
post #30
Mógłbyś sprecyzować co to jest ta część logiczna i abstrakcyjna część świata?
OK, w takim razie podam przykład jak ja bym widział abstrakcyjno-obiektową część twojego RTSa, na etapie projektu. Opisze tu kawałek hierarchii klas/obieków.
Najpierw zdefiniujmy obiekt, a dokładniej klasę opisującą podstawowy elemente świata gry który może wchodzić w jakąkolwiek interakcje z innymi elementami w trakcie rozgrywki (np.: drzewo, głaz, melanż, budynek, jednostka ruchoma, kopalnia ...), nazwijmy tą klase RTS_ITEM. Każdy obiekt tej klasy wyposażamy w następujące atrybuty:
POZYCJA - określona przez dwie wartości całkowite (x,y), jeśli bedziesz potrzebował trzeci wymiar możesz dodać trzecią wartość całkowitą (z). Jednak możliwe, że zamiast atrybutu (z) wystarczy artybut przyjmujący trzy wartości: pod poziomem zero, poziom zero, nad poziomem zero. One wystarczą do umiejscowienia obiektu na lądzie (np.: budynki, jednostki wojskowe naziemne), pod ziemią lub pod wodą (np. czerw w Dune 2 lub statek podwodny w Warcraft 2), nad ziemią (np.: jednostki latające)
ROZMIAR - określony poprzez dwie wartości naturalne całkowite dodatnie) (w - szerokość, h - wysokość), przyjmujemy że wysokość nie ma dla nas znaczenia
Teraz dla obiektu klasy RTS_ITEM definiujemy metody:
ustaw_pozycje(x, y) - funkcja ta zmienia atrybut POZYCJA
ustaw_rozmiar(w, h) - funkcja zmieniająca atrybut ROZMIAR, a jaki to ma sens? ... np.: możesz sobie wymyślić, że budynek może zostać unowocześniony, co pociągnie za sobą powiększenie jego rozmiaru (np.: zwiększenie wywydajnośći fabryki poprzez zwiększenie jej hali), etc
Mając już bazową klase będący jedynie abstrakcyjnym tworem, na jego podstawie ... albo inaczej, dziedzicząc się z niej definiujemy następną klase obiektu który prócz atrybutów i metod RTS_ITEM, będzie posiadał swoje. RTS_H_ITEM - klasa obiektu który posiada dodatkową własność, a mianowicie stan zdrowia, zatem atrybut:
ZDROWIE - wartość całkowita od 0 do 100 (health), obrazująca procentową wartość zdrowia
do tego metody:
ustaw_zdrowie(health) - ustawiajaca poprostu atrybut ZDROWIE
zmniejsz_zdrowie(wartosc) - zmienjszająca ZDROWIE o zadaną wartość
czy_zdrowy() - metoda zwracająca wartość boolowską (true/false) czy obiekt czasem nie wykitował
Ktoś może się zapytać dlaczego nie wprowadziłem tego atrybutu do klasy podstawowej RTS_ITEM, moja odpowiedź jest następująca: z klasy RTS_ITEM będą dziedziczone klasy obiektów typu niezniszczalnego, np.: głazy, dziury w podłożu, a z obiektu RTS_H_ITEM będą dziedziczone klasy obiektów zniszczalnych, np.: drzewa (tak jak w Warcrafcie), melanż (jak w Dune 2), budynki, jednostki ruchome.
Teraz z klasy RTS_H_ITEM dziedziczymy klase RTS_BUILDING_ITEM, opisująca obiekty budynków, posiadającą atrybuty typu budynku (Baraki, Fabryka, ...) etc. Dodatkowo z klasy RTS_H_ITEM dziedziczymy klase RTS_ARM_ITEM, opisującą obiekty uzbrojone (czołgi, samoloty ...) posiadające m.in. atrybut siły ognia etc.
Te dziedziczenia można robić na dwa sposoby, albo poprzez minimalną ilość klas kosztem zwiększania atrybutów (czyli tak RTS_BUILDING_ITEM), albo poprzez wprowadzanie nowej klasy dla każdego końcowego obiektu, czyli np.: oddzielna klasa dla Fabryki Czołgów, dla Fabryki Samolotów, dla Barraków itd.
Jakbyś pisał całość w C++ to zdecydowanie polecam podejście drugie, wraz z wykorzystaniem szablonów.
Co do obiektu opisującego świat gry, to pewnikiem będzie klasa zawierająca dwuwymiarową tablice elementów nieruchomych stanowiących wartość podkładu (piasek, trawa, woda). Czyli być może wystarczy poprostu tablica wartości całkowitych, albo może dobrze będzie też zdefioniować klasy, bo może się okazać że rodzaj podłoża będzie decydował o prędkości poruszania się jednostki, tym samym będzie posiadał jakiś atrybut SPOWOLNIENIE, ale już może nie będzie potrzeby atrybutu pozycja, która jest zdeterminowana przez indeksy w tablicy.
Reszte obiektów typu budynki, jednostki, można umieścić w listach będących elementami klasy obiektu świata gry. Teraz dodawanie nowych lub usuwanie obiektów danej klasy staje się wygodniejsze i łatwiejsze do zapanowania. Do listy w C++ najlepiej użyć któregoś z szablonów z STLa, np.: vector<>.
Teraz dzięki temu że całość została zhierarchizowana i jest bardzo abstrakcyjna, bardzo łatwe staje się rozwijanie całości np.: dodanie nowego rodzaju budynku (lotnisko) poprostu przez wydzidziczenie nowej klasy.
OK, tyle wystarczy z mojej strony ... to co przedstawiłem to jest tylko taki zarys, mój zamysł, który mam nadzieje choć troch nakieruje Cię na początkową faze projektowania abstrakcyjnego.