Autor Wątek: Jednostka klasą?  (Przeczytany 5978 razy)

Offline zarius

  • Użytkownik

# 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

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# 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. :)

Offline Goliatus

  • Użytkownik
    • Warsztat - tworzenie gier

# 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 :)

Offline Nevermind77

  • Użytkownik

# 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.
« Ostatnia zmiana: Czerwiec 30, 2007, 19:52:13 wysłana przez Nevermind77 »

Offline Charibo

  • Redaktor

# 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 ;)
« Ostatnia zmiana: Czerwiec 30, 2007, 20:46:07 wysłana przez Charibo »

Offline Kurak

  • Użytkownik

# 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 :)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# 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). :)

Offline Nevermind77

  • Użytkownik

# 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. ;)

Offline Esidar

  • Użytkownik

# 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" }

« Ostatnia zmiana: Czerwiec 30, 2007, 22:09:46 wysłana przez Esidar »

Offline Liosan

  • Redaktor

# 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

Offline Goliatus

  • Użytkownik
    • Warsztat - tworzenie gier

# 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 :)