.[ ČeskéHry.cz ].
State machines v RTS

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Game Design
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
mnn



Založen: 23. 07. 2008
Příspěvky: 23

PříspěvekZaslal: 2. květen 2009, 11:54:25    Předmět: State machines v RTS Odpovědět s citátem

Zdravím, už sa mi podarilo ako-tak vyriešiť pohyb, teraz už rozmýšľam nad implementovaním state machine (neviem aký to má preklad Smile) na AI jednotiek. Momentálne aj pohyb jednotiek je vlastne state machine, ale špeciálny (osobitne definovaný v objekte jednotka). Jeden tutorial na nete na RTS používa taký princíp, že rôzne state machines sa ukladajú do listu a vykonáva sa len poslený pridaný (tj Idle -> Attack -> MoveTo ... jednotka sa dostavi na miesto: Idle -> Attack... zaútočí, zničí jednotku: Idle). Problém je v tom, že v mojom prípade tank mi nebude útočiť počas pohybu, preto som oddelil to a pohyb je nezávislý. Neviem aký by bol dobrý design na takýto problém.

download

EDIT: ešte taká otázočka: ako elegatne vyriešiť viacero vojakov na 1 políčku? Rozmýšľal som nad jedným objektom pre viacero vojakov, tj navonok by sa na to políčku nachádzal len 1 objekt a v tom objekte by boli tí vojaci. Len skomplikovalo by sa to pri označovaní jednotiek atď. Taktiež neviem ako by to bolo so vzdušnými jednotkami, na tie by som si urobil ďaľšie pole (akoby vrstvu). Tie jednotky by mali ešte výšku a keby pristáli tak by som ich odstránil z toho "vzdušného" poľa do toho normálneho "pozemného" poľa (v skutočnosti je to .NET List<>).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1552

PříspěvekZaslal: 2. květen 2009, 18:04:20    Předmět: Odpovědět s citátem

AI ti neporadím, ale k více jednotkám na jednom políčku: Evidentně to chce přidat k jednotce hodnoty x, y, které určují políčko. Pak budou moci být u více jednotek tyto hodnoty stejné, a to znamená, že jsou na jednom políčku.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
franz



Založen: 30. 07. 2007
Příspěvky: 1325

PříspěvekZaslal: 2. květen 2009, 18:38:55    Předmět: Odpovědět s citátem

ohledně pohybu je ještě chybka v tom, když se jedním tankem rozjedu a pak mu v dáli najedu do trajektorie jiným tankem - zastaví se o něj
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mnn



Založen: 23. 07. 2008
Příspěvky: 23

PříspěvekZaslal: 2. květen 2009, 21:56:40    Předmět: Odpovědět s citátem

franz: nieee, on ten tank iba čaká kým sa mu ten druhý tank neodstúpi Smile Zabudol som tam pridať, že ak po nejakom čase stále čaká, nech si vyhľadá novú cestu.

frca: no AI ako samotné to by som zvládol so zdrojmi ako gamedev, gamasutra atd. len ten design.
No jednotka má svoje súradnice, ale mám pole, ktorého prvky sú triedy, ktorá obsahuje informácie o políčku (typ terénu, objekt). Ten objekt totiž je len jeden, nie je to žiadne pole. Keby som z toho urobil pole horšie by sa mi s tým manipulovalo.

kód:
class Object
{
  int x,y;
  // atd.
}

class Tile
{
  int type;
  Object obj;  // tu je problem je tam len 1 objekt
}

class Terrain
{
  Tile[,] terrain;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1533
Bydliště: u Prahy

PříspěvekZaslal: 2. květen 2009, 22:20:51    Předmět: Odpovědět s citátem

No a proc tam je ten obj ve tride Tile? Vzdyt spojeni "objekt A se nachazi na policku B" je dano souradnicemi ve tride Object. Pak muzes mit vic objektu se stejnymi souradnicemi (no v pripade objektu mensich nez 1 tile jde testovat kolize s objekty okolo, aby se s nimi neprolinal - u tile-based hry by ty kolize byly klidne jen obdelmiky zarovnane na souradne osy - pak muzes mit vice malych objektu na 1 tile a pritom nebudou pres sebe).
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1552

PříspěvekZaslal: 2. květen 2009, 23:20:45    Předmět: Odpovědět s citátem

Pokud si ty souradnice x, y das misto do struktury jako klic do mapy (jeste treba s poradovym cislem vytvoreni jednotky, aby se nebily dva klice, kdyz budou jednotky stat na jednom miste), tak by z toho mohla vyjit pekna logaritmicka slozitost zjistovani obsahu tilu (at to potvrdi nekdo z masarny Smile )
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 765
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 3. květen 2009, 09:21:58    Předmět: Re: State machines v RTS Odpovědět s citátem

mnn napsal:
Zdravím, už sa mi podarilo ako-tak vyriešiť pohyb, teraz už rozmýšľam nad implementovaním state machine (neviem aký to má preklad Smile) na AI jednotiek. Momentálne aj pohyb jednotiek je vlastne state machine, ale špeciálny (osobitne definovaný v objekte jednotka). Jeden tutorial na nete na RTS používa taký princíp, že rôzne state machines sa ukladajú do listu a vykonáva sa len poslený pridaný (tj Idle -> Attack -> MoveTo ... jednotka sa dostavi na miesto: Idle -> Attack... zaútočí, zničí jednotku: Idle). Problém je v tom, že v mojom prípade tank mi nebude útočiť počas pohybu, preto som oddelil to a pohyb je nezávislý. Neviem aký by bol dobrý design na takýto problém.


Ad (Finite) state machine (česky "stavový automat, konečný automat") - ty by měly sloužit hlavně k rozlišení, co právě jednotka dělá ("pohybuje se", "čeká", "hlídá", ..). FSM jsou právě o tom, že stavů je konečný (malý) počet a s každým je asociované určité chování. Cílem FSM je rozložit jinak složité "celkové" chování jednotky na několik jednodušších a mezi těmi přepínat.

To, co jsi říkal se seznamem - tam do toho seznamu ukládáš spíš jednotlivé stavy než celé FSM (FSM = všechny stavy + přechody mezi nimi). A moc to nevychází. Protože to, co chceš ukládat jsou spíš specifikace akcí (jdi na pozici XY, zaútoč na jednotku Z, ...), které jsou od stavů odlišné například v tom, že mají parametry jako kam má jet, na koho má útočit, ... Provedení akce může vyvolat změnu stavu (akce jdi na pozici přepne jednotku do stavu "pohybuje se"), chování v určitém stavu může vést k přidání akcí (pokud jednotka "hlídá" a uvidí nepřítele, začne provádět akci "zaútoč na ...").

Jo a poslední věc - seznamu, ze kterého se odebírá na stejné straně jako se do něj přidává, se odborně říká zásobník Wink

Pokud jde o více jednotek na políčku - tady by sis měl rozmyslet, jestli opravdu chceš mít jednotky pevně přiřazenou k políčku, nebo je nechat na volných souřadnicích a seznam všech udržovat například v quadtree podle souřadnic (což bych doporučoval). Při pevném přiřazení k políčku budeš muset složitě řešit přejezdy jednotky mezi políčky (kdy ještě bude na výchozím a kdy už na cílovém).
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
mnn



Založen: 23. 07. 2008
Příspěvky: 23

PříspěvekZaslal: 3. květen 2009, 10:48:36    Předmět: Re: State machines v RTS Odpovědět s citátem

OndraSej napsal:
Ad (Finite) state machine (česky "stavový automat, konečný automat") - ty by měly sloužit hlavně k rozlišení, co právě jednotka dělá ("pohybuje se", "čeká", "hlídá", ..). FSM jsou právě o tom, že stavů je konečný (malý) počet a s každým je asociované určité chování. Cílem FSM je rozložit jinak složité "celkové" chování jednotky na několik jednodušších a mezi těmi přepínat.
To, co jsi říkal se seznamem - tam do toho seznamu ukládáš spíš jednotlivé stavy než celé FSM (FSM = všechny stavy + přechody mezi nimi). A moc to nevychází. Protože to, co chceš ukládat jsou spíš specifikace akcí (jdi na pozici XY, zaútoč na jednotku Z, ...), které jsou od stavů odlišné například v tom, že mají parametry jako kam má jet, na koho má útočit, ... Provedení akce může vyvolat změnu stavu (akce jdi na pozici přepne jednotku do stavu "pohybuje se"), chování v určitém stavu může vést k přidání akcí (pokud jednotka "hlídá" a uvidí nepřítele, začne provádět akci "zaútoč na ...").

No hej ale keď jednotka "bojuje" tak je napadnutá alebo sama útočí? Stratila veľa "života" a mala by sa stiahnúť? Jednotka môže "hliadkovať" a v tom sa dostane do boja. Zničí nepriateľa a mala by sa vrátiť naspäť "hliadkovať". Podobné to je aj keď "doprevádza" inú jednotku, zaútočí na nepriateľa a vráti sa "doprevádzať" ďalej.
Ja by som sa skôr priklonil k tomu, že v zásobníku by som mal nie stavy ale rovno stavové automaty, ktoré by mali vlastné stavy. A podľa toho čo by tie automaty robili tak v takom "stave" by bola jednotka. Napr. automat boj by rozhodoval čo urobiť - bojovať ďalej, stiahnuť sa. Ak by ho nepriateľ prenasledoval tak by naďalej útočil na toho nepriateľa.

OndraSej napsal:
Jo a poslední věc - seznamu, ze kterého se odebírá na stejné straně jako se do něj přidává, se odborně říká zásobník Wink

Jasné, nenapadlo ma to zásobník - Stack Smile

OndraSej napsal:
Pokud jde o více jednotek na políčku - tady by sis měl rozmyslet, jestli opravdu chceš mít jednotky pevně přiřazenou k políčku, nebo je nechat na volných souřadnicích a seznam všech udržovat například v quadtree podle souřadnic (což bych doporučoval). Při pevném přiřazení k políčku budeš muset složitě řešit přejezdy jednotky mezi políčky (kdy ještě bude na výchozím a kdy už na cílovém).


Quadtree by som sa chcel práve vyhnúť. Ak si si pozrel to demo, mohol si si všimnúť, že tie prechody mám už vyriešené, ale iba pre tanky a to je problém. Iba 1 vojak môže byť momentálne v jednom políčku, a ja by som ich chcel viac, tak 5-6. Potom by tí vojaci sa mohli prirodzene pohybovať aj vedľa seba, nie tak ako tanky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 765
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 3. květen 2009, 11:28:33    Předmět: Re: State machines v RTS Odpovědět s citátem

mnn napsal:
No hej ale keď jednotka "bojuje" tak je napadnutá alebo sama útočí? Stratila veľa "života" a mala by sa stiahnúť? Jednotka môže "hliadkovať" a v tom sa dostane do boja. Zničí nepriateľa a mala by sa vrátiť naspäť "hliadkovať". Podobné to je aj keď "doprevádza" inú jednotku, zaútočí na nepriateľa a vráti sa "doprevádzať" ďalej.
Ja by som sa skôr priklonil k tomu, že v zásobníku by som mal nie stavy ale rovno stavové automaty, ktoré by mali vlastné stavy. A podľa toho čo by tie automaty robili tak v takom "stave" by bola jednotka. Napr. automat boj by rozhodoval čo urobiť - bojovať ďalej, stiahnuť sa. Ak by ho nepriateľ prenasledoval tak by naďalej útočil na toho nepriateľa.


Možná jsem špatně popsal ty stavy... když bojuje, tak útočí. Když hlídá, tak útočí na nepřátele, kteří se k ní přiblíží. Takže v obou stavech vykonává úplně stejně akci zaútoč, jenom v jiném kontextu. Ten automat slouží spíš jako "nálada" jednotky, než na nějaké komplexnější rozhodování. Ano jde to řešit komplexněji, ale pak to nebude FSM. A i tak bych důrazně doporučoval oddělit vykonávání akcí od jejich plánování a cíle od stavů.

mnn napsal:
Quadtree by som sa chcel práve vyhnúť. Ak si si pozrel to demo, mohol si si všimnúť, že tie prechody mám už vyriešené, ale iba pre tanky a to je problém. Iba 1 vojak môže byť momentálne v jednom políčku, a ja by som ich chcel viac, tak 5-6. Potom by tí vojaci sa mohli prirodzene pohybovať aj vedľa seba, nie tak ako tanky.

Demo jsem nezkoušel, ale - s tím quadtree můžeš například každé jednotce dát poloměr, kde se nesmí vyskytovat jiná jednotka - tanku dáš velký poloměr, vojáčkům malý a celá situace s víc vojáčky na jednom tile se vyřeší celkem snadno.

Pokud to budeš dělat přes přiřazování jednotek k tilům, tak to sice jde (nahradit tu referenci na jednu jednotku seznamem referencí), ale budeš muset řešit spoustu speciálních případů a kombinací, které mohou/nemohou nastat na jednom tile.
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Ladis



Založen: 18. 09. 2007
Příspěvky: 1533
Bydliště: u Prahy

PříspěvekZaslal: 3. květen 2009, 13:01:28    Předmět: Odpovědět s citátem

Tak to nabastli tak, ze na tom policku bude teda array tech 6 jednotek, a bude kontrolovat, ze tam je max. 6 panaku nebo jen 1 velka jednotka (napr. tank), kdyz uz to mas takhle pekne napraseny Wink. Hra se aspon dodela, ty ziskas zkusenosti a pristi hru napises odznova a lepe. Mimoto hrace stejne nezajima, jak je to uvnitr udelane, hlavne kdyz to funguje.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mnn



Založen: 23. 07. 2008
Příspěvky: 23

PříspěvekZaslal: 5. květen 2009, 08:37:19    Předmět: Odpovědět s citátem

Alebo by som mohol zmenšiť grid na veľkosť vojaka, čo by určite zabilo jednoduchosť detekcíí kolízií. Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lovci



Založen: 04. 12. 2009
Příspěvky: 12

PříspěvekZaslal: 15. prosinec 2009, 12:25:40    Předmět: tiles Odpovědět s citátem

Já už se snažím políčkům ve hře vyhýbat jak jen to jde, protže to spíš jen přitíží než pomůže.
Čemu tato technika pomůže? Snad jen detekce kolize v konstantním čase(např bereš idčko z array[mouseClickX, mouseClickY] a máš rovnou nějaký odkaz. Ještě je to dobrý pro informace o terenu a groundu, ale to bych jako raster klidne zachoval.
Pohyb figur se, ale nevyplatí,protože problém s plynulým přecházením z pole na pole není zásadní, ale vychytat časování, abys myší klikl na ten zprávný objekt(pokud se vydal na cestu na druhý tile) není uplní sranda,a nemá-li ta hra být tahová je to docela problém, rozhodně věčí než kontrolovat kolize v nějaké části mapy, a navíc ti odpadne ten problém s více postavama na jendé buňce.
A ty kolize nemusíš počítat přesně na pixel, ale stačí přiřadit objektům nějaký jednoduchý collision border např vojáci maj malej čtvereček a tank větší obdélník(nebo opět čtverec a nebude to zlobit ani při rotaci).
Osobně to řeším raději přes imaginární pozici na mapě tedy jen X,X a možná i region, protože velké figury by stejně zabíraly více polí a tam by ty kolize včetně pathFindingu byly dost složité a řešit ten samí problém jako ty se zásobníkem figur je poměrně složité, hlavně pokud jde o více druhů jednotek na jednom tile, tak musíš vybrat který se má zobrazit, dále možnost dát figury na sebe spřátelených hráčů je dost obšírná věc. Např. zaůtočíš na playera, který je tvuj protivník, ale druhý co je tam s ním je neutral. No po utoku z artilerie na danné políčko jsou už asi oba enemy Very Happy.
Takže říkám: tiles ano, ale jen na terén a povrch, na figury jen u menších tahových her, v realtime mi to moc štastné řešení nepříjde, ikdyž to asi nějako řešit jde taky, ale nakonec je stím možná víc problému, než s nějakou kvalitnější prezentací světa po pixelu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Game Design Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna