Počítačové hry a animace Cvičení 3
Notová osnova ● Content pipeline ● Úvod do logiky ● Trigger engine ● Skriptování ● Pathfinding a A*
(3) Content Pipeline Kompilace do assetu pomocí –Content importerů Konverze do XNA nativních DOM pro content processor –Content procesorů Zkompiluje do managed code objectu k přímému použití v XNA
(4) Content Pipeline II Importéry pro 3D modely –Autodesk.FBX –DirectX.X Export FBX –Maya – Nutno zapnout v pluginech –Max – Přímo Export X – pro Maxhttp://
(5) Custom Content Importer Můžeme si napsat vlastní –Namespace Microsoft.Xna.Framework.Content.Pipeline Content Pipeline Extension Library Přetížit fci Import MeshBuilder –Pomocná třída pro načtení a uložení jednoho meshe Custom Model Importer sample na create.msdn.com US/education/catalog/sample/custom_model_importer US/education/catalog/sample/custom_model_importer
Co je herní logika ● Kolektivní název pro spoustu věcí ● Obecně, systém který rozhoduje co herní objekty dělají ● Mnoho možných způsobů implementace
Logické vazby ● Když se něco stane, hra nějak zareaguje ● Když hráč stiskne páku X, otevřou se dveře Y ● Když nepřítel A uvidí hráče, začne dělat B ● Když uplyne nějaká doba, stane se X ● Vazby chceme: ● Konfigurovatelné ● Rozumně flexibilní ● Co možná výpočetně nenáročné
Trigger engine ● Explicitní implementace systému logických vazeb ● Je definována sada triggerů, které lze emitovat ● Objekty se registrují jako posluchačí triggerů ● Emitovaný trigger se předá posluchačům ke zpracování
Co může být trigger? ● Konkrétní input od hráče ● Interakce s herním objektem ● Změna ve vyznačené lokaci ● Akce způsobující zvuk ● Uplynutí určité doby (časový trigger) ● Kolize mezi určitými objekty ● Jiná změna herního stavu
Anatomie trigger enginu ● Každý typ triggeru reprezentován třídou/strukturou ● Pro každý typ seznam zaregistrovaných posluchačů ● Posluchači se registrují a odregistrují ● Emitovaný trigger je distribuován mezi všechny posluchače ● Vložit trigger může kdokoliv zvenčí
Posluchači a synchronizace ● Dědí interface podle typu a exponují funkci na zpracování ● Každý drží dvě fronty na triggery ● Na začátku update cyklu switch ● Triggery se zpracovávají během update posluchače, ne hned při přijetí
Implementační detaily ● Posluchačem může být: ● Přímo herní objekt ● Skriptový objekt ● Je vhodné, aby trigger engine sám implementoval časové triggery
Skriptování ● Součástí popisu herní úrovně může být skript ● Lze v jakémkoliv skriptovacím jazyce který umíme interpretovat ● Skript se obecně spouští ve dvou fázích: ● 1. Inicializace – může umisťovat herní objekty, vypisovat brífing a především registrovat posluchače ● 2. Runtime – kusy skriptu zaregistrované jako posluchači v reakci na události
Skriptovací engine ● V zásadě pouze interpret daného jazyka ● Je třeba mu umožnit: ● Nahlížet na stav hry a měnit jej ● Zjišťovat a upravovat stavy herních objektů ● Registrovat posluchače a být posluchačem ● Ukončit hru ● Komunikovat s hráčem
Skriptovací engine – příklad ● ● Pro C# ECMAScript interpret JINT ● Instance třídy JintEngine obsahuje kontext ● Metoda SetParameter definuje proměnnou ● SetFunction definuje delegáta jako ES funkci ● CallFunction explicitně volá ES funkce
Skriptovací engine – závěr ● Logiku lze řešit jak v herním kódu, tak ve skriptech ● Je třeba zvážit tradeoff ● Vyberte si svůj oblíbený skriptovací jazyk a interpret a vesele skriptujte! ● ● LuaInterface
Triggery/Skripty - implementace Triggery Delegát public delegate void MyEventHandler(object sender, object args); Interface public interface ITriggered { void Fire(object sender, object args); } Skripty Reflection PropertyInfo pi = obj.GetType().GetField(„mVar“); pi.SetValue(obj,val,null); Stejné jako obj.mVar = val; Design patterns Když po nich toužíte, tak si přečtěte Gang of Four...
Code: Triggery Delegáti - delegate retval Name( params, … ); –public delegate void MyDelegate(); –MyDelegate del = new MyDelegate( MyFunction ); –del(); ArrayList – dynamické pole Add(); foreach(element E in ArrayList) { } Trigger má mít –Delegáty pro kontrolní fce –Delegáta pro vykonávací funkci –Funkci pro kontrolu v každém updatu Zkontroluje kontrolní fce Pokud všechny true, tak pustí vykonávací fci
Pathfinding ● „Herní AI je pathfinding“ ● V některých hrách nejviditelnější část AI ● Za splnění určitých předpokladů teoreticky vyřešený problém
Definice problému ● Vím, kde jsem ● Vím, kam se chci dostat ● Vím, kam bezprostředně můžu ● Vím, kolik co stojí ● Chci najít nejlevnější cestu z A do B
Definice problému ● Pozice a její změna mohou mít různé významy ● Lze zohlednit mnohem víc informací ● Možné aplikace později
Algoritmus A* ● Řeší problém pathfindingu ● Pomáhá si heuristikou ● Heuristika = odhad jak daleko je cíl z daného stavu ● Pokud existuje výsledek, vždy nalezne ten optimální pokud je heuristika přípustná – tj. Může odhad podhodnotit, ale nikdy ne nadhodnotit ● Přesnější odhad → kratší runtime
Aktualitka "Introduction to Artificial Intelligence" October 10th to December 18th 2011
A* Engine ● Herní komponenta (ke stažení), která polymorfně řeší pathfinding ● Děděním z AStarJob a AStarNode lze v jednom enginu najednou zpracovávat různé typy úloh ● Každé kolo provede nanejvýš zadaný počet výpočetních kroků
A* engine ● AStarJob: ● Musí umět vrátit prioritu (cykly se jobům rozdělují v poměru priorit) ● Musí umět vrátit startovní stav ● Voliteně inicializace, finalizace ● Má stav – uninitialized, working (počítá), finished (cesta nalezena), failed (cesta nenalezena) ● Na konci je v goal cílový uzel, přes předky dojdeme nejkratší cestou k počátku
A* engine ● AStarNode ● Reprezentuje stav ve stavovém prostoru ● Neměl by se duplikovat ● Musí umět: – Vrátit všechny dostupné sousedy – Spočítat si svou heuristiku – Vrátit vzdálenost k danému sousedovi – Ohlásit se, pokud je cílový
Příklady úloh ● Stavy jsou body v prostoru ● Přístupné jsou stavy do určité vzdálenosti ● Nejkratší cesta euklidovsky ● Heuristika: vzdálenost rovnou čarou k cíli ● Implementováno jako příklad
Příklady úloh ● Váhovaná pravidelná mřížka ● Cena průchodu závisí na typu pole a vlastnostech cestujícího ● Heuristika: přímá vzdálenost best-case rychlostí
Příklady úloh ● Navigace ve spojitém interiéru ● Navigation mesh ● Rozdělení prostoru, pohyb mezi startem a cílem nebo těsně kolem překážek ● Použito v UE3 ● Heuristika: vzdálenost přímou čarou
Příklady úloh ● Lze kromě pozice uvážit i orientaci či rychlost ● Cenou je čas ● Heuristika: ???