Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
mnn
Založen: 23. 07. 2008 Příspěvky: 23
|
Zaslal: 2. květen 2009, 11:54:25 Předmět: State machines v RTS |
|
|
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 ) 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 |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 2. květen 2009, 18:04:20 Předmět: |
|
|
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 |
|
|
franz
Založen: 30. 07. 2007 Příspěvky: 1325
|
Zaslal: 2. květen 2009, 18:38:55 Předmět: |
|
|
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 |
|
|
mnn
Založen: 23. 07. 2008 Příspěvky: 23
|
Zaslal: 2. květen 2009, 21:56:40 Předmět: |
|
|
franz: nieee, on ten tank iba čaká kým sa mu ten druhý tank neodstúpi 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 |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 2. květen 2009, 22:20:51 Předmět: |
|
|
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 |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 2. květen 2009, 23:20:45 Předmět: |
|
|
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 ) _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 3. květen 2009, 09:21:58 Předmět: Re: State machines v RTS |
|
|
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 ) 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
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 |
|
|
mnn
Založen: 23. 07. 2008 Příspěvky: 23
|
Zaslal: 3. květen 2009, 10:48:36 Předmět: Re: State machines v RTS |
|
|
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 |
Jasné, nenapadlo ma to zásobník - Stack
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 |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 3. květen 2009, 11:28:33 Předmět: Re: State machines v RTS |
|
|
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 |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 3. květen 2009, 13:01:28 Předmět: |
|
|
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 . 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 |
|
|
mnn
Založen: 23. 07. 2008 Příspěvky: 23
|
Zaslal: 5. květen 2009, 08:37:19 Předmět: |
|
|
Alebo by som mohol zmenšiť grid na veľkosť vojaka, čo by určite zabilo jednoduchosť detekcíí kolízií. |
|
Návrat nahoru |
|
|
lovci
Založen: 04. 12. 2009 Příspěvky: 12
|
Zaslal: 15. prosinec 2009, 12:25:40 Předmět: tiles |
|
|
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 .
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 |
|
|
|