300 likes | 440 Views
Po čítačové hry a animace. Cvi čení 3. Notová osnova. Content pipeline Úvod do logiky Trigger engine Skriptování Pathfinding a A*. Content Pipeline. Kompilace do assetu pomocí Content importerů Konverze do XNA nativních DOM pro content processor Content procesorů
E N D
Počítačové hry a animace Cvičení 3
Notová osnova • Content pipeline • Úvod do logiky • Trigger engine • Skriptování • Pathfinding a A*
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
Content Pipeline II • Importéry pro 3D modely • Autodesk .FBX • DirectX .X • Export FBX • Maya – Nutno zapnout v pluginech • Max – Přímo • Export X • http://www.kwxport.org/ pro Max
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 Importersample na create.msdn.comhttp://create.msdn.com/en-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 • http://jint.codeplex.com • 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! • http://boo.codehaus.org/ • 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 • http://www.ai-class.com/ • "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: ???