Warsztat.GD

Programowanie => Inne => Wątek zaczęty przez: Nevermind77 w Czerwiec 28, 2007, 14:56:41

Tytuł: Jednostka klasą?
Wiadomość wysłana przez: Nevermind77 w Czerwiec 28, 2007, 14:56:41
Witam!

Tworzę tego swojego wspaniałego RTSa który ma być klonem Age of Empires. Mam pytanie skierowane do was. Jak lepiej zaprojektować system jednostek?

Ja się skłaniam do tego żeby każda jednostka była osobną klasą. Czyli pikinier to cPikinier, pan piechur to cPiechur, a japoński samuraj to cSamuraj.

Można kod zorganizować inaczej. Na przykład stworzyć klasę jednostek która walczy wręcz, inną klasę to wszelkie jednostki rażące, a jeszcze inne to statki. Poszczególny rodzaj jednostek to po prostu inaczej zainicjalizowane obiekty. Pikinier by był cWręcz z 5 ataku 2/2 obrony a samuraj to również cWręcz ale by miał 7 ataku i 3/3 obrony.

Jakie zalety ma jedno i drugie rozwiązanie? Pytanie kieruje głównie do osób doświadczonych.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Daniel22 w Czerwiec 28, 2007, 15:07:49
Jakie zalety ma jedno i drugie rozwiązanie? Pytanie kieruje głównie do osób doświadczonych.

Chyba nie jestem osobą doświadczoną, ale również zamierzam tworzyć RTS-a którego mam zaprojektowanego. Ja zaplanowałem to tak że mam jedną klase CJednostka, tam pełno wirtualnych metod typu OnRender, a potem dziedzicze inną klase po tej np. CŁucznik gdzie ma swoje staty i inne bajery.
Zresztą wedłuyg mnie ten problem można rozwiązać na wiele różnych sposobów.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Nevermind77 w Czerwiec 28, 2007, 15:09:49
Oczywiście że można na wiele sposobów, tylko osoby które mają doświadczenie mogą się wypowiedzieć jak to wygląda w praktyce ;) Może to uchronić przed jakimiś pułapkami których nie przewidziałem. ;)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: PlayeRom w Czerwiec 28, 2007, 15:14:00
E tam sie rozwodzisz o szczegoly. Ile programistow tyle bedzie rozwiazan. Usiadz na spokojnie, przemysl, sam wiesz najlepiej czego potrzebujesz - przynajmniej sam cos zaprojektujesz. A jak sie pomylisz to przynajmniej staniesz sie "dowiadczony" :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Kurak w Czerwiec 28, 2007, 15:26:25
Warto pomyśleć nad możliwością dodawania nowych typów jednostek np. w edytorze do gry :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Xion w Czerwiec 28, 2007, 17:42:31
Zakodowanie wszystkich jednostek na sztywno w postaci klas ma podstawową wadę: chcąc cokolwiek w tym względzie zmienić, trzeba rekompilować projekt. Proponuję w klasach zastosować tylko ogólny podział na kategorie (ziemna, wodna, latająca, itp.), a konkretne jednostki zapisywać w plikach konfiguracyjnych i z nich wczytywać ich parametry.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Krzysiek K. w Czerwiec 28, 2007, 17:59:37
Zakodowanie wszystkich jednostek na sztywno w postaci klas ma podstawową wadę: chcąc cokolwiek w tym względzie zmienić, trzeba rekompilować projekt. Proponuję w klasach zastosować tylko ogólny podział na kategorie (ziemna, wodna, latająca, itp.), a konkretne jednostki zapisywać w plikach konfiguracyjnych i z nich wczytywać ich parametry.
Ja bym poszedł jeszcze dalej i w plikach trzymał wszystkie parametry. Specjalizowane właściwości można zrobić na pseudo-skryptach - tabeli wskaźników na funkcje. Wiem, że w C++ do tego jest dziedziczenie i funkcje wirtualne, ale po co tworzyć nową klasę skoro chcę podmieniać jedną metodę? Nie kupuję świni, jeżeli chcę zjeść hot-doga. :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Masterio w Czerwiec 28, 2007, 18:07:25
Ja bym zrobił to w klasach i zastosował dziedziczenie.  8)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Nevermind77 w Czerwiec 28, 2007, 19:26:26
Póki co skłaniam się ku zaimplementowaniu kilku podstawowych klas i dam pliki w których będę przechowywać zmienne konkretniej definiujące obiekt. Nie chcę się bawić w języki skryptowe. Zrobię różne AI dla różnych klas i w pliku dam które ma być ładowane.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Reg w Czerwiec 29, 2007, 11:36:12
Ja proponuję proste kryterium:

- Jeśli jakieś rodzaje obiektów różnią się bardzo swoim działaniem, zrób osobne klasy dziedziczące z jakiejś bazowej CObjekt.
Na przykład murki i wszelkie przeszkadzajki stoją tylko nieruchomo i robią kolizje, podczas gdy wszelkie jednostki mogą się poruszać, strzelać, mieć swoje AI itp.
- Jeżeli różnice są tylko kwestią parametrów np. siła, prędkość, flaga czy lata czy chodzi, rodzaj broni itp., to zrobiłbym jako jedną klasę z odpowiednimi polami.

Mogą z tego wyjść trzy różne rozwiązania:

1. Każda jednostka to osobna klasa, tak jak proponujesz - czyli CPiechur, CSamuraj itp.
Tego nie polecam.
2. Coś pośredniego - klasy do ogólnych rodzajów obiektów (CPrzeszkadzajka, CBudynek, CJednostka), a reszta paremetrów jako pola tych klas.
3. Jedna klasa i wszystko opisywane przez parametry. To rozwiązanie jest najbardziej elastyczne i uniwersalna, ale niekoniecznie prostsze ani bardziej eleganckie od 2.

Pamiętam, jak wiele lat temu bawiłem się jakimś nieoficjalnym edytorem do StarCraft i tam można było sobie ustawić żeby dowolny obiekt, nawet budynek był uznawany jako jednostka, mógł chodzić, latać itp. Nie ma wątpliwości, że tam zastosowali rozwiązanie nr 3 :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Nevermind77 w Czerwiec 29, 2007, 13:57:56

2. Coś pośredniego - klasy do ogólnych rodzajów obiektów (CPrzeszkadzajka, CBudynek, CJednostka), a reszta paremetrów jako pola tych klas.

Chcąc zrobić 1. i tak bym zrobił pomiędzy cSamuraj a cObiekt jakąś klasę typu cRuchomy ;)

Póki co do tego typu się przymierzam. I tak jestem dopiero na fazie projektowania. Zamierzam korzystać z C++ a tam mam wspaniałe dziedziczenie wielokrotne z którego zamierzam aktywnie korzystać.

Cytuj
3. Jedna klasa i wszystko opisywane przez parametry. To rozwiązanie jest najbardziej elastyczne i uniwersalna, ale niekoniecznie prostsze ani bardziej eleganckie od 2.

Takie rozwiązanie jest okropne! :P

Jak już to bym się skłaniał do 2. i loadera który by ładował obiekt do odpowiedniej klasy.

Próbuje opisać relacje pomiędzy klasami w UMLu ale nie mam doświadczenia więc robię żeby było to czytelne dla mnie ;) Jak zrobię to zapewne wrzucę i wtedy będzie coś konkretniejszego do krytyki czy oceny poprawności.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Charibo w Czerwiec 29, 2007, 19:20:02
GPG2, Francois Dominic Laramee: Fabryka jednostek w grze
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Krzysiek K. w Czerwiec 29, 2007, 19:31:18
Cytuj
3. Jedna klasa i wszystko opisywane przez parametry. To rozwiązanie jest najbardziej elastyczne i uniwersalna, ale niekoniecznie prostsze ani bardziej eleganckie od 2.

Takie rozwiązanie jest okropne! :P
Powiedz to Carmackowi, bo tak był napisany Quake. ;) Tam gracz, przycisk, broń, potwór, rakieta, czy apteczka - wszystko korzystało z tej samej struktury Entity i zmieniało tylko jej parametry (w tym wskaźniki na funkcje skryptów). Podobnie w Thief'ie 1 i 2 wszystko było zgeneralizowane dzięki czemu w edytorze po prostu tworzyło się obiekt i ustawiało mu parametry (dziedziczenie było, ale zrobione na poziomie edytora, a nie silnika). W moich projektach takie podejście też sprawdza się wyśmienicie. :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Riddlemaster w Czerwiec 29, 2007, 20:09:39
Cytuj
Takie rozwiązanie jest okropne!
Jeśli dodasz klasy "na sztywno" to w poważniejszym projekcie co kilkanaście minut będziesz nękany przez designera, który zmienił jakiś parametr i koniecznie MUSI zobaczyć jak to będzie wyglądało w praktyce (i co gorsza ma rację). Jeśli zastosujesz podejście 3. to Ty sobie będziesz robił coś innego (albo nic), a projektant będzie zadowolony, bo w każdej chwili będzie mógł edytować dowolny parametr.
Patrząc na dzisiejsze gry, jest już normą, że logikę oddziela się od danych (a parametry jednostek do nich należą). Nie należy więc iść pod prąd.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Liosan w Czerwiec 29, 2007, 23:59:17
To rozwiązanie numer 1 jest OKROPNE (nie boję się tego krzyknąć!) Przerabiałem to:

 - Prowadzi do burdelu, saigonu, spaghetti i innych fajnych określeń na wygląd kodu.
 - Uniemożliwia napisanie sensownego (w sensie: łatwego w obsłudze i łatwego do napisania) edytora jednostek
 - Uniemożliwia tworzenie modów do gry i w ogóle modyfikowanie parametrów gry bez rekompilacji

Moja opcja w tej chwili to wrzucic jak najwięcej do pliku konfiguracyjnego (czytaj: gdzieś między rozwiązaniem 2. i 3.), np. w XML (XNL...? rozwiązanie rega :) ). W takim XML byś miał np. opis (nazwa, wygląd, animacje, opis tekstowy, zestaw dźwięków) parametry (życie, szybkość, jakie ma ataki: na odległość, wręcz, czary, naprawianie budynków) i róźne strategie/zachowania (np. strategia "trzymaj dystans", strategia "szarża", strategia "stój", strategia "i tak nie możesz się ruszyć" etc)

Liosan
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: zarius w Czerwiec 30, 2007, 02:40:02
Ja bym zrobil podobnie jak ktos tutaj napisal (chyba Krzysiek K. albo Reg ;p) ze masz jedna klase CUnit czy tam CTroop bez roznicy ;p i tam ew. rozne parametry typu m_CanAttackFlying m_CanAttackGround etc tak samo jak zasieg szybkosc ataku etc i to wszystko zapisywac w plikach, np INI albo XML.

W ten sposob gra bedzie latwo rozszerzalna :P
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: spax w Czerwiec 30, 2007, 12:02:05
@zarius

Dobrze napisałeś ale na daleką metę to chyba IMHO odpada. Bo co kiedy mamy jednostki latające, pływające, przekopujące się przez ziemie... Tutaj trzeba wyraźnego rozklasowania. A atrybuty oczywiście takie same dla wszystkich.

Chodzi mi o to, że mamy obiekt CUnit z wieloma atrybutami (nawet nadmiarowymi) i klasy z niej dziedziczące: CFlyUnit CSwimUnit CDigUnit które odpowiednio te atrybuty wykorzystują. Coś takiego można wtedy bardzo łatwo opisać w ini/xml.

<Units>
 <my_ship>
  <class>CSwimUnit</class>
  <energy>123</energy>
  <cost>123</cost>
  <speed>234</speed>
  <param>23</param>
 </my_ship>
</Units>

pozdrawiam.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Goliatus w Czerwiec 30, 2007, 13:38:02
Cytuj
W ten sposob gra bedzie latwo rozszerzalna
raczej źle zaprojektowana lub niezaprojektowana. Moim zdaniem jeśli ktoś robi klasycznego RTSa to powinien wiedzieć jakie będą jednostki, do czego będą służyly, jakie będą zależności, a kod powinien być skrojony na miarę. Zwłaszcza jeśli gra ma być klonem AoE, bo AoE wyróżnia się tym, że jednostki są tam dokładnie zaprojektowane i przemyślane(zasada kamień papier nożyce).

Jeśli już koniecznie ktoś chce mieć skrypty czy coś w tym stylu to proponuję napisać generator kodu.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Krzysiek K. w Czerwiec 30, 2007, 14:49:55
Goliatus: Niby skąd ma wiedzieć dokładnie, jakie będą jednostki? Na początek można jedynie strzelać w ciemno, a efekty będzie się dało ocenić dopiero jak już będzie pierwszy prototyp. Moim zdaniem nie da się zaprojektować porządnej rozgrywki bez testowania jej*, więc trzeba się przygotować na wprowadzanie poprawek, łącznie z całkowitymi zmianami właściwości jednostek i dodawaniem nowych jednostek. W takiej sytuacji, jeżeli koder chce mieć względny spokój, musi zakodować to tak, żeby designerzy i osoby odpowiedzialne za gameplay nie męczyły go co chwilę by przetestować nowe pomysły na poprawki (patrz post Riddlemastera). W tym przypadku generator kodu byłby równie niewygodny. :)


* Za potwierdzenie tego może służyć fakt, że Blizzard dopracowywał parametry jednostek w patchach na długo po wypuszczeniu StarCrafta.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: counterClockWise w Czerwiec 30, 2007, 15:18:12
Ale już w wersji release i tak trzeba będzie zrezygnować z tych plików *.ini czy xml-ów, nie?
Bo gdyby tak dać wszystkim graczom możliwość zmiany parametrów jednostek to tak jak opublikować cheaty razem z grą. Zabiłoby to rozgrywkę moim zdaniem - tzn. dobrym pomysłem jest zmiana parametrów w swoich scenariuszach, ale lepiej żeby te dostępne razem z grą i w kampanii były ustalone i niezmienialne.

W procesie developerskim to dobry pomysł, ale i tak wypadałoby potem rozwiązać to inaczej :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Kurak w Czerwiec 30, 2007, 15:23:14
Ale już w wersji release i tak trzeba będzie zrezygnować z tych plików *.ini czy xml-ów, nie?
Bo gdyby tak dać wszystkim graczom możliwość zmiany parametrów jednostek to tak jak opublikować cheaty razem z grą. Zabiłoby to rozgrywkę moim zdaniem - tzn. dobrym pomysłem jest zmiana parametrów w swoich scenariuszach, ale lepiej żeby te dostępne razem z grą i w kampanii były ustalone i niezmienialne.

W procesie developerskim to dobry pomysł, ale i tak wypadałoby potem rozwiązać to inaczej :)
A co złego w udostępnianiu takiej wersji graczom? Możliwość zmodyfikowania gry działa tylko na jej korzyść - wydłuża jej życie :)

I czy na pewno zabiłoby to rozgrywkę? Nie sądzę - tak, jak niektórzy używają cheatów, lepiej się dzięki temu bawiąc, tak ktoś może zmodyfikować jakiś parametr, który ułatwi jakiś element gry, i to będzie dla gracza lepsze :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Liosan w Czerwiec 30, 2007, 15:36:53
Cytuj
W ten sposob gra bedzie latwo rozszerzalna
raczej źle zaprojektowana lub niezaprojektowana...

Nie zgadzam sie z całością i z każdym stwierdzeniem z osobna :) nawet ADOM (pisany ponoc z generatora kodu) nie wpisuje się w to co mowisz. Snake może być tak napisany, ale w dzisiejszych czasach ludzie oddzielają logikę od danych i nie chce mi sie argumentowac czemu :)

A co złego w udostępnianiu takiej wersji graczom? Możliwość zmodyfikowania gry działa tylko na jej korzyść - wydłuża jej życie :)

I czy na pewno zabiłoby to rozgrywkę? Nie sądzę - tak, jak niektórzy używają cheatów, lepiej się dzięki temu bawiąc, tak ktoś może zmodyfikować jakiś parametr, który ułatwi jakiś element gry, i to będzie dla gracza lepsze :)

Zgadzam sie :) Po pierwsze, kto będzie chciał cheatować to i tak będzie. Po drugie, możesz całość spakować do jakiejś zaszyfrowanego zipa (blizzard, introversion etc...). Po trzecie, w rozgrywce sieciowej możesz porównywać wersje plików, żeby uniemożliwić zajście rozbieżności. I już.

Liosan
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Kurak w Czerwiec 30, 2007, 15:37:48
A wlasnie niekoniecznie. Taki Space Hack, wszystie ustawienia sa zapisane w golych plikach tekstowych wraz z opisami. Nie moglem sie powstrzymac, zeby sobie postaci nie podrasowac i gre ukonczylem zdecydowanie za szybko. Mozliwosc swobodnej edycji owszem, ale tylko tak jak counterClockWise mowi, czyli we wlasnych scenariuszach. Zasady oryginalnej kampanii powinny byc niezmienialne.
To zależy oczywiście od konkretnej gry i od podejścia gracza :) Niektórych interesuje granie z określonym poziomem trudności, a niektórzy wyżej cenią sobie np. fabułę czy też lubią widoki na różnych poziomach :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: zarius w Czerwiec 30, 2007, 15:56:20
Zle zaprojektowane ? Bredzisz.

Za przyklad mozna wziasc gre total annihilation, gra dawala tylko chyba dwa tryby rozgrywki a stala sie bardzo popularna bo byla tak latwo modyfikowalna ze na jej bazie praktycznie powstalo kilka zupelnie innych gier-modow wlasnie dzieki mozliwosci edycji prawie wszystkiego.

Elastycznosc to kwestia wyboru, jesli chcesz tworzyc projekt scisle zamkniety w swojej formule to taka gra po jej ukonczeniu ew. po kilku dniach stanie sie po prostu nudna no chyba ze naprawde bedzie w niej cos rewolucyjnego, a o to dzis dosyc trudno.

Ogolnie chodzi mi o sposob w jaki ja to bym zrobil zeby gra byla na tyle elastyczna ze pozniejsze wydawanie latek sprowadzalo by sie do podeslania kilku plikow z nowymi jednostkami etc a nie zaraz polowy gry wlacznie z plikiem exe.

Poza tym jak to ktos ladnie ostatnio na forum napisal, troche to przeksztalce (orginalnie bylo o pamieci ;p)

Co jest drozsze ? Pozniejsza modyfikacja, dodawanie i ew. przeprojektowywanie kodu aby dodac nowe rzeczy bo powstal bajzel > kilka tysiecy ( ;) ) dodanie kilku plikow tekstowych przez designera i skopiowane do odpowiedniego folderu - bezcenne ;p
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Goliatus w Czerwiec 30, 2007, 15:59:13
Współczynniki, wygląd - to oczywiście może być modyfikowalne nawet na żywo. Natomiast jeśli ktoś nie wie jakie w jego grze będą klasy jednostek to jest to znak, że za wcześnie zabrał się za kodzenie.

Skoro to ma byc klon AoE to powinna być zasada papier kamień nożyce, czyli kawaleria > artyleria > piechota > kawaleria itd. Czyli już wiadomo, że będą trzy klasy jednostek(piechota, kawaleria i artyleria). Rodzaj piechoty A od typu B będzie się różnił parametrami typu zasięg, odporność i wyglądem. Czyli również opracować listę parametrów oraz zależności jakie między nimi występują.

Nie oznacza to, że trzeba tworzyć trzy klasy w kodzie. Klasa może być jedna, łatwiej będzie zawrzeć w niej te podstawowe zależności. Tylko to wszystko trzeba wiedzieć wcześniej, a nie dorabiać na etapie kodzenia. Twórcy AoE od początku wiedzieli, że każda jednostka to:
- zasięg
- odporność na ataki w walce wręcz i dystansowe
- siła ataku wręcz i ataku na dystans
- szybkość ataku wręcz i na dystans
- rozrzut
- szybkość
i coś tam jeszcze

Wszystko sprowadza się do zrobienia takiej podstawowej konstelacji parametrów, które później decydują o kształcie całej gry. Taką listę można wypracować nie inaczej jak wyobrażając sobie większość możliwych jednostek w grze, grupowane ich w klasy, rozbijanie na parametry, a następnie znajdowani części wspólnych w tych parametrach.

Czym się różni strzelec od armaty? Armata jest wolniejsza i ma większy rozrzut :)

zarius: Można zrobić RTSa, ale można też zrobic silnik do RTSa, a następnie RTSa an tym silniku. Ty proponujesz to drugie. Ja twierdzę, że to pierwsze trwa krócej.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Krzysiek K. w Czerwiec 30, 2007, 17:11:54
Cytuj
Ale już w wersji release i tak trzeba będzie zrezygnować z tych plików *.ini czy xml-ów, nie?
Spakować ZIP'em na hasło i zmienić rozszerzenie na DAT. ;)

Cytuj
A wlasnie niekoniecznie. Taki Space Hack, wszystie ustawienia sa zapisane w golych plikach tekstowych wraz z opisami. Nie moglem sie powstrzymac, zeby sobie postaci nie podrasowac i gre ukonczylem zdecydowanie za szybko.
To już zależy od mentalności gracza. Ja zawsze staram się przechodzić grę przynajmniej na normalu i bez cheatów, chyba ze chcę się tylko z gra pobawić (np. w Doom 2 skaczemy do jakiegoś poziomu, włączamy nieśmiertelnośc, dajemy sobie wszystkie bronie i jazda). Cheaty przydają się, jeżeli gra jest zbyt trudna albo zbyt wkurzająca (np. Alien Shootera TE nie mogłem przejść, a po włączeniu cheatów zrobiło się całkiem fajnie). :)

Cytuj
Współczynniki, wygląd - to oczywiście może być modyfikowalne nawet na żywo. Natomiast jeśli ktoś nie wie jakie w jego grze będą klasy jednostek to jest to znak, że za wcześnie zabrał się za kodzenie.
Jak juz pisałem: a skąd ma wiedzieć, czy dana kombinacja jednostek się sprawdzi? Gameplayu tak łatwo nie przewidzisz.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Goliatus w Czerwiec 30, 2007, 17:23:16
Musi wiedzieć co chce zrobić, na czym ma polegać jego gierka. Rodzaje jednostek to nie jest detal, który można chwilowo zaniedbać.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Charibo w Czerwiec 30, 2007, 18:06:14
Wyobraz sobie, ze jakis game designer albo tester przychodzi do ciebie i mowi ci, ze 5 pikinierow na rozwalenie jednej machiny oblezniczej to za malo i gra jest za latwa. Co wtedy robisz? Zmieniasz parametr w skrypcie (prawdopodobnie w jakims edytorze po to specjalnie napisanym) czy wartosc zmiennej i przez kilkadziesiat minut rekompilujesz gre? A jesli po zmnianie parametrow nadal cos bedzie nie tak? Co jesli trzeba dodac nowa jednostke ktora wymyslil sobie designer i nadal ja testowac?
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Esidar w Czerwiec 30, 2007, 18:27:44
Musi wiedzieć co chce zrobić, na czym ma polegać jego gierka. Rodzaje jednostek to nie jest detal, który można chwilowo zaniedbać.

Każdy zaczyna robić grę mając jakiś pomysł. Stwierdzenie "coś jak AoE" jest zupełnie wystarczające żeby zacząć robić grę. Pod koniec projektu i tak z pomysłu zostaną tylko strzępy. Wystarczy przeczytać postmortem z robienia AoE II. http://www.gamasutra.com/features/20000307/pritchard_01.htm . Mieli dokładnie taki sam pomysł: Zrobimy coś jak AoE I. To będzie zwykły sequel. Zdąrzymy w rok na bank.... Ostatecznie zajeło im to 2 lata. W połowie projektu zorientowali się, że ich pierwotne założenia są równie bez sensu jak lokata.

Cytuj
Twórcy AoE od początku wiedzieli, że każda jednostka to:
Poczytaj więc postmortem o AoE II o tym co wiedzą developerzy na początku a co wychodzi na końcu.

Nie da się niczego z góry dobrze zaplanować i elastyczność i łatwość wprowadzania zmian, ma tutaj kluczowe znaczenie.

Cytując pewien mało znany film: "Welcome to the real world." :)


Natomiast co do konstrukcji klas. Najlepsze rozwiązanie to numer 3 :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Goliatus w Czerwiec 30, 2007, 18:33:14
Charibo: Przecież napisałem, że wartości parametrów mogą być dynamiczne. To jednak nia zmienia faktu, że musisz mieć mniej lub bardziej dokładną wizję rozgrywki. Musisz wiedzieć czy będzie coś takiego jak artyleria albo kawaleria, albo że nie będzie w grze UFO.

Esidar: pograj sobie w AoE3, w przypadku tej gry nie ma mowy o przypadkowości. Jest dokładnie tak jak napisałem: kamień papier nożyce.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: zarius w Czerwiec 30, 2007, 18:56:44
Cytuj
Ale już w wersji release i tak trzeba będzie zrezygnować z tych plików *.ini czy xml-ów, nie?
Spakować ZIP'em na hasło i zmienić rozszerzenie na DAT. ;)

Akurat to nie takie ";)" rozwiazanie bo quake 3 tak robil ;p tyle ze rozszerzenie bylo inne i hasla nawet nie bylo na wiekszosc paczek ;p
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Krzysiek K. w Czerwiec 30, 2007, 19:10:07
pograj sobie w AoE3, w przypadku tej gry nie ma mowy o przypadkowości. Jest dokładnie tak jak napisałem: kamień papier nożyce.
Właśnie - nie ma przypadkowości, bo developerzy o to zadbali podczas testów różnych rozwiązań. Gdyby zaplanowali wszystko na poczatki i się tego trzymali, w połowie projektu mogło by się okazać, że przez przypadek zabrakło kamienia w tym całym układzie. Jedynym sposobem na wyeliminowanie przypadkowości jest testowanie. :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Goliatus w Czerwiec 30, 2007, 19:23:03
Główna myśl, która wyznacza kształt calej gry powstała w fazie testów? Chyba sobie żartujesz :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Nevermind77 w Czerwiec 30, 2007, 19:47:24
Niby skąd ma wiedzieć dokładnie, jakie będą jednostki?

Jak klonuje AOE to mniej więcej mogę przewidzieć jakie będą stosunki pomiędzy jednostkami. ;)

Cytuj
łącznie z całkowitymi zmianami właściwości jednostek i dodawaniem nowych jednostek.

Chwila, moment! Statek nie będzie jeździć na lądzie.

Cytuj
W takiej sytuacji, jeżeli koder chce mieć względny spokój, musi zakodować to tak, żeby designerzy i osoby odpowiedzialne za gameplay nie męczyły go co chwilę by przetestować nowe pomysły na poprawki (patrz post Riddlemastera).

I jedynym słusznym do tego rodzaju zabaw jest rozwiązanie wykorzystujące pliki które może modyfikować każdy, lub jakiś edytor wewnątrz grze.

Cytuj
Pozniejsza modyfikacja, dodawanie i ew. przeprojektowywanie kodu aby dodac nowe rzeczy bo powstal bajzel > kilka tysiecy ( Wink ) dodanie kilku plikow tekstowych przez designera i skopiowane do odpowiedniego folderu - bezcenne ;p

Designer niby ma dostęp do jakich plików? Do tych odpowiedzialnych za AI? :P

Podstawowe parametry typu atak czy zasięg to jest jedna linia w kodzie, ale zmiana AI to i tu i tu problem...

Cytuj
Czym się różni strzelec od armaty? Armata jest wolniejsza i ma większy rozrzut

Strzelec to człowiek, armata maszyna. ;)
 
U mnie to odrębne klasy dzięki czemu np. niektóre technologie działają tylko na maszyny inne tylko na człowieka i kilka innych specyficznych różnic.

Cytuj
chyba ze chcę się tylko z gra pobawić

Owszem we wszelakich strzelankach god mode i unlimited weapons to fajna sprawa. Ale w RTSie gdzie jednym z głównych zadań jest rozwój gospodarki taki god mode nie jest jakoś super zabawny, a jak chcesz zrobić gigantyczną bitwę to używasz do tego edytora mapy a nie cheaty z jednostką. ;)

Cytuj
Wyobraz sobie, ze jakis game designer albo tester

Wyobraź sobie że to projekt jednoosobowy. ;)

Cytuj
Zmieniasz parametr w skrypcie (prawdopodobnie w jakims edytorze po to specjalnie napisanym)

Napisanie czegoś takiego też kosztuje trochę czasu, już wygodnie pliki ini, czy nawet zwykłe txt.

Podsumowując. Chcę napisać coś a'la Age Of Empires a nie silnik do tworzenia RTSów, w takim przypadku dawanie możliwości modyfikowania wszystkiego graczowi albo, o zgrozo, tworzenie czy używanie jakiegoś języku skryptowego mija się z celem i jedynie spowoduje niepotrzebne zamotanie i podniesienie poziomu wyzwania które i tak dla mnie jest niemałe.
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Charibo w Czerwiec 30, 2007, 20:00:38
Cytuj
Podstawowe parametry typu atak czy zasięg to jest jedna linia w kodzie
Czyli po kilkanascie/dziesiat minut na kazda rekompilacje po zmnianie takiej "jednej linii" ;)

edit@down: KK: moj najwiekszy jak dotad projekt kompiluje sie w calosci ok. 3 minuty, a jest relatywnie maly. No, moze z tymi kilkudziesiecioma minutami przesadzilem ;)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Kurak w Czerwiec 30, 2007, 20:06:27
Cytuj
Wyobraz sobie, ze jakis game designer albo tester

Wyobraź sobie że to projekt jednoosobowy. ;)

Cytuj
Zmieniasz parametr w skrypcie (prawdopodobnie w jakims edytorze po to specjalnie napisanym)

Napisanie czegoś takiego też kosztuje trochę czasu, już wygodnie pliki ini, czy nawet zwykłe txt.

Podsumowując. Chcę napisać coś a'la Age Of Empires a nie silnik do tworzenia RTSów, w takim przypadku dawanie możliwości modyfikowania wszystkiego graczowi albo, o zgrozo, tworzenie czy używanie jakiegoś języku skryptowego mija się z celem i jedynie spowoduje niepotrzebne zamotanie i podniesienie poziomu wyzwania które i tak dla mnie jest niemałe.
No OK, OK, to Twój topic, ale Ty najwidoczniej już się zdecydowałeś na jedno z rozwiązań, a wywiązuje się ciekawa dyskusja na temat tych 3 rozwiązań :)

Cytuj
Podstawowe parametry typu atak czy zasięg to jest jedna linia w kodzie
Czyli po kilkanascie/dziesiat minut na kazda rekompilacje po zmnianie takiej "jednej linii" ;)
No już nie przesadzajmy, kto każe rekompilować całość tak od razu, wystarczy jeden plik :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Krzysiek K. w Czerwiec 30, 2007, 20:32:17
Cytuj
Podstawowe parametry typu atak czy zasięg to jest jedna linia w kodzie, ale zmiana AI to i tu i tu problem...
AI może działac na podstawie tych parametrów. Na pewno koszt jednostki, zasięg, wytrzymałość, szybkość ruchu, obrażenia i różne atrybuty (pojazd, latające, statek, itp.) można w ten sposób w AI uwzględnić.

Cytuj
U mnie to odrębne klasy dzięki czemu np. niektóre technologie działają tylko na maszyny inne tylko na człowieka i kilka innych specyficznych różnic.
Prosisz się o problemy. ;) Przykład: klasa bazowa CJednostka i dziedziczące po niej CCzłowiek (piechur, snajper, itp) i CMaszyna (czołg, armata, itp). Problem pojawia się, gdy chcesz dodać na przykład jeepa ze zwiadowcą, bo niewatpliwie jest to maszyna, ale otwarta struktura pojazdu czyni z człowieka równie łatwy cel, a dziedziczenie wielokrotne ze wspólnym przodkiem w C++ niestety odpada.

Rozwiązaniem tu są flagi: jednostka ma atrybuty "człowiek" i/lub "maszyna", co jest uwzględniane przy wyznaczaniu obrażeń (np. trujący gaz działa tylko na jednostki z ustawioną flagą "człowiek"). Podobnie można zrealizować podstawowe atrybuty takie jak ciężki pancerz (odporność na broń małego kalibru), możliwość ruchu po wodzie i po lądzie (czołg/statek/amfibia) i tym podobne. :)

Cytuj
Wyobraź sobie że to projekt jednoosobowy. ;)
W takim przypadku i tak w razie większych zmian musisz mieszać w strukturze klas. :)

Cytuj
Czyli po kilkanascie/dziesiat minut na kazda rekompilacje po zmnianie takiej "jednej linii" ;)
A myślałem Visual C++ nie działa na 386. ;) Tyle to nawet mi się Blender nie kompilował (cały). :)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Nevermind77 w Czerwiec 30, 2007, 20:55:50
Cytuj
Prosisz się o problemy. Wink Przykład: klasa bazowa CJednostka i dziedziczące po niej CCzłowiek (piechur, snajper, itp) i CMaszyna (czołg, armata, itp). Problem pojawia się, gdy chcesz dodać na przykład jeepa ze zwiadowcą, bo niewatpliwie jest to maszyna, ale otwarta struktura pojazdu czyni z człowieka równie łatwy cel, a dziedziczenie wielokrotne ze wspólnym przodkiem w C++ niestety odpada.

Pomijając fakt że nie mam żadnej jednostki tego typu w planach to wiele technologii działa właśnie na cCzłowiek a inne na cMaszyna i jeżeli wrzucisz te obie flagi to technologie będą się nakładają. Taka jednostka jest dość problematyczna i według mnie powinna być jasno wciśnięta w jakiś wzór żeby nie było sytuacji że można takiego jeepa leczyć medykiem, lub żołnierza-załoganta potraktować mechanikiem ;)

No i znowu... Można ustawić parametry czy "CanBeHealed" i "CanBeRepair".

Jakiś czas temu bawiłem się w "a jak..." z tym że z takim podejściem kod mi się rozrastał a efekt był taki sam jakbym zrobił na sztywno. Owszem, istnieją parametry które należy dać do modyfikacji, ale inne które dałbym i tak byłyby mało, jeśli w ogóle, użyteczne.

Mam kilka założeń i z nich wynika jasno że nie mam żadnego robocopa który zasuwa na koniu i dlatego nie uwzględniam takich połączeń.

Dyskusja na ten temat jest dość jałowa bo to jak rozłożyć klasy zależy głównie od projektu. O ile 1. pomysł czyli rozdzielenie cŁucznik i cKusznik jest dość bezsensowny o tyle 2. który promuje cPiechu i cŁucznik ma pewien sens. Owszem w niektórych sytuacjach lepiej wziąć wariant 3. gdzie jest tylko cJednostka i multum parametrów do modyfikacji.

Wszystko zależy od tego co chcemy osiągnąć. Jeżeli chcesz dać możliwość zrobienia budynku na kółkach, proszę bardzo! Ale czy jest sens robienia czegoś co w założeniu ma być RTSem a po odpowiedniej modyfikacji parametrów zrobi się strategia turowa? :P

Cholera, czytając ten topic i zastanawiając się odnoszę wrażenie że rzeczywiście najlepiej byłoby zrobić cJednostka... Tylko czy jest sens? :P Owszem modyfikacja w plikach ini byłaby dobra, ale gorzej mi się widzi organizacja kodu. Tak mam podzielone na kilka dość hermetycznych klas i włala, a taka cJednostka? Hybryda!

No nic, pomyśle jeszcze. ;)
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Esidar w Czerwiec 30, 2007, 21:58:48
Rozwiązaniem tu są flagi: jednostka ma atrybuty "człowiek" i/lub "maszyna", co jest uwzględniane przy wyznaczaniu obrażeń (np. trujący gaz działa tylko na jednostki z ustawioną flagą "człowiek").
Tylko że w ten sposób, nie przewidziana jednostka (która może się pojawić w projekcie trochę później) człowiek w masce przeciw gazowej staje się... maszyną ? :)

Pisząc grę RTS czy RPG mechanika jest bardzo podobna i prędzej czy później pisze się kod który:

1. Modyfikuje atrybut raz.
2. Modyfikuje atrybut przez jakiś czas.
3. Wprowadza modyfikator zmian. Na "plus" (zwiększa modyfikacje parametru) lub na "minus" (zmniejsza modyfikację).
4. Wprowadza obiekt w specjalny stan.
5. Sprawdza czy atrybut osiągnie daną wartość. (np. czy HP == 0)

Za pomocą tych 5 rzeczy można opisać większość mechaniki spotykanej w grach. Idealnym rozwiązaniem jest więc zrobienie w każdym obiekcie listy atrybutów (zwykła wartość) oraz listy modyfikatorów (kod). I nie ma wtedy znaczenia czy atrybut nazywa się HP, DEF, Speed, Attack itd.

void ZadajObrazenia( silapocisku = 1, typ = "trucizna", czas=0 )
   silapocisku = ApplyModifiers( "HP", silapocisku, typ, czas );
   ModifyAttribute( "HP", obrazenia );

void LeczenieJednostki( silaleczenia = 1, typ = "mechaniczne" )
   silaleczenia = ApplyModifiers( "HP", silaleczenia, typ )
   ModifyAttribute( "HP", silaleczenia )

itd.

Definiowanie jakiegoś rodzaju jednostki to ustalenie rodzajów atrybutów, rodzajów modyfikatorów, oraz defaultowych stanów. Dla przykładu:
człowiek w masce:
    attribute { name = "HP", value = "1000", max = "1000" },
    attribute { name = "Speed", value = "10", max = "15" },
    attribute { name = "Level", value = "1", max = "10" },
    state { name = "poison", value = "immune" },
    state { name = "flamable", value = "yes" },
    modifier { name = "selfheal", value = "1", interval = "10", length = "infinite" }
    modifier { name = "light_armour", value = "5", interval = "const", length = "infinite", condition = "Level == 5" }

Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Liosan w Lipiec 01, 2007, 00:48:09
A propos flag: w takim dajmy na to War3 flag jest od groma, niektóre się pokrywają (np. nieumarły i nie-ożywiony, AFAICR), niektóre się wykluczają (np. bohater i budynek) natomiast logika gry/edytora nie wprowadza żadnych ograniczeń: można zaznaczyć wszystkie flagi i mapa się spakuje. Gra może się zachowywać... "dziwnie" :) ale programiści zaufali designerom i dali im pełną swobodę. Zresztą, nie widzę jakim problemem może być jeep z kierowcą... dodać flagę "odsłonięty pilot" i już :)

Liosan
Tytuł: Odp: Jednostka klasą?
Wiadomość wysłana przez: Goliatus w Lipiec 01, 2007, 02:12:20
Rzeczywiście w War3 można stworzyć różne dziwne rzeczy. Na jednej z map w BNecie widziałem wyścigi żaglówek. To dobrze świadczy o programistach, natomiast o designerach już nienajlepiej :)