MASARYKOVA UNIVERZITA

FAKULTA INFORMATIKY

Æ

Využití 3D myši v herním systému

BAKALÁRSKÁPRÁCEˇ

Martin Kuriplach

Brno, jaro 2013 Prohlášení

Prohlašuji, že tato bakaláˇrskápráce je mým p ˚uvodnímautorským dílem, které jsem vypracoval samostatnˇe.Všechny zdroje, prameny a literaturu, které jsem pˇrivypracování používal nebo z nich ˇcerpal,v práci ˇrádnˇecituji s uvedením úplného odkazu na pˇríslušnýzdroj.

Martin Kuriplach

Vedoucí práce: Mgr. Martin Bezdˇeka

i Shrnutí

Cílem práce je vytvoˇritjednoduchou poˇcítaˇcovouhru používající 3D myš jako hlavní vstupní rozhraní hry. V práci je popsáná funkce a ovládání tohoto ovladaˇce.Herní koncept je pˇrizp˚usobenovládání pomocí zaˇrízení SpacePilot PRO. Jedním z požadavk ˚una vytváˇrenouhru bylo to, aby byla implementována v nˇekterémz dostupných herních vývojáˇrskýchbalíˇck˚u (Software Development Kit – SDK). Pro výslednou hru byly vypracovány 3D modely a textury, které byly použity pro pˇrípravuprefabrikát ˚unebo jako prvky prostˇredíherních úrovní.

ii Klíˇcováslova

3D mouse, 3D myš, , game SDK, software development kit, game development, vývoj her, six degrees of freedom, sdof

iii Podˇekování

Chtˇelbych podˇekovat vedoucímu bakaláˇrsképráce Mgr. Martinovi Bezdˇe- kovi za jeho rady a pˇripomínky, a personálu laboratoˇreHCI, kteˇrími po- skytli zázemí potˇrebnék vypracování této práce. Dále dˇekujisvým rodi- ˇc˚um,sestˇrea pˇrátel˚um,kteˇrímˇepodporují po celou dobu studia na Masa- rykovˇeuniverzitˇe.

iv Obsah

1 Úvod ...... 1 1.1 Digitální hry ...... 1 1.2 Zaˇrízení3D myš ...... 2 2 Návrh hry a srovnání herních SDK ...... 4 2.1 Herní koncept ...... 4 2.2 Herní SDK ...... 5 2.3 VýbˇerSDK do srovnání ...... 6 2.4 Porovnání ...... 7 2.4.1 Esenthel Engine ...... 8 2.4.2 NeoAxis Engine ...... 8 2.4.3 Torque3D ...... 9 2.4.4 Unity3D ...... 9 2.4.5 Engine ...... 10 2.4.6 CryEngine 3 ...... 10 2.4.7 3 ...... 11 2.4.8 4 ...... 12 2.4.9 Panda 3D ...... 13 2.5 Závˇerporovnání ...... 13 3 Implementace ...... 16 3.1 Použitý software ...... 16 3.1.1 UDK ...... 16 3.1.2 Další software ...... 16 3.2 Implementace DI3dCnnxn.dll ...... 18 3.2.1 Vstupní bod dynamické knihovny ...... 18 3.2.2 Získávání dat ze zaˇrízení ...... 20 3.3 UnrealScript ...... 23 3.3.1 Herní typ ...... 23 3.3.2 Kontrolér ...... 25 3.3.3 Hráˇcovalod’ ...... 27 3.3.4 Stˇrelba ...... 28 3.3.5 AI nepˇrátel ...... 29 3.4 Grafické prvky ...... 30 3.4.1 3D modely ...... 30 3.4.2 Uživatelské rozhraní ...... 31 4 Závˇer ...... 34 Pˇrílohy PˇrílohaA – Instalace hry ...... 37

v PˇrílohaB – Herní manuál ...... 38

vi 1 Úvod

1.1 Digitální hry

Poˇcítaˇcová hra m ˚uže být zajímavým digitálním dílem spojující prvky interaktivity[2] a narace. Autor pomocí herních sekvencí vypráví pˇríbˇeha výborná hratelnost zajistí, že hráˇcdohraje hru až do konce. P ˚uvodnˇeprogramovány jednotlivci nebo menšími skupinami pro zá- bavu, jsou dnes poˇcítaˇcovéhry zdrojem velkých zisk ˚upro herní spoleˇc- nosti, investujících miliardy dolar ˚udo jejích vývoje a marketingu. Každý z vydaných titul ˚uale ne vždy splní oˇcekávánívydavatel ˚u. Vývoj poˇcítaˇcových her se jako disciplína dostává do popˇredízájmu vzdˇelávacíchinstitucí, jelikož herní studia hledají nové talentované vývo- jáˇrer ˚uznýchzamˇeˇrení.Tyto specializace vˇetšinouvyžadují velké množství zkušeností, protože uživatelské nároky na kvalitu her, jak po technické, tak umˇeleckéstránce, se neustále zvyšují. Toto se týká pˇredevšímPC platformy a herních konzolí, kde je vývoj hnán dopˇredu[2]stále výkonnˇejšímhard- ware. U mobilních zaˇrízeníse uživatelé musí spokojit s nižší grafickou kva- litou nebo rozsahem hry. Každá hra je postavena na urˇcitémherním engine (jádˇre),které zajiš- t’uje vykreslování snímk ˚una obrazovku, manipulaci s daty a zpracování uživatelských pokyn ˚u.Zjednodušená herní smyˇckavypadá napˇr.takto: 1. Pˇreˇctivstupní data, 2. Aktualizuj herní objekty a stav hry, 3. Pˇripravsnímek pro vykreslení na obrazovku, 4. Pˇrehrajzvuky. Souˇcástíkaždé hry je její vstupní rozhraní, které umožˇnujevykonávat hráˇci herní akce. Postupem ˇcasu,jak se hry vyvíjely, se zaˇcalyvyrábˇetr ˚uznéovla- daˇce.Nˇekteréjsou si podobné, ale vˇetšinaz nich používá jiný model ovlá- dání kv ˚ulilišící se konstrukci nebo poˇctuovládacích prvk ˚u(tlaˇcítek,po- suvník ˚u,páˇcek). Momentálnˇemezi nejpoužívanˇejšípatˇrímyš, klávesnice a herní kontro- lér (Xbox 360, PlayStation 3), v menší míˇrepak joystick nebo volant. Kromˇe zmínˇených”klasických“ existují také ”exotiˇctˇejší“zaˇrízení,nˇekteráz nich vˇetšinahráˇc˚uani nezná. Jedná se o haptické ovladaˇce,r ˚uznésnímaˇcepo- hybu, datové rukavice aj. V této práci se zabývám pˇredevšímzaˇrízením3D myši.

1 1. ÚVOD

1.2 Zaˇrízení3D myš

3D myš je polohovací zaˇrízeníschopné snímat pohyb zaˇrízenína 6 osách. Zaˇrízeníjako napˇr.poˇcítaˇcovámyš nebo joystick, jsou schopné snímat pouze osy dvˇe.První 3D myši se zaˇcalyvyrábˇetpˇribližnˇeod roku 1990[8]. Jednalo se o model Logitech SpaceMouse a pozdˇeji„3D RingMouse“ od spoleˇcnosti Kantek.

Obrázek 1.1: Ovládání 3D myši. Pˇrevzatoz [3]

Senzor 3D myši snímá míru posunu a otoˇceníovládacího klobouˇcku. Uživatel m ˚užeovládat jednotlivé osy zvlášt’ anebo využít více os zároveˇn. Tato možnost je vhodná pro práci s 2D grafikou a CAD výkresy. Kontrolér je také schopen pomocí driveru (software ovladaˇce)zamˇenitúdaje z rotaˇcních os za data z os pohybových a naopak. Díky tomu si uživatel m ˚uževybrat styl ovládání, který mu vyhovuje.

Obrázek 1.2: SpacePilot Pro. Pˇrevzatoz [3]

Pracoval jsem se zaˇrízenímSpacePilot Pro, ke kterému jsem mˇelpˇrístup v laboratoˇriHCI (Human-Computer Interaction) na FI MU. Toto zaˇrízení se skládá z opˇerypro ruku, plastového tˇela,sady tlaˇcíteka ovládacího klo-

2 1. ÚVOD bouˇcku.Ovládací klobouˇcekobsahuje speciální senzor. 3Dx driver umožˇnujemˇenitnastavení pro každou aplikaci zvlášt’ a sám tato nastavení vyvolá, pokud je daná aplikace spuštˇena.Driver si také pa- matuje navolené akce pro jednotlivá tlaˇcítka.Ve výchozím nastavení lze pomocí tlaˇcíteknapˇr.:mˇenitcitlivost zaˇrízenínebo zamykat jednotlivé osy. Na zaˇrízeníse také nacházejí klávesy Ctrl, Shift, Alt, Esc. Nebot’ je SpacePi- lot Pro urˇcenpˇredevšímpro 3D modelování a CAD aplikace, funkcí dalších tlaˇcítekje zmˇenapohledu v tˇechtoaplikacích. ZaˇrízeníSpacePilot Pro nebylo navrženo jako herní ovladaˇca proto je v tomto ohledu jeho nevýhodou rozložení tlaˇcíteka síla nutná pro jejich stisk- nutí. Je velice nároˇcnépohybovat s ovládacím klobouˇckema zároveˇnse po- koušet stisknout jednotlivá tlaˇcítka.Pˇrivyužití v modelovacích nebo CAD aplikacích se tento problém nevyskytuje, protože tlaˇcítkanemají funkce, které jsou potˇrebavyvolávat i bˇehempohybu/rotace s objektem. Uživa- tel jejich pomocí pˇrepínárežimy práce nebo zobrazení, popˇrípadˇevyvolá nadefinované makro. Herní ovladaˇcevˇetšinoupˇredpokládají,že uživatel bude využívat velký poˇcettlaˇcíteka joystick (napˇr.Xbox kontrolér) záro- veˇn.Tento nedostatek jsem musel brát v úvahu pˇrinavrhování systém ˚u ovládání hry, jelikož pohodlné ovládání je základem každé digitální hry[1].

3 2 Návrh hry a srovnání herních SDK

2.1 Herní koncept

Pˇrinávrhu herního konceptu jsem musel zvážit, kolik os zaˇrízeníSpacePi- lot Pro bude hráˇcvyužívat. Pˇrivyužití všech šesti má hráˇcvetší možnosti, ale ovládaní je nároˇcnˇejšínež v pˇrípadˇe,že jich hra využívá ménˇe.Aby hráˇczískal co nejvˇetšíkontrolu, rozhodl jsem se využít všechny osy – 3 pro posun, 3 pro rotaci. Hru tedy umístím do trojrozmˇernéhoprostoru. Vhodným prostˇredím,ve kterém lze využít, nebo je to dokonce nutné, ovládání posunu a rotaci, je stav beztíže. Jako typ hry jsem tedy zvolil vesmírný simulátor. Hráˇcije pˇridˇelenavesmírná lod’, se kterou se snaží probojovat pˇrespostupné obtížnˇejšívlny nepˇrátel.Obtížnost se postupnˇe zvyšuje poˇctemnepˇrátelskýchlodí. Pˇridˇelenálod’ si své zásahové body ne- m ˚užeregenerovat a tak hráˇcmusí volit vhodnou taktiku, aby dosáhl co nejvyšší úrovnˇe. Nepˇrátelskélodˇejsou vybavené projektilovými zbranˇemi.Hráˇcse tedy m ˚užestˇrelámvyhýbat. Nepˇrátelskáa hráˇcovamunice není nijak omezena. Hráˇc˚uvpohyb je v herní úrovni omezen. Pohyb po úrovni lze omezit nˇekterýmz následujících zp ˚usob˚u.M ˚užemeumístit do úrovnˇeneviditelné stˇeny, které ale nep ˚usobípˇrílišpˇrirozenˇe.Pˇridruhém zp ˚usobuje hráˇcupo- zornˇen,že se nachází mimo hratelný prostor, a je vyzván, aby se vrátil. Po- kud tak neuˇciní,je bud’to pˇremístˇenzpˇet,anebo je jeho avatar1 zabit/zni- ˇcen.Já jsem zvolil možnost, kdy je hráˇcnacházející se mimo vymezený pro- stor pˇritahovánzpˇetdo vyhrazené oblasti. V pˇredešlékapitole jsem popisoval nedostatky tykající se tlaˇcítekzaˇrí- zení SpacePilot Pro. Rozhodl jsem se je pro ovládaní hry nevyužít právˇe kv ˚ulivýše zmínˇenýmproblém ˚um.3D myš tedy hráˇcvyužije pouze pro po- hyb lodi. Míˇrenía stˇrelbaje ovládána pomoci klasické myši. Herní ovládaní lze tedy pˇrizp˚usobitpravák ˚umi levák ˚um,jelikož SpacePilot Pro je symet- rický (kromˇeoznaˇcenítlaˇcítek). Jelikož produkce her je dynamický proces a tato práce není tak velkého rozsahu jako komerˇcníprojekty, dále jsem koncept neupˇresˇnoval,abych mohl provádˇetdalší zmˇenybˇehemvývoje. Pro hru jsem zvolil pracovní ná- zev „Adrift“. Z angliˇctinypˇreloženo– pojem znamená „unášený“. Tento název jsem vybral, protože hráˇcovalod’ je pˇripohybu setrvaˇcnostítaké „unášena“.

1. Avatar – reprezentace uživatele ve virtuální realitˇe

4 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK

2.2 Herní SDK

Pˇriprodukci digitálních her se vývojáˇr/týmmusí rozhodnout, jaký herní engine použije. M ˚uževytvoˇritsv ˚ujvlastní, což je ale ˇcasovˇe,finanˇcnˇe,znalost- nˇe[4]a personálnˇenároˇcné.A nebo zvolí nˇekterýz dostupných, který na- bízí požadovanou funkcionalitu. Výbˇervhodného SDK pro produkci projektu m ˚užeznaˇcnˇezjednodušit práci a snížit ˇcasovénároky. Herní SDK obsahuje konkrétní herní engine a nástroje pro jeho použití/úpravu. Vˇetšinouse jedná o editor úrovní. Dal- šími nástroji mohou být:

• Editor materiál ˚u

• Editor prefabrikát ˚u

• Editor animací

• Editor ˇcásticovýchsystém ˚u

• Editor uživatelského rozhraní

Aktuálnˇeexistuje nˇekolikdruh ˚uSDK, lišících se pˇredevšímv licenci a je- jím ujednání týkající se vývojem komerˇcníchherních titul ˚u.Mohou být zdarma, s omezenou licencí nebo úplnou licencí. Poslední možnost bývá zpoplatnˇena.Nejˇcastˇejšímožností bývá neplacená licence pro osobní a vzdˇe- lávací využití. Tuto licenci lze dále rozšíˇritna licenci komerˇcní,která zava- zuje koncesionáˇrek odvodu ˇcástizisku z prodej ˚utitulu, který byl pomoci daného SDK vytvoˇren. „V dnešních modulárnˇestavˇenýchhrách, enginem hry je myšlena ko- lekce modulu simulaˇcníhokódu, který pˇrímoneurˇcujechování hry (herní logiku) nebo herní prostˇredí(data úrovní).“[5] Dobrá implementace her- ního jádra je základem pro aplikaci, která je schopna reagovat na hráˇcovy pˇríkazyv reálném ˇcase.Engine musí být také dostateˇcnˇeoptimalizován, aby byl schopen vykreslit dostateˇcnýpoˇcetsnímk ˚una obrazovku v jedné sekundˇea zajistil tak plynulý pohyb objektu a grafiky. Dále by jádro mˇelo zvládat situace, na které není primárnˇeurˇceno,které by mohly zp ˚usobit zastavení aplikace nebo neoˇcekávanéchování hry. Mezi tyto situace patˇrí provádˇenífyzikálních výpoˇct˚upˇrinízké snímkové frekvenci, pˇrikterých mohou být výpoˇctynepˇresné,nebo náhlé naˇcítanívelkého množství dat, napˇr.textur pro grafickou kartu nebo ˇcástiherní úrovnˇe. Každý engine používá urˇcitýskriptovací jazyk v nˇemžje naprogramo- vána herní logika. Tento jazyk m ˚užebýt shodný s jazykem, ve kterém je

5 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK engine napsán, ale v nˇekterýchpˇrípadechtomu tak není – napˇr.Unreal Engine 3 nebo Game Engine. Skriptovací jazyk umožˇnujevolat nˇe- které (zpˇrístupnˇené)funkce jádra, aby nebyla omezena funkcionalita herní logiky, kterou chce vývojáˇrimplementovat. Vˇetšinaherních engin ˚unabízí podobné technické možnosti. Trh s digi- tálními hrami je ale velice dynamický a tak musí spoleˇcnostizaˇcleˇnovatdo svých engin ˚unovou funkcionalitu, pˇredevšímzamˇeˇrenouna vykreslování. Hlavní ˇcastíherního jádra je 3D API, které vykresluje snímky na obrazovku. PC hry nejˇcastˇejivyužívají:

• Direct3D (verze 9, 10 a 11) pro platformu Windows, Xbox 360 a Pla- yStation 3,

• OpenGL pro Windows, Mac/iOS, Android nebo webové prohlížeˇce.

Mezi další funkcionality, které engine zajišt’uje, obvykle patˇríspráva pa- mˇeti,herní fyzika, pˇrehrávanízvuku, pˇrehrávaníanimací, komunikaci po síti (LAN a IP) aj.

2.3 VýbˇerSDK do srovnání

Pˇred zaˇcátkemtvorby hry jsem musel zhodnotit požadavky pro imple- mentaci tohoto projektu, a tak jsem pomocí základního návrhu hry vybral vhodná kritéria pro volbu vývojového prostˇredí.Hra bude vyvíjena pro PC, tudíž jsem tomuto pˇrizp˚usobilvýbˇersoftwaru. Do hry jsem vyžadoval pokroˇcilýfyzikální model, dobrou úroveˇnvizuálních efekt ˚ua snadné ovlá- dání vývojových nástroj ˚u.Hlavním požadavkem ale byla možnost rozšíˇrit engine o podporu ovládání 3D myši bud’to úpravou zdrojového kódu já- dra, anebo jinou vhodnou metodou. Srovnání jsem založil na výbˇeru SDK z ˇclánku[6]z webové stránky worl- dofleveldesign.com, ve kterém se autor vˇenujeshrnuti dostupných herních jader. Tento ˇclánekje spíše zamˇeˇrenna vytváˇreniukázkových úrovní, ale po porovnání výbˇeru se seznamem uživateli hodnocených engin ˚una webové stránce moddb.com[7] jsem se rozhodl na základˇevýbˇeru z tohoto ˇclánku založit i mé srovnání. Herní jádra popisovaná v ˇclánkujsou urˇcenapro platformu Windows, a tak jsou vhodnými kandidáty jako vývojové prostˇredímé hry. Nˇekterá nabízejí publikování her i na jiné platformy, ale tuto možnost jsem zatím nepotˇreboval/nevyžadoval.KromˇeSDK popsaných v ˇclánkuještˇeexistuje velká ˇradaherních jader založených na programovacím jazyku Java a nebo

6 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK nˇekterémz Java Framework ˚u.Hry vyvíjené v tˇechtoSDK ale vˇetšinoubý- vají dvourozmˇerné,a proto jsem výbˇerdále nerozšiˇroval. Nˇekterájsem ale ze srovnání vynechal. Jádra Ogre3D a Irrlicht jsou pouze vykreslovací systémy a nenabízí plnou herní funkcionalitu. Vývo- jáˇrse ale m ˚užerozhodnout je využít pro vykreslování ve svém vyvíjeném herním engine. Dále jsem se také nezabýval také Blenderem, který není pl- nohodnotným herním jádrem, a tudíž má pouze omezenou funkcionalitu pro tvorbu her a pro tuto práci by tak nebyl vyhovující. Dalšími z vyne- chaných SDK jsou Shiva3D, Leadwerk a C4 Engine. Druhý a tˇretíz jmeno- vaných jsou dostupné pouze po zakoupení, a tedy nejsou vhodné pro hru vytváˇrenouv této práci. C4 Engine sice nabízí ke stažení demo verzi, funk- cionalita demoverze je ale velice omezená a pro rozsah této práce by nebyla dostaˇcující.Volnˇešiˇritelná verze jádra Shiva3D umožˇnujepublikovat herní aplikace pouze pro webové prohlížeˇce.V této práci vytváˇrímherní aplikaci pro PC, proto jsem engine vynechal ze srovnání. V další sekci srovnávám tato herní jádra spolu s jejich pˇríslušnýmiSDK:

• Esenthel Engine

• Neoaxis Engine

• Torque3D

• Unity3D

• Source Engine

• CryEngine 3

• Unreal Engine 3

• Panda 3D

2.4 Porovnání

Všechny srovnávané vývojové balíˇcky jsou dostupné ve volnˇestažitelné verzi. Zamˇeˇrujise pˇredevšímna vykreslovací pipeline, programovací/skrip- tovací jazyk, podporované platformy, na které lze hry publikovat, a typy licencí nabízených s SDK. Dále popisuji nˇekteréodlišnosti od ostatních her- ních jader a pˇrípadnénevýhody a nedostatky.

7 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK

2.4.1 Esenthel Engine

Herní SDK je nabízen jako bezplatná demoverze nebo jako plná verze, která obsahuje licenci pro vydávání komerˇcníchherních titul ˚uzaložených na tomto engine. Zdrojový kód engine není pˇrístupný ani po zakoupení plné verze SDK. Jádro je napsáno v jazyce C++ a nepoužívá zvláštní skriptovací jazyk. Velkou výhodou, oproti ostatním engin ˚um,je využití dynamického strea- mování herní úrovnˇe.Díky tomu lze vytváˇretlevely velkých rozmˇer˚upˇri zachování rozumných nárok ˚una využitou operaˇcnípamˇet’. Tato techno- logie je vhodná pˇredevšímpro MMO hry, které se obvykle odehrávají v rozlehlých herních svˇetech. Pro rendering vývojáˇrzvolí jedno z DirectX API od verze 9 až 11, nebo OpenGL pokud chce vyvíjet hru pro jiné platformy než Windows. Podpo- rována je velká škála efekt ˚uzpˇrístupnˇenápˇredevšímimplementaci DirectX 10 a 11. SDK také nabízí vlastní GUI (General User Interface) systém, který lze rozšíˇrito vlastní tˇrídy. Esenthel Engine[9] podporuje pˇripojeník SQL databázím (Microsoft SQL, MySQL, SQLite). Jádro je uzp ˚usobenépro MMO hry a sít’ový kód obsahuje potˇrebnéfunkce jako jsou pˇrípojení/odpojení na server, vytváˇreníuživa- telských úˇct˚ua pˇrenosinformací o pozicích a právˇepˇrehrávanýchanimací postav hráˇc˚u.

2.4.2 NeoAxis Engine

Pro programování NeoAxis engine[10] lze využít libovolný programovací jazyk podporující .NET framework. D ˚uležitémoduly jádra jsou napsány v C/C++. SDK obsahuje editory pro úrovnˇe,GUI, ˇcásticovéefekty, fyzikální objekty a materiály (shadery). Velkou výhodou je framework pˇripravený pro pˇridávánípodpory nových vstupních zaˇrízení.Hry lze publikovat na PC, Mac i do webových prohlížeˇc˚u,kde lze pak aplikace spouštˇetpomocí vlastního webového pˇrehrávaˇce. Jádro pro rendering používá DirectX 9 nebo OpenGL. V pˇrípadˇeDi- rectX je použito 64-bit HDR vykreslování a je umožnˇenopoužívat procedu- rálnˇegenerované shadery. Také je zajištˇenapodpora r ˚uznýchtyp ˚uanimací a jejich úprav. Vývojáˇrm ˚užepoužívat NeoAxis bezplatnˇe,za pˇredpokladu že nebude vyvíjené hry prodávat, anebo si m ˚užezakoupit nˇekterou z li- cencí, které se od sebe liší množstvím upravitelných modul ˚uherního jádra. Zdarma jsou také nabízeny funkˇcníherní celky, které mohou usnadnit vý- vojáˇr˚umtvorbu her.

8 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK

2.4.3 Torque3D

Dnes je málo komplexních herních SDK s širokou škálou funkcí, které jsou navíc open source. Jedním z nich je Torque 3D[11]. Jeho jádro je napsáno v C++, jehož funkce jsou zpˇrístupnˇenéve vlastním skriptovacím objekto- vém jazyku TorqueScript. SDK obsahuje standardní typy editor ˚uspolu se speciálním editorem pro vytváˇreníˇreka cest. Hlavní výhodou Torque 3D je rychlé naˇcítáníupravovaných textur do viewportu editoru. Grafici tak mohou prohlížet provádˇenézmˇenypˇrímove hˇrev realném ˇcase.Pro výpoˇcetfyziky jsou zde použity knihovny NVidia PhysX, ty ale lze nahradit jinými, pokud by to bylo nutné. Pro rendering je použit DirectX 9 na PC a OpenGL pro Mac PC. Engine umí využít plný potenciál DirectX 9 a nabízí tak r ˚uznépost-process efekty od DOF (depth of field) až po SSAO (Screen Space Ambient Occlusion). Torque je také schopen publikovat hry pro webové prohlížeˇce.Hlavní nevýhodou je ale nemožnost streamování obsahu za bˇehuhry. Jádro také podporuje, jako ostatní SDK, propojení po síti.

2.4.4 Unity3D

Unity3D[12] je nabízen ve dvou balíˇccích, a Unity Pro. První je do- stupný ke stažení zdarma s omezenou funkcionalitou, ale nechybˇejížádné z hlavních funkcí, které by pˇritvorbˇevyžadoval student nebo nezávislý vý- vojáˇr.Druhý zmínˇenýbalíˇcekobsahuje plnou verzi enginu. Oproti Unity verzi je engine doplnˇeno podporu vyhledávání cest umˇelouinteligencí, LOD ( of detail), audio filtrování, systémem pro pokroˇciléanimace aj. Renderovací pipeline je rozšíˇrenao vykreslování dynamických stín ˚u,HDR rendering, simulaci GI, pokroˇciléstínování, post-process efekty aj. Jedinou funkci, kterou bych oznaˇcilza zásadní je LOD a jejiž absence v nekomerˇcní verzi Unity m ˚užezkomplikovat vývoj hry. S verzí Unity Pro je svázána ko- merˇcnílicence umožˇnujícívývojáˇripublikovat své hry na trh. Mezi podporované grafické API patˇríOpenGL a Direct3D (verze 9 a 11). Pˇripoužití DirectX 11 lze využít model 5.0. Unity používá vlastní ˇcásticovýsystém. Pro skriptování herní logiky lze využít nˇekolikjazyk ˚u. Jedná se o JavaScript, C# nebo Boo. „Všechny tˇrijazyky se s nízkými kom- pilaˇcnímiˇcasysnadno používají a spouštˇejína open source .NET platformˇe Mono.“[13] Pro Unity lze také vyvíjet uživatelské rozhraní pomocí Scale- form SDK[14]. Unity nabízí výbornou online dokumentaci a také velice užiteˇcnézaˇcáteˇcnickévideo kurzy, které vysvˇetlízáklady práce s SDK a usnadní tak zaˇcínajícímvývojáˇr˚umpráci.

9 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK

S Unity lze vyvíjet hry na velké množství platforem: PC, XBOX 360, Pla- yStation 3, , iOS, Android, Wii U a webové prohlížeˇce.Pro hry zpouš- tˇenév internetovém prohlížeˇci(vyjma Google Chrome) je nutné si nainsta- lovat aplikaci pˇrehrávaˇce.

2.4.5 Source Engine

Source SDK[15] lze získat pˇrinákupu nˇekteréz her vydaných spoleˇcností Valve. Mezi tyto hry patˇríHalf-Life 2, Counter-Strike: Source, Left 4 Dead (1 a 2) nebo Team Fortress 2. Poslední zmínˇenýtitul lze stáhnout zdarma a tím získat i tento vývojový balíˇcek.SDK je urˇcenpˇredevšímpro vytváˇrení modifikací pro tyto hry. Plnou licenci a kód Source Engine lze získat po smlouvˇese spoleˇcnostíValve. Od roku 2008 je pro školy nabízena speciální výuková licence. Source je primárnˇeurˇcenpro PC, lze však publikovat i hry pro Xbox 360. Engine používá Direct3D verze 9 pro vykreslování na Windows plat- formˇea OpenGL pro Mac systémy. Fyzika je vypoˇcítávánapomocí systému , který se proslavil pˇredevšímpˇriuvedení hry Half-Life 2, ve které hráˇcpoužíval zbraˇn„Gravity Gun“, s jejíž pomocí mohl manipulovat s ob- jekty v herním prostˇredí.Engine pouze simuluje HDR vykreslování, a tak je možné použít tuto techniku na DirectX 9 platformách narozdíl od ostat- ních herních jader. Valve na svých stránkách uvádí, že bˇežnýuživatel mezi tímto a klasickým HDR rozdíl nepozná. Engine je implementován v C++. Stejný je i skriptovací jazyk. Koncesi- onáˇriplné licence získají pˇrístupke zdrojovému kódu nejenom enginu, ale také nˇekterýmhrám, které Valve vyvinulo pomocí Source.

2.4.6 CryEngine 3

CE 3[16] (Cry Engine) po svých pˇredch˚udcíchCE 1 a 2 navazuje na tradici vysoké vizuální kvality. Nabízí velké množství nejmodernˇejšíchvykreslo- vacích technik, které bylo možné vidˇetve hrách Crysis 2 a Crysis 3. Render pipeline CE3 používá HDR vykreslování spolu s deferred lightning a další technologie simulující GI (Global Illumination). Vykreslování normálových map je možné rozšíˇrito použití tesalace a grafici tak mohou vytvoˇritvelice detailní modely s nízkým poˇctempolygonu na objekt. Tesalaci je vhodné použít pro terén na horizontu, kde je nízký poˇcetvykreslených trojúhel- ník ˚unejvíce zˇretelný. Engine také vypoˇcítávápokroˇcilouherní fyziku, která zvládá simulo- vat destrukci prostˇredí,procedurální deformace anebo prvky poˇcasí,jež lze

10 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK aplikovat na modely vegetace a simulovat tak pohyb pˇrivˇetru ˇcibouˇri. Vývojáˇrpˇristažení CE3 SDK využije C++ jako skriptovací jazyk. Ba- líˇceknekomerˇcnílicence neobsahuje kód enginu, ale vývojáˇrm ˚užerozši- ˇrovatzpˇrístupnˇenýkód, který je dostaˇcujícípro vytváˇreníher, jež nevyža- dující velkou modifikaci herního jádra. Podrobná dokumentace C++ kódu je zpˇrístupnˇenaonline. Engine také nabízí integraci Scaleform API, díky které m ˚užezobrazovat Flash animace pˇrímove hˇre,pˇredevšímse jedná o grafiku a funkcionalitu uživatelského rozhraní. Komunita CE3 není tak poˇcetnájako napˇríkladu UDK, ale engine v poslední dobˇezískává na po- pularitˇe. Pomocí tohoto SDK lze vytváˇrethry pro PC a konzole XBOX 360 a Pla- yStation 3. Engine nabízí možnost pˇripojitk PC stanici jednu nebo obˇeze zmínˇenýchkonzolí. Z PC je pak engine schopen upravovat, publikovat a spustit výslednou hru pˇrímona cílové platformˇe.Tímto lze významnˇezkrá- tit ˇcasvývoje.

2.4.7 Unreal Engine 3 Unreal Engine 3 (UE 3) je distribuován v herním balíˇckuUDK[17] (Unreal Development Kit). Jádro podporuje rendering pomoci Direct3D 9 a Direct3D 11 a používá streamování textur ve velké míˇre.Vykreslování je provádˇeno v 64-bit HDR kvalitˇea na scénu lze aplikovat velké množství post-process efekt ˚u(motion blur2, DOF3, color grading4). Tyto efekty lze specifikovat pro každou herní úroveˇnzvlášt’ anebo je dynamicky bˇehemhry mˇenit.UE 3 dále integruje podporu SpeedTree, a tak lze v nˇemrychle konstruovat velké scény s vegetací. V pˇríslušnýcheditorech je také možné vytváˇretˇcás- ticové efekty a lens flare efekty. SDK je nabízeno ve dvou licencích. První mohou využít vývojáˇri(napˇr. studenti) zdarma. Druhá je komerˇcnílicence, která zahrnuje malý finanˇcní poplatek a odvod ˇcástitržeb herních titul ˚uvydaných pod touto licencí. Pˇri této variantˇeje ale zpˇrístupnˇenveškerý zdrojový kód herního jádra. Lze tak pˇrizp˚usobitengine pro libovolný typ her. V bezplatné verzi SDK, je pro skriptování použit jazyk UnrealScript, který je podobný jazyku Java svou syntaxí. UnrealScript je objektový jazyk s podporou programování stav ˚u.Za bˇehuhry se objekty mohou nacházet v r ˚uzných stavech, jež mˇenípˇretíženímetody, které se provede. Napˇríklad jedna instance umˇeléinteligence m ˚užemít nˇekolikstavu. V jednom z nich

2. motion blur – efekt rozmazání pohybujících se objekt ˚u 3. depth of field – efekt simulující hloubku ostrosti 4. color grading – úprava barev renderovaných snímk ˚u

11 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK pouze ˇcekána místˇea v druhém se pohybuje náhodnˇepo okolí. Funkce, která získává data o tom, zda je objekt pohybu, v jednom pˇrípadˇevrátí návratovou hodnotu „false“, v druhém „true“. Tyto stavy lze také použít pro zaznamenávání informací o právˇepˇrehrávanéanimaci objektu. V editoru úrovní lze pro skriptování herních sekvenci využít vizuální skriptovaní pomocí systému Kismet. Takto se vˇetšinouzajišt’uje funkciona- lita prvk ˚uherního prostˇredí,které nejsou potˇrebaimplementovat v Unre- alScriptu nebo jsou specifické pouze pro jednu úroveˇn.Mezi pˇríkladypatˇrí spouštˇenívýtah ˚u,otevíraní dveˇrínebo používaní sekundárních objekt ˚u, které nemají dopad na hru. K UDK je pˇripojenaomezená verze hry Unreal Tournament 3. V této verzi chybí vˇetšinaúrovní a prefabrikát ˚uz plné hry, jako jsou modely po- stav, vozidel, objekt ˚uprostˇredíaj. Malé modifikace kódu této hry jsou vhod- ným cviˇcenímpro zaˇcínajícívývojáˇre.Velkou výhodou je v této hˇreobsa- žený kód umˇeléinteligence, který je schopen navigace po mapˇea pokroˇcilé predikce pohybu nepˇrátelpˇrivýpoˇctustˇrelby. Hlavní pˇrednostíUDK je velká komunitní podpora, kterou engine zís- kal díky své uživatelské pˇrístupnostia velké vizuální kvalitˇe.Online doku- mentace je velice rozsáhlá a jednotlivé stránky ˇcastoodkazují na praktické využití nˇekteréz technik ve formˇenávodu. Uživatelskou pˇrízeˇnsi také zís- kal díky ˇradˇekvalitních komerˇcníchtitul ˚u,které byly založeny na Unreal Engine 3. Jmenovitˇe:hry Dead Space, trilogie Mass Effect a na konzoli Xbox 360 série Gears of War. ZmínˇenéSDK má kromˇevývoje her také alternativní využití. Jeho funk- cionalita je pˇrizp˚usobenátvorbˇeanimovaných film ˚u,které dokážou naplno využít veškeré pokroˇcilévykreslovací techniky enginu. Zobrazovaný pr ˚u- bˇehanimace lze zaznamenávat do video souboru a to i v momentech, kdy je zobrazovaná snímková frekvence (FPS – frames per second) nižší než FPS videa. Engine umožˇnujeskriptovat chování a pohyb kamer ve scénˇetak, aby mˇelgrafik nad výsledným zábˇerem kontrolu.

2.4.8 iD Tech 4

V listopadu roku 2011[18] byl tento engine zpˇrístupnˇenveˇrejnostipod GNU GPL licencí. Cástiˇ kódu byly upraveny tak, aby neporušily patentové zá- kony. Id Tech 4 není moderní herní jádro jako nˇekteréz jiných jader popi- sovaných v této kapitole. Engine využívá OpenGL pro zobrazovaní grafiky. V dobˇevydání her používající toto jádro, využívala vykreslovací pipeline „per-pixel lighting“, který ji odlišoval od ostatních soudobých 3D herních engin ˚u,jež používaly

12 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK

„vertex lighting“. Hry vyvíjené na iD Tech 4 tak vypadaly lépe než jejich konkurenti. Toto nové paradigma výpoˇctuosvˇetlení, nicménˇetaké zvýšilo nároky na výpoˇcetnívýkon grafických karet. Dnes je standardem pro vy- kreslování herních aplikací. Jádro využívá technologii MegaTexture, pomocí které lze vykreslovat velice detailní textury na terén s minimálními nároky na RAM pamˇet’. Na disku poˇcítaˇceje uložen soubor s texturou terénu pro celou herní úroveˇn. Tato mapa je velkých rozmˇer˚u(32,768×32,768 pixel ˚ua více). Tato mapa ob- sahuje segmenty textury. Potˇrebnésegmenty, které mají být zobrazeny, jsou pak naˇcítányz disku za bˇehuhry. Nevýhodou této metody je velká nároˇc- nost na CPU a viditelné zmˇenyna povrchu terénu pˇrizmˇenˇedynamické úrovnˇedetail ˚u(LOD). Id Tech 4 je implementován v C++ a pomocí stejného jazyka lze vytvá- ˇretherní modifikace pro tento engine. Pro skriptování je nutné použít pˇri- pravený objektový skriptovací jazyk. Na rozdíl od ostatních srovnávaných SDK je pro tvorbu uživatelského rozhraní zvláštní programovací jazyk, po- mocí kterého lze vytváˇretdiegetické5 panely umístitelné do herního pro- stˇredí.Tyto panely se objevily ve hˇreDoom 3.

2.4.9 Panda 3D Toto herní jádro je od roku 2008 dostupné pod BSD licencí. Engine využívá nˇekteréknihovny (napˇr.DirectX), jež nepatˇrímezi volnˇešiˇritelnýsoftware. Vývojáˇrsi ale u vˇetšinyz nich m ˚užepˇriinstalaci vybrat, že je nebude insta- lovat. Panda 3D nepatˇrímezi moderní herní jádra, ale pˇrestoobsahuje kompo- nenty zajišt’ující funkcionalitu, kterou vývojáˇrm ˚užepˇrivývoji potˇrebovat. Pro vykreslování lze použít OpenGL nebo DirectX. Engine používá vlastní knihovnu pro AI, která nabízí funkce „Seek, Flee, Pursue, Evade, Wander, Flock, Obstacle Avoidance, Path Following“[19] aj. Výhodou je také vlastní editor uživatelského rozhraní.

2.5 Závˇerporovnání

Vˇetšinaherních SDK si je velice podobna svými možnostmi a funkcemi. Velkou výhodou pro nezávislé vývojáˇrea studenty je pˇrístupke zdrojo- vému kódu enginu. Pro grafiky, kteˇrípouze hledají platformu pro tvorbu

5. Diegetické uživatelské rozhraní – rozhraní, které využívá hráˇcpˇrihˇre.Zároveˇnjej mo- hou vidˇeti herní postavy. Vhodným pˇríkladem je holografický inventáˇra indikátor zdraví z herní série Dead Space

13 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK animací nebo obrázku, jsou nejvhodnˇejšíCryENGINE 3 nebo UDK, jelikož z výše popisovaných SDK nabízejí nejvyšší vizuální kvalitu, a to i pˇrista- žení nekomerˇcníverze. Jelikož jsem tento projekt vypracovával sám, nemohl jsem implemen- tovat hru od základ ˚ua proto jsem hledal ˇrešení,které mi umožní vhodnˇe rozšíˇrita upravit funkcionalitu hry dodané s herním SDK. Vybraný systém také musel nabízet možnost rozšíˇrenípodporovaných vstupních zaˇrízenía musel být dostupný bez poplatk ˚u.Snadná práce s SDK byla jedním z dal- ších požadavk ˚u. Po zvážení všech alternativ jsem pro tuto práci vybral UDK jako hlavní vývojové prostˇredí.UDK v nekomerˇcníverzi obsahuje zdrojový Unreal- Script kód hry Unreal Tournament 3, který lze vhodnˇeupravit a rozšíˇrit na vesmírný simulátor. Jediné omezení je velikost úrovní, resp. ztráta pˇres- nosti bˇehemfyzikálních výpoˇct˚upokud se výpoˇctyprovádí pˇríliš daleko od stˇreduherní úrovnˇe.Toto omezení ale nijak neubírá na kvalitˇehry, je- likož m ˚ujherní koncept používá úrovnˇes omezeným rozsahem. Podpora 3D myši v tomto engine není implicitnˇezajištˇena,ale lze ji doplnit pomocí funkce DLLBind, která umožˇnujenaˇcítatmetody dynamických Windows knihoven ve hˇre.Implementaci této knihovny se zabývám v kapitole 3. Musím zde uvést, že stejnˇevhodným herním jádrem pro vývoj by také mohl být NeoAxis Engine. Svými funkcemi splˇnujemé požadavky na vý- vojové prostˇredía jeho rozhraní pro pˇridávánínových vstupních zaˇrízení umožˇnujeintegrovat podporu 3D myši do hry velice jednoduše. S UDK ale lze potenciálnˇedosáhnout lepších vizuálních výsledk ˚u,v pˇrípadˇeže na této hˇrebudu pracovat dále. Kvalitní herní grafika nejspíše posluchaˇce/diváka pˇriprezentaci zaujme nejvíce. Bˇehemzpracování tohoto srovnání a výbˇeru vývojového prostˇredípro tuto práci, chybˇelaCryENGINE 3 SDK možnost vypnout terén. Jelikož je prostˇredímherních úrovní vesmír, nebyl by CryENGINE vhodným pro vý- voj. Tato možnost byla pozdˇejido tohoto SDK pˇridána. Na konec této kapitoly uvádím tabulku, ve které jsou uvedeny druhy dostupných licencí a použitelné renderovací systémy od všech srovnáva- ných SDK.

14 2. NÁVRHHRYASROVNÁNÍHERNÍCH SDK

Tabulka 2.1: Licence a Render API herních jader Název engine Licence Render API Esenthel Engine Nekomerˇcní,Komerˇcní Direct3D 9/10/11, OpenGl Neoaxis Engine Nekomerˇcní,Komerˇcní Direct3D 9, OpenGL Torque3D Open Source Direct3D 9, OpenGL Unity3D Nekomerˇcní,Komerˇcní Direct3D 9/11, OpenGL Source Engine Nekomerˇcní,Komerˇcní Direct3D 9 CryEngine 3 Nekomerˇcní,Komerˇcní Direct3D 9/10/11 Unreal Engine 3 Nekomerˇcní,Komerˇcní Direct3D 9/11 iD Tech 4 GNU GPL OpenGL Panda 3D Open Source Direct3D 9, OpenGL

15 3 Implementace

3.1 Použitý software

3.1.1 UDK

V tomto herním SDK jsem využil nˇekoliknástroj ˚uspolu s dodaným zdrojo- vým kódem herní logiky. Kompozici herních úrovní jsem provedl v editoru úrovní. Editor obsahuje velkou ˇcástnástroj ˚utohoto SDK, které jsem pˇrivý- voji použil. Jednalo se o:

• Editor materiál ˚u

• Import textur, 3D model ˚ua dalších prvk ˚u

• Editor fyzikálních prvk ˚u

Post-process efekty jsou nastaveny pro každou úroveˇnzvlášt’. Lze tak za- jistit jiné barevné schéma anebo ladit osvˇetlenív závislosti na denní dobˇe, ve které je úroveˇnhrána. Pro hru Adrift jsem využil Bloom efekt a mírný efekt Motion Blur. UnrealScript kód jsem vyvíjel s pomocí pluginu nFringe pro MS Visual Studio. Pro zajištˇenípodpory 3D myši jako vstupního zaˇrízeníjsem využil UnrealScript funkce DLLBind.

3.1.2 Další software

Pˇripráci jsem kromˇeUDK používal další software. Ten byl potˇrebnýk vy- tvoˇrení3D model ˚ua textur pro prefabrikáty, herní a grafické prvky. Soft- ware musel podporovat export do souborového formátu, který byl možný importovat do UDK. 3D modely jsem vytváˇrelv aplikaci 3ds Max 2010, kterou jsem doplnil o plugin ActorX[20]. Tento plugin exportuje 3D modely spolu s jejich kostrou a animacemi do formátu (.psk a .psa), které je schopno UDK importovat. Pro hru jsem v programu Photoshop vytvoˇrilgrafické prvky uživatelského rozhraní a textury herních objekt ˚u.UDK podporuje velké množství for- mátu rastrových obrázk ˚u.Pro vytvoˇreníFlash soubor ˚ujsem využil Adobe Flash CS5. Hra používá pouze jeden Flash prvek a tím je zamˇeˇrovacíkˇríž. V další kapitole je zamˇeˇrovaˇcpopsán podrobnˇeji. S pomocí programu Photoshop a Adobe After Effects jsem také vytvoˇril video-smyˇckunahrávací obrazovky. Toto video je pˇrehrávánopˇrinaˇcítání

16 3. IMPLEMENTACE

úrovní a pˇripˇrechodudo hlavního menu. V tomto videu je použit font Be- bas Neue[21] který je dostupný pod SIL licencí a mohl jsem jej tak použít. Implementaci (UnrealScript, C++) jsem provádˇelv Microsoft Visual Stu- dio. Pro psaní UnrealScript kódu jsem využil plugin nFringe. Tento plugin pˇridávápodporu rozpoznávání jazyka UnrealScript a vytváˇreníprojektu ve Visual Studiu. Další d ˚uležitoufunkcí je navigace kódu, jelikož imple- mentované tˇrídyUDK využívají ve velké míˇredˇediˇcnost.Pro implemen- taci dynamické knihovny zajištující podporu ovládání 3D myši jsem využil knihovny DirectX Software Development Kit, která obsahuje API DirectIn- put.

17 3. IMPLEMENTACE

3.2 Implementace DI3dCnnxn.dll

Tato dynamická knihovna zajišt’uje podporu 3D myši pro Unreal Engine 3. Pˇrijejí tvorbˇejsem mohl použít nˇekolikr ˚uznýchAPI, ne všechny ale byly vyhovující. Spoleˇcnost3Dconnexion nabízí ke stažení 3Dx SDK, což je balíˇcekurˇcenýpro vývoj aplikací využívající 3Dx driver. Tento driver ale snímá stav kontroléru pomocí pˇríjímáníudálostí generovaných zaˇrízením. Já jsem ale potˇrebovalAPI, které používá jako svoje komunikaˇcníschéma Polling, protože Unreal Engine nezpracovává vstup zaˇrízenípomocí systé- mových událostí. Dvˇemožnosti byly vhodným ˇrešením. Prvním bylo VRPN[22], které používá architekturu klient-server a umož- ˇnujepo sítí snímat zaˇrízenína jiných stanicích. Druhým byla DirectInput knihovna z DirectX API, která umí snímat stav zaˇrízenípˇrijímánímgene- rovaných událostí anebo umí provádˇetpolling , což je mnou vyžadované schéma komunikace. VRPN by pˇriimplementaci vyžadovalo spouštˇeníkli- entského a serverového kódu, což se jevilo komplikované (s pˇrihlédnutím na omezení funkce DllBind), a proto jsem zvolil DirectInput pro implemen- taci.

3.2.1 Vstupní bod dynamické knihovny

Pˇribˇežnémužití jsou inicializaˇcnífunkce volány zde. UnrealScript ale po pˇripojenídynamické knihovny nevolá DllMain. Proto je inicializace a uvol- nˇeníprostˇredk˚uzajištˇenovystavením vhodných funkcí dll knihovny a je- jich implementací v UnrealScript kódu.

1 #include "stdafx.h" 2 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) 3 { switch (ul_reason_for_call) 4 { 5 case DLL_PROCESS_ATTACH: 6 case DLL_THREAD_ATTACH: 7 case DLL_THREAD_DETACH: 8 case DLL_PROCESS_DETACH: 9 break; 10 } 11 return TRUE; 12 }

Zdrojový kód 3.1: dllmain.cpp

V hlaviˇccezdrojového kódu dynamické knihovny jsou potˇrebnédefi- nice pro její propojení s UnrealScript pomocí funkce DLLBind.

18 3. IMPLEMENTACE

1 ... 2 LPDIRECTINPUT8 g_pDI = NULL; 3 DIDeviceInfo *g_pDevices[MAX_DEVICES]; 4 int g_nDevices = 0; 5 int selectedDevice = 0; 6 int float tDeadzone = 0.2f; 7 float rDeadzone = 0.2f; 8 9 #define R_OK 0 10 #define R_FAILED (-1) 11 #define R_POLLFAILED (-2) 12 13 typedef struct SPACEPILOTSTATE { 14 FLOAT TX; /* x-axis position */ 15 FLOAT TY; /* y-axis position */ 16 FLOAT TZ; /* z-axis position */ 17 FLOAT RX; /* x-axis rotation */ 18 FLOAT RY; /* y-axis rotation */ 19 FLOAT RZ; /* z-axis rotation */ 20 UINT rglSlider[2]; /* unnecessary */ 21 UINT rgdwPOV[4]; /* unnecessary */ 22 BYTE rgbButtons[32]; /* 32 buttons */ 23 } SPACEPILOTSTATE; 24 ...

Zdrojový kód 3.2: DI3dCnnxn.h

Init3dCnnxn provádí inicializaci dostupných zaˇrízení.Funkce InitDI8() nastavuje komunikaˇcnírežim a formát pˇredávanýchdat. Dále také filtruje zaˇrízení,které nechceme použít. Momentálnˇepˇridádo seznamu aktivních ovladaˇc˚upouze zaˇrízeníspoleˇcnosti3Dconnexion. V hlaviˇcceknihovny je nastavena arbitrární hodnota maximálního poˇctu(aktuálnˇe8) používaných zaˇrízení.Uživatel ale pracuje pouze s jedním. Pomocí funkce SelectDevice m ˚uževybrat jiný detekovaný kontrolér.

1 CNNXN_EXPORT int Init3dCnnxn() 2 { 3 HRESULT hr; 4 DIDeviceInfo dinfo; 5 6 hr = InitDI8(); 7 if(g_nDevices > 0) { 8 dinfo = *g_pDevices[selectedDevice]; 9 hr = dinfo.pUsbHidDevice->Acquire(); 10 } 11 if(hr == S_OK){ 12 return R_OK; 13 } 14 return R_FAILED; 15 }

Zdrojový kód 3.3: Init3dCnnxn

19 3. IMPLEMENTACE

3.2.2 Získávání dat ze zaˇrízení

Po úspˇešnémnastavení komunikaˇcníhorežimu se zaˇrízením,lze z nˇejza- ˇcítˇcístdata. Pˇredkaždým ˇctenímale musíme zaˇrízeníaktualizovat meto- dou Poll, tím se systému zpˇrístupníaktuální snímané hodnoty na osách 3D myši. Pokud se Poll nezdaˇrí,vrátíme do UnrealScript hodnotu R_POLLFAILED, kde se rozhodne, zda použije nulová data, nebo data z posledního úspˇeš- ného ˇctení.PˇriúspˇešnémPoll získáme stav zaˇrízení(GetDeviceState) a ulo- žíme jej do struktury DIJOYSTATE, kterou pak dále pˇredámepro zpraco- vání dat metodˇeAbsFromHIDToUDKData, jež zároveˇns úpravou dat ak- tualizuje data v UnrealScript kódu.

1 CNNXN_EXPORT int GetData(SPACEPILOTSTATE* SPState) 2 { 3 HRESULT hr; 4 DIJOYSTATE js; 5 DIDeviceInfo dinfo; 6 if(g_nDevices > 0) 7 { 8 dinfo = *g_pDevices[selectedDevice]; 9 if( NULL == &dinfo) 10 { 11 return R_FAILED; 12 } 13 hr = dinfo.pUsbHidDevice->Poll(); 14 if( FAILED(hr) ) 15 { 16 dinfo.pUsbHidDevice->Acquire(); 17 return R_POLLFAILED; 18 } 19 if( FAILED( hr = dinfo.pUsbHidDevice->GetDeviceState( sizeof( DIJOYSTATE), &js ) ) ) { 20 return R_FAILED; 21 } 22 AbsFromHIDToUDKData(js,*SPState,32767,0,65535,tDeadzone,rDeadzone); 23 } 24 return R_OK; 25 } Zdrojový kód 3.4: GetData

Jelikož UDK používá levotoˇcivýsouˇradnýsystém a SpacePilot Pro pra- votoˇcivý,musel jsem získávaná data upravit. Data jsou navíc zaznamená- vána v rozmezí 0 až 65535, pˇriˇcemž„nulovou“ hodnotou os je 32767. Pro- cessAxisData provádí pouze pˇrevoddat do rozmezí -32767 až 32767. V této metodˇese také nachází implementace radiální deadzone (mrtvé zóny). Deadzone je nastavený rozsah pohybu joysticku, ve kterém jsou data zahazována at’ už softwarovˇenebo hardwarovˇe.Deadzone je vhodný pro 3D myš implementovat, protože je snadné pˇriposunu ovládacího klobouˇcku vychýlit i jinou osu než jsme p ˚uvodnˇezamýšleli. Jemné a pˇresnéovládání

20 3. IMPLEMENTACE je velice nároˇcnépro uživatele. Mrtvá zóna mu m ˚uževelice zpˇríjemnitpo- užívání zaˇrízení.

Obrázek 3.1: Radiální deadzone. Pˇrevzatoz [23]

Tento obrázek platí pro zaˇrízenís dvˇemaosami. Jako názorný pˇríklad ale postaˇcí. Do urˇcitévzdálenosti od stˇredu(klidové pozice) zaˇrízenínereaguje, až po pˇresaženímrtvé zóny zaˇcínáaktualizovat data. Od hranice deadzone až po maximální výchylku jsou data korektnˇeškálována tak, aby uživatel nezaznamenal skoky v citlivosti. Zpracování vstupu jsem rozdˇelilzvlášt’ pro translace a rotace. Pro každou lze nastavit vlastní hodnotu deadzone (od 0 do 1). V ukázce kódu není uvedeno zpracování rotace ovládacího klobouˇcku,protože je až na pojmenování promˇennýchstejné.

21 3. IMPLEMENTACE

1 void AbsFromHIDToUDKData(DIJOYSTATE js, SPACEPILOTSTATE &_sps, LONG midValue, LONG minValue, LONG maxValue, float translationDeadzone, float rotationDeadzone) 2 { 3 float T,R; 4 float TX,TY,TZ,RX,RY,RZ; 5 float range; 6 range = (float)(maxValue - minValue + 1)/2; 7 //TRANSLATION 8 TX = -ProcessAxisData(js.lY, midValue, minValue, maxValue); 9 TY = ProcessAxisData(js.lX, midValue, minValue, maxValue); 10 TZ = -ProcessAxisData(js.lZ, midValue, minValue, maxValue); 11 T = sqrt( pow(TX/range,2) + pow(TY/range,2) + pow(TZ/range,2)) / sqrt (3.0f); 12 if(T < translationDeadzone){ T = 0.0f; } 13 if(T>0) 14 { 15 T = Lerp((float)((T)-translationDeadzone/(1-translationDeadzone)) ,0.0f,1.0f); 16 } 17 _sps.TX = T * TX; 18 _sps.TY = T * TY; 19 _sps.TZ = T * TZ; 20 //ROTATION 21 RX = ProcessAxisData(js.lRy, midValue, minValue, maxValue); 22 RY = -ProcessAxisData(js.lRx, midValue, minValue, maxValue); 23 RZ = ProcessAxisData(js.lRz, midValue, minValue, maxValue); 24 ... 25 }

Zdrojový kód 3.5: AbsFromHIDToUDKData

Poslední d ˚uležitoumetodou je Exit3dCnnxn, která ukonˇcujevšechna spojení se zaˇrízenímia uvolˇnujepointery, které se využívaly za bˇehu.

1 CNNXN_EXPORT int Exit3dCnnxn() 2 { 3 FreeDI8(); 4 for(int i=0;i < g_nDevices;i++) 5 { 6 FreeDI8Device(g_pDevices[i]); 7 } 8 if(g_pDevices) 9 { 10 delete[] &g_pDevices; 11 } 12 return R_OK; 13 }

Zdrojový kód 3.6: Exit3dCnnxn()

22 3. IMPLEMENTACE

3.3 UnrealScript

UnrealScript je objektovˇeorientovaný jazyk urˇcenýpro skriptování herní logiky UDK. Syntaxí je velice podobný jazyk ˚umJava nebo C#. Jeho výkon- nost není vysoká ve srovnání s nativním C++ kódem. Pˇripráci jsem ale nikdy nezaznamenal, že by UnrealScript brzdil hru. Unreal Engine používá pro ovládání postav/vozidel hráˇc˚uvzor MVC1, kde modelem je ovládaná postava/vozidlo, vˇetšinoutypu Pawn nebo Vehicle, a pohledem je kamera snímající herní svˇet. V této kapitole popisuji vybrané tˇrídy, které jsou pro hru z funkˇcního hlediska nejd ˚uležitˇejší.

3.3.1 Herní typ

V UnrealScriptu je základním herním typem tˇrídaGameInfo, jež je UDK a UT hrou rozšíˇrenao další funkcionalitu. Pro implementaci mého herního typu jsem využil UTGame, který jsem upravil tak, aby nepˇráteléútoˇcilive stále poˇcetnˇejšíchvlnách. Hra se ukonˇcía restartuje pˇrismrti hráˇce.

1 class AGGame extends UTGame; 2 //wave gameplay 3 var int CurrentWave; 4 var int NumberOfSwarmToSpawn; 5 var int NumberOfSpawnedSwarm; 6 var int NumberOfDeadSwarm; 7 var array< AGEnemySpawnPoint > SwarmSpawnPoints; 8 ...

Zdrojový kód 3.7: AGGame

Avatar hráˇceje do herního svˇetaumístˇenjako bˇežnýPawn, proto mu musíme pˇrikaždém jeho respawnu pˇridˇelitvozidlo. Oživování hráˇc˚upro- vádí funkce RestartPlayer, do které jsem umístil funkci SpawnVehicle, jež vytvoˇrípro hráˇcevozidlo a v metodˇeAttachDriver jej umístí jako ˇridiˇce. Pˇredpoužitím metody Spawn je vhodné si ovˇeˇrit,že se v prostoru, ve kte- rém se vytváˇrenýobjekt objeví, nenachází nic s kolizním modelem. Funkce Spawn, pokud detekuje obstrukci, neprovede nic, pouze zaloguje varování. Proto pˇredjejím použitím vypínám kolize na hráˇcovˇePawn.

1. Model-View-Controller

23 3. IMPLEMENTACE

1 function SpawnVehicle( Pawn P ) 2 { 3 local Vehicle V; 4 if (P == none) //NULL safety check 5 return; 6 P.SetCollisionType(COLLIDE_NoCollision); 7 V = Vehicle(Spawn( VehicleClass,,,P.Location,P.Rotation )); 8 AttachDriver(P,V); 9 } Zdrojový kód 3.8: SpawnVehicle

1 function AttachDriver(Pawn P, Vehicle V) 2 { 3 if (V != none) 4 { 5 if (V.TryToDrive(P)) 6 { 7 return; 8 } 9 V.AttachDriver(P); 10 } else { 11 log("Couldn’t spawn player of type "$VehicleClass); 12 } 13 } Zdrojový kód 3.9: AttachDriver

SwarmSpawnTimer je ˇcasovaˇc,který se stará o spawnování nepˇráteldo herní úrovnˇe.Jako jejich poˇcáteˇcnípozici volí náhodnˇejeden z bod ˚u,které jsou rozmístˇenypo herní úrovni. Funkce si také kontroluje, aby nepˇrekro- ˇcilamaximální poˇcetnepˇrátel.

1 function SwarmSpawnTimer() 2 { 3 local int n; 4 n = Rand(SwarmSpawnPoints.Length); 5 if(NeedSwarm()) 6 { 7 SpawnSwarm(SwarmSpawnPoints[n]); 8 } else { 9 SetTimer(0.f, false, ’SwarmSpawnTimer’); 10 } 11 } Zdrojový kód 3.10: SwarmSpawnTimer

Pokud nˇejakýPawn zemˇre nebo je zniˇcen,je vygenerována událost, která v aktuálním GameInfo zavolá metodu Killed. Parametry této metody jsou hˇrepˇredányinformace o tom, jak daný Pawn zemˇrel.Ve hˇretypu de- athmatch by se napˇr.upravilo skóre hráˇc˚u.Já zde kontroluji dvˇepodmínky

• Jestli zemˇrelhráˇc,

24 3. IMPLEMENTACE

• nebo jestli zemˇrelnepˇrítel.

V prvním pˇrípadˇehru ukonˇcím.V druhém aktualizuji poˇctyspawnutých a mrtvých nepˇrátela zkontroluji, zda se nejednalo o posledního nepˇrítele. Pokud ano, tak nastavím 5 sekund na ˇcasovaˇc,který po svém dobˇehnutí zapoˇcnenovou vlnu nepˇrátel.

1 function Killed(Controller Killer, Controller KilledPlayer, 2 Pawn KilledPawn, class damageType) 3 { 4 local AGSwarmBot SB; 5 local AGPawn P; 6 local AGPlayerController AGPC; 7 local AGVehicle_Sentinel AGS; 8 AGPC = AGPlayerController(KilledPlayer); 9 AGS = AGVehicle_Sentinel(KilledPawn); 10 if(AGPC != None){ 11 if(AGS != None){ 12 EndGame(None,"Player Died"); 13 } 14 } 15 SB = AGSwarmBot(KilledPlayer); 16 P = AGPawn(KilledPawn); 17 if(SB != None){ 18 if( P != None){ 19 NumberOfSpawnedSwarm -= 1 ; 20 NumberOfDeadSwarm += 1; 21 if(CheckWaveFinished(CurrentWave)){ 22 SetTimer(5.0f,false,’NextWaveTimer’); 23 } 24 } 25 } else { 26 Super.Killed(Killer, KilledPlayer, KilledPawn, damageType); 27 } 28 }

Zdrojový kód 3.11: Killed

3.3.2 Kontrolér

Pro potˇrebytéto hry jsem vytvoˇrilvlastní tˇrídukontroléru a to AGPlayer- Controller. Tento kontrolér používá vlastní tˇríduAGPlayerInput zpracová- vající vstup hráˇce.AGPlayerInput obsahuje promˇennépro zapamatování dat získávaných ze zaˇrízeníSpacePilot Pro. Pomocí funkce DLLBind je na- vázána knihovna DI3dCnnxn a jsou zadefinovány funkce a formát dat po- tˇrebnépro získávání informací o stavu zaˇrízení. Tato tˇrídamá také na starost inicializaci a odhlášení zaˇrízení.Po každém vykresleném snímku je zavolána metoda PostProcessInput, ve které pou- žívám funkci dll GetData. Tento režim je obdobou pollingu. Získaná data

25 3. IMPLEMENTACE

uložím a upravím v závislosti na ˇcaseubˇehlého od minulého snímku. Kon- trolér pak pˇristupujevždy k dat ˚um,která vyjadˇrujíaktuální stav vstupního zaˇrízení.

1 class AGPlayerInput extends UDKPlayerInput within AGPlayerController 2 DLLBind(DI3dCnnxn); 3 var input float aPitch; 4 var input float aYaw; 5 var input float aRoll; 6 7 struct SPACEPILOTSTATE{ 8 var float TX; /* x-axis position */ 9 var float TY; /* y-axis position */ 10 var float TZ; /* z-axis position */ 11 var float RX; /* x-axis rotation */ 12 var float RY; /* y-axis rotation */ 13 var float RZ; /* z-axis rotation */ 14 var int rglSlider[2]; /* unnecessary */ 15 var int rgdwPOV[4]; /* unnecessary */ 16 var byte rgbButtons[32]; /* 32 buttons */ 17 }; 18 const R_OK = 0; 19 const R_FAILED = -1; 20 const R_POLLFAILED = -2; 21 dllimport final function int Init3dCnnxn(); 22 dllimport final function int Exit3dCnnxn(); 23 dllimport final function int GetData(out SPACEPILOTSTATE state); 24 dllimport final function int GetSelectedDevice(); 25 dllimport final function int SetDeadzone(float translationDZ, float rotationDZ); 26 dllimport final function int GetNumberOfDevices();

Zdrojový kód 3.12: AGPlayerInput

26 3. IMPLEMENTACE

Po každém vykresleném snímku je volána metoda ProcessDrive, v pˇrí- padˇeže hráˇcovládá vozidlo, ve které nastavuje vstupní data hráˇcovˇelodi pomocí SetInputsWithRots. M ˚užetesi také všimnout, že je pˇredávánavo- zidlu míra otoˇcení,která je generována odchylkou zamˇeˇrovacíhokˇrížeod stˇreduobrazovky.

1 function ProcessDrive(float InForward, float InStrafe, 2 float InUp, bool InJump){ 3 local AGVehicle_Sentinel Sentinel; 4 local AGPlayerInput PInput; 5 ... 6 Sentinel = AGVehicle_Sentinel(Pawn); 7 PInput = AGPlayerInput(PlayerInput); 8 ... 9 if(Sentinel != None) { 10 if(bTurningAfterMouse){ 11 mouseTurnRate = PInput.TurnAfterMouseRate; 12 } else { 13 mouseTurnRate.X = 0; 14 mouseTurnRate.Y = 0; 15 } 16 Sentinel.SetInputsWithRots(PInput.aForward, PInput.aStrafe, 17 PInput.aUp, mouseTurnRate.Y*800 + PInput.aPitch, 18 mouseTurnRate.X*800 + PInput.aYaw, PInput.aRoll); 19 } 20 } Zdrojový kód 3.13: ProcessDrive

Tˇrídakontroléru také zajišt’uje vykreslovaní ikon nepˇrátelpomoci me- tody DrawEnemyMarkers(HUD H), která je volána tˇrídouAGHudWrap- per, již zapouzdˇruje Flash prvky použité pro uživatelské rozhraní. Tato tˇrídapˇrivykreslování pˇredávána sebe odkaz pˇríˇrazenémuobjektu, který je potomkem tˇrídyController a lze tak vykreslit na obrazovku grafiku, jež je specifická pro aktuální stav kontroléru.

3.3.3 Hráˇcovalod’

Pro implementaci hráˇcovylodi (AGVehicle_Sentinel) jsem využil už exis- tující kód vozidla Cicada, jež je p ˚uvodnˇehelikoptéra, ale vhodným nasta- vením parametr ˚u,upravením a pˇridánímnˇekolikametod jsem ji pˇripravil pro použití ve stavu beztíže. Pˇrikaždém pr ˚uchoduherní smyˇckouse postupnˇevolá na aktivních ob- jektech ve hˇrefunkce Tick, která aktualizuje data a stavy jednotlivých ob- jekt ˚u.Já na toto volání reaguji metodou SDOFMovement2, která se stará o pohyb tohoto vozidla. Kód funkce pouze pˇripravujedata o pohybu pro me- tody AddForce a AddTorque, které pˇredajívozidlu sílu a toˇcivýmoment. Tyto metody operují s fyzickými silami, není tedy nijak narušena simulace kolizí ve hˇre.

2. SDOF – six degrees of freedom

27 3. IMPLEMENTACE

1 simulated function SDOFMovement(float DeltaTime) 2 { 3 local Vector ForceApplication, ForceRotation, 4 ForwardsNormal, UpwardsNormal, SidewardsNormal; 5 local Vector ForceRotationVectX, ForceRotationVectY, ForceRotationVectZ; 6 // While there is a player as driver: 7 if (Controller != None){ 8 GetAxes(Rotation, ForwardsNormal, SidewardsNormal, UpwardsNormal); 9 // It’s probably unnecessary to normalise these: 10 ForceRotationVectX = Normal(ForwardsNormal); 11 ForceRotationVectY = Normal(SidewardsNormal); 12 ForceRotationVectZ = Normal(UpwardsNormal); 13 14 ForceRotationVectZ = UpwardsNormal * Yaw * DeltaTime * RotationSpeed; 15 ForceRotationVectY = SidewardsNormal * Pitch * DeltaTime * RotationSpeed; 16 ForceRotationVectX = ForwardsNormal * Roll * DeltaTime * RotationSpeed; 17 // Add them together to get final global rotation vector: 18 ForceRotation = ForceRotationVectX + ForceRotationVectY + ForceRotationVectZ; 19 if(Throttle > 0){ 20 ForceApplication = DeltaTime * Throttle * ForwardSpeed * ForwardsNormal 21 + DeltaTime * Steering * StrafingSpeed * SidewardsNormal 22 + DeltaTime * Rise * StrafingSpeed * UpwardsNormal; 23 } else { 24 ForceApplication = DeltaTime * Throttle * BackwardsSpeed * ForwardsNormal 25 + DeltaTime * Steering * StrafingSpeed * SidewardsNormal 26 + DeltaTime * Rise * StrafingSpeed * UpwardsNormal; 27 } 28 // Add forces and rotations AddForce(Velocity*DrivingPhysicalMaterial.LinearDamping *0.6f + ForceApplication/10); 29 AddTorque(ForceRotation); 30 ... 31 } else { 32 // if nobody is in the vehicle, don’t apply forces to it 33 } 34 } Zdrojový kód 3.14: SDOFMovement

3.3.4 Stˇrelba

Stˇrelbana pozici kurzoru je implementována pˇribližnˇetakto:

• Inicializace a kontrola pˇredstˇrelbou

• Pˇreˇctese pozice zamˇeˇrovaˇcena obrazovce

• Nativní metodou Canvas.DeProject získáme vektor smˇeru, kam uži- vatel míˇría bod v rovinˇeobrazovky

• Vypoˇctemekoncový bod: poˇcátek+ násobek vektoru míˇrení

• Provedeme Trace(), kde zadáme poˇcáteˇcnía koncový bod. Tímto zís- káme pozici, na kterou uživatel míˇrízamˇeˇrovacímkˇrížem.

• Vypoˇcítámevýsledný úhel rotace, který pˇredámefunkci pro stˇrelbu zbranˇe,jež právˇepoužíváme.

28 3. IMPLEMENTACE

3.3.5 AI nepˇrátel Pro nepˇrátelejsem vytvoˇriljednoduchou AI. Její hlavní rozhodování je pro- vádˇenove dvou funkcích, které jsou volány v ˇcasovaˇcích.První funkci jsem pojmenoval BrainTimer() a dle názvu lze poznat, že má na starost rozhodo- vání o chování jednotlivých bot ˚u3. V této funkci se provádí vyhledávání nepˇrátel,urˇcovánícílové destinace pro pohyb a pˇrechodmezi jednotlivými stavy AI. Tato AI používá pouze 3 stavy a tˇemijsou FollowEnemy, Search- ForEnemy a Wait. AI se ve stavu FollowEnemy chová takto:

• Náseduje hráˇcea stˇrílípo nˇem

• Pokud je hráˇczniˇcennebo se dostane mimo vymezený rozsah, AI se pˇresouvádo stavu SearchForEnemy

Stav SearchForEnemy ˇríkábot ˚um,aby prozkoumávali okolí. V tomto pˇrí- padˇesi vždy vyberou náhodný bod, k nˇemužse pˇresunou.Když dosáhnou cílové destinace, zastaví se (stav Wait) na krátký ˇcas. Druhá funkce je AimingTimer(), která koriguje natoˇceníbota, tak aby pˇristˇrelbˇemíˇrilna hráˇce.Implementace míˇrenínepodporuje pokroˇciléme- tody predikce pohybu, proto není pˇresnostv ˚uˇcipohybujícím se cíl ˚umpˇríliš dobrá.

3. Bot - software aplikace provádˇejícíautomatizované úkoly. V herní terminologii se jedná o termín oznaˇcujícíjednu instanci AI. Castoˇ je výrazem myšlena AI spolu s jejím herním avatarem.

29 3. IMPLEMENTACE

3.4 Grafické prvky

3.4.1 3D modely Pro hru jsem vytvoˇrilnˇekolik3D model ˚u,které jsem pak importoval do UDK. Jedná se o asteroidy, nepˇrátelskélodˇea hráˇcovulod’.

Obrázek 3.2: Asteroidy

Vytvoˇriljsem vícero model ˚u,aby jejich opakování nebylo tak zˇrejmé. Asteroidy používají stejnou texturu a materiál.

Obrázek 3.3: Model nepˇrátelskélodi

Materiál nepˇrátelskélodi používá difúzní a emisivní kanály pro textury, tudíž se nˇekteréˇcastijeví osvícené, i když na nˇenedopadá svˇetlopˇrímo. Model obsahuje objekt kosti, protože je do UDK importován jako skeletal mesh4. Kolizní model jsem následnˇeupravil v Editoru pro fyzikální prvky (Physics Asset Editor), hráˇctedy m ˚užedo nepˇrátelnarážet. V herních úrovních je také umístˇenmodel koule, na kterou je aplikován materiál pouštní planety. Materiál simuluje pohyb mrak ˚unad povrchem,

4. skeletal mesh – 3D model obsahující navíc kostru, pomocí které jej lze animovat

30 3. IMPLEMENTACE

Obrázek 3.4: Planeta které na planetu vrhají stín. Materiál také používá normálové mapy pro mraky a terén. Pro difúzní texturu jsem použil texturu staženou z [24]. Pro vygenerování normálových map z bump map jsem použil aplikaci[25]. Modely, které jsem použil z model ˚udodaných s UDK byly tyto:

• Vozidlo Cicada – model hráˇcovylodi

• Skydome

• Koule – model planety

3.4.2 Uživatelské rozhraní Prvky uživatelského rozhraní jsem vytvoˇrilv aplikacích Adobe Photoshop a Adobe Flash. Mezi prvky patˇrí:

• Zamˇeˇrovacíkˇríž

• Ikony nepˇrátel

• Rámeˇcekpro zásahové body

• Pruh oznaˇcujícízásahové body

31 3. IMPLEMENTACE

Obrázek 3.5: Zamˇeˇrovacíkˇríž

Zamˇeˇrovaˇcje hrou naˇctenz .swf souboru, který obsahuje grafiku a AS (ActionScript) kód. Hra za bˇehupˇrehráváFlash animaci pomoci Scaleform[14], i když v tomto pˇrípadˇese jedná pouze o nemˇenícíse obrázek. AS kód, který je naˇctenspolu se zamˇeˇrovacímkˇrížem,umožˇnujeenginu získávat jeho po- zici na obrazovce. Umístˇeníkˇrížena obrazovce je pak využito pˇrivýpoˇctu úhlu pro stˇrelbu,tak aby hráˇcstˇrílelna pozici, na kterou míˇrí.

Obrázek 3.6: Znaˇckanad nepˇráteli

Ikona oznaˇcujepozici nepˇrátelskélodi. Díky tomu m ˚užehráˇcsnadnˇeji najít nepˇrátelea pokraˇcovattak ve hˇre.Ikona se se zvˇetšujícíse vzdáleností mezi nepˇrítelema hráˇcemzmenšuje.

Obrázek 3.7: HUD

Pruh se zásahovými body oznamuje hráˇcizbývající množství zásaho- vých bod ˚u.Tyto prvky jsem zakomponoval do hry pomocí HUD objektu AGHudWrapper, který spouští potˇrebné.swf soubory a vykresluje prvky UI. Hlavní menu a jeho prvky jsem pˇrevzala potˇrebnˇerozšíˇrilz hlavního menu UDK. Upravil jsem data naˇcítanáhlavní nabídkou a pˇridalfunkcio- nalitu potˇrebnouk vytvoˇreníobrazovky s nabídkou nastavení rozlišení.

32 3. IMPLEMENTACE

Obrázek 3.8: Hlavní nabídka hry

Hlavní nabídka, kterou UDK implicitnˇepoužívá, je systém Flash ani- mací, který podle pˇríkaz˚uUnrealScript tˇrídzobrazuje data a grafiku. Ani- mace jsou pˇrehráványpomocí integrace Scaleform. Každá obrazovka je pˇred- pˇripravenav samostatném Flash souboru a zároveˇnsdílí sv ˚ujobsah s ostat- ními Flash soubory. Takto jsou napˇríklad sdíleny fonty a grafika pozadí hlavní nabídky.

33 4 Závˇer

Momentálnˇehra obsahuje dvˇeúrovnˇe,ve kterých má hráˇcza úkol se po- stupnˇeprobojovat pˇresvlny nepˇrátelskýchlodí. Úrovnˇese odlišují v po- užitých objektech a jejich rozmístˇení.Jedna z nejd ˚uležitˇejšíchakcí hráˇceje pohyb v prostoru a ten je provádˇenpomocí 3D myši. Stav beztíže, plná kontrola nad pohybem a rotací hráˇcovylodi a setrvaˇcnostpohybu dává hráˇcidostateˇcnémožnosti pohybu v herním prostˇredí.Míˇrenía stˇrelbuhráˇc ovládá pomocí klasické myši. Hra byla testována na nˇekolikapoˇcítaˇcích r ˚uznýchkonfigurací a nevykazovala výkonnostní problémy. Výsledná hra demonstruje, jak lze 3D myš použít jako vstupní zaˇrízení pro ovládání hry. V souˇcasnédobˇenejsou pro 3D myš aktivnˇevyvíjeny herní aplikace a tato hra je tak jednou z mála, která toto zaˇrízenípodporuje. Další práci na tomto projektu bych smˇeˇrovalna zvýšení vizuální kvality hry, implementaci zniˇcitelnéhoprostˇredía pˇridánítutoriálu pro nové hráˇce. Za další vhodné rozšíˇrenípovažuji navýšení poˇctuherních map, uvedení jiných herních mód ˚ua vytvoˇreníkomplexních model ˚uvesmírných lodí hráˇcea nepˇrátel.V dalších verzích hry lze také omezit poˇcetnáboj ˚u,který hráˇcovalod’ nese a implementovat vhodnou mechaniku jejich dobíjení. Díky této bakaláˇrsképráci jsem si prohloubil znalosti a získal cenné zku- šenosti v oblasti vývoje her.

34 Literatura

[1] SOMMERVILLE, Ian. Software engineering. 6th ed. Harlow: Addison- Wesley Publishing Company, c2001, xx, 693 s. International computer science series. ISBN 02-013-9815-X.

[2] BETHKE, Erik. Game development and production. Plano, Tex.: Wordware Pub., c2003, xxi, 412 p. ISBN 15-562-2951-8.

[3] 3DCONNEXION. 3Dconnexion [online]. 2013 [cit. 2013-05-18]. Do- stupné z: http://www.3dconnexion.com/

[4] BLOW, Jonathan. Game Development. Queue. 2004-02-01, vol. 1, issue 10, s. 28-34. DOI: 10.1145/971564.971590. Dostupné z: http://portal.acm.org/citation.cfm?doid=971564.971590

[5] LEWIS, Micheal. Game Engines. Game En- gines. 2002, 45.1 : 27. Dostupné z: http://www.cse.unr.edu/~sushil/class/gas/papers/GameAIp27- lewis.pdf

[6] Worldofleveldesign.com. Worldofleveldesign.com [online]. 2012 [cit. 2013-05-18]. Dostupné z: http://www.worldofleveldesign.com/categories/level_design_tutorials/ recommended-game-engines.php

[7] Moddb.com. Moddb.com [online]. 2013 [cit. 2013-05-18]. Dostupné z: http://www.moddb.com/engines

[8] Mouse. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2001- [cit. 2013-05-19]. Dostupné z: http://en.wikipedia.org/wiki/Mouse_%28computing%29

[9] Esenthel Engine [online]. 2013 [cit. 2013-05-19]. Dostupné z: http://www.esenthel.com/

[10] Neoaxis engine [online]. 2013 [cit. 2013-05-19]. Dostupné z: http://www.neoaxis.com/

[11] Torque 3D. Garagegames.com [online]. 2013 [cit. 2013-05-19]. Dostupné z: [http://www.garagegames.com/products/torque-3d]

[12] Unity. Unity3d.com [online]. 2013 [cit. 2013-05-19]. Dostupné z: http://unity3d.com/unity/

35 4. ZÁVERˇ

[13] Unity Scripting. Unity3d.com [online]. 2013 [cit. 2013-05-19]. Dostupné z: http://unity3d.com/unity/workflow/scripting

[14] ScaleForm. Gameware.autodesk.com [online]. 2013 [cit. 2013-05-19]. Do- stupné z: http://gameware.autodesk.com/scaleform

[15] Source Engine. Valvesoftware.com [online]. 2013 [cit. 2013-05-19]. Do- stupné z: http://source.valvesoftware.com/

[16] CryEngine SDK. Mycryengine.com [online]. 2013 [cit. 2013-05-19]. Do- stupné z: http://mycryengine.com/

[17] Unreal Development Kit. EPIC GAMES, Inc. Unrealen- gine.com [online]. 2013 [cit. 2013-05-19]. Dostupné z: http://www.unrealengine.com/en/udk/

[18] Id Tech 4 Engine. In: Wikipedia: the free encyclopedia [online]. San Fran- cisco (CA): Wikimedia Foundation, 2001- [cit. 2013-05-19]. Dostupné z: http://en.wikipedia.org/wiki/Id_Tech_4

[19] : Features. Panda3d.org [online]. 2013 [cit. 2013-05-19]. Do- stupné z: http://www.panda3d.org/manual/index.php/Features

[20] ActorX. Udn.epicgames.com [online]. 2013 [cit. 2013-05-19]. Dostupné z: http://udn.epicgames.com/Two/ActorX.html

[21] Dharma Type: Bebas Neue. Dharmatype.com [online]. 2013 [cit. 2013- 05-19]. Dostupné z: [http://dharmatype.com/dharma-type/bebas- neue.html

[22] VRPN. Cs.unc.edu [online]. 2013 [cit. 2013-05-19]. Dostupné z: http://www.cs.unc.edu/Research/vrpn/

[23] Third-helix.com [online]. 2013 [cit. 2013-05-19]. Dostupné z: http://www.third-helix.com

[24] Planet Hoth texture. Freebitmaps.blogspot.cz [online]. 2013 [cit. 2013- 05-19]. Dostupné z: http://freebitmaps.blogspot.cz/2010/12/srgb- planet-hoth.html

[25] Normal map converter by Skuid. Social.bioware.com [online]. 2013 [cit. 2013-05-19]. Dostupné z: http://social.bioware.com/project/4062/

36 PˇrílohaA – Instalace hry

Instalaci hry Adrift lze provést dvˇemazp ˚usoby. Použijte instalátor UDKInstall-Adrift.exe a následnˇezkopírujte soubor DI3dCnnxn.dll do koˇrenovéhoadresáˇrehry Adrift do složky Binaries\Win32\UserCode (napˇr. takto: C:\UDK\Adrift Game\Binaries\Win32\UserCode). UDK momentálnˇeobsahuje chybu a tak pˇrivytváˇreníinstalaˇcníhobalíˇcku nepˇridádo souboru uživatelské .dll soubory. Instalátor by mˇelsám nainstalovat potˇrebnéprerekvizity k spuštˇení.V pˇrípadˇe, že se tak nestane, najdete potˇrebný instalátor ve složce \Adrift Game\Binaries\Redist. Hru pak spustíte pˇres UDK.exe, který se nachází v \Adrift Game\Binaries\Win32. Další možností je stáhnout UDK z listopadu 2012 ze stránky http://www.unrealengine.com/en/udk/downloads/, a pak zkopírovat obsah složky udk_install do koˇrenovéhoadresáˇrenain- stalovaného UDK. Hra se pˇredspuštˇenímzeptá, zda chcete zkompilovat skripty, zvolte ano. Spouštˇejte32-bit verzi UDK.exe, protože 64-bit verze není schopna naˇcítatuživatelské .dll soubory. Pˇritomto postupu instalace hra po spuštˇenínaˇctei mapy dodávané s UDK, tyto nespouštˇejte,protože nejsou uzp ˚usobenypro vytvoˇrenýherní typ. Hra je sice spustí, ale nebudou fungovat správnˇe.Pro Adrift byly vy- tvoˇrenymapy „Bracelet“ a „Structure“, na tˇechtomapách se hra chová stan- dardnˇe.

37 PˇrílohaB – Herní manuál

Po zapnutí hry se vám zobrazí hlavní nabídka, ve které máte 3 možnosti na výbˇer.

Obrázek .1: Hlavní menu hry

Pˇrivolbˇedruhé položky se vám zobrazí menu, pomoci kterého si lze vybrat jedno z pˇredvolenýchrozlišení a pˇrepnoutrežim zobrazení na ce- lou obrazovku. Pokud byste potˇrebovalinastavit jiné rozlišení, otevˇretesi herní konzoli stiskem klávesy „;“/„‘” nebo klávesy tabulátor a pak zadejte pˇríkaz“setres ŠiˇrkaxVýška”.Mezi zadané rozmˇerynapište bez mezer male písmeno “x”.

Obrázek .2: Nabídka systémových možností

38 .PRÍLOHAˇ B–HERNÍMANUÁL

První možnost vás pˇrevededo menu, kde si m ˚užetevybrat mapu, kte- rou budete hrát a tu následnˇespustit. Mapy jsou si podobné prostˇredím. V úrovni „Bracelet“ se nacházejí pˇredevšímmenší asteroidy a v úrovni „Structure“ je ve stˇreduúrovnˇeskupina asteroid ˚uvelkých rozmˇer˚us dal- šími menšími roztroušenými kolem. Pokud do asteroidu narazíte, m ˚užete je uvést do pohybu. Toto se ale nedoporuˇcuje,protože asteroidy jsou tˇežkéa srážka s nimi vás velmi poškodí. Srážení nepˇrátelje naopak velice efektivní, i když pˇrinˇemm ˚užetebýt poškozeni také.

Obrázek .3: Zábˇerze hry

Po naˇcteníúrovnˇem ˚užetehru odstartovat stisknutím levého tlaˇcítka myši. Po zaˇcátkuhry m ˚užetena horním okraji obrazovky vidˇetmodrý rá- meˇcekse zeleným proužkem symbolizující vaše zásahové body. Pokud vás zasáhne nepˇrítelnebo narazíte do asteroidu, zásahové body se vám ode- ˇctou.Zásahové body nelze regenerovat a obnovují se pouze pˇrirestartu hry. Nepˇrátelskéstˇrelbˇese m ˚užetevyhýbat bud’to pomoci 3D myši nebo klá- vesnice. Na klávesnici je ovládaní rozvrženo takto:

• WSAD – pohyb dopˇredu,dozadu a do stran

• QE – naklápˇenído stran

• ZX – rychle otáˇcenídoleva/doprava

• RC – rychle otáˇcenínahoru/dolu

• Ctrl a mezerník – let dol ˚ua nahoru

39 .PRÍLOHAˇ B–HERNÍMANUÁL

Lod’ pomalu následuje váš zamˇeˇrovacíkˇríž,pro rychlejší obrat je doporu- ˇcenovyužít 3D myši anebo pˇríkazuumístˇenýchna klávesnici. Pro stˇrelbustisknˇetelevé nebo pravé tlaˇcítkomyši. Levým tlaˇcítkempo- užijete pulzní laser, který vyˇradínepˇrítele po ˇctyˇrechzásazích. Pravé tla- ˇcítkoodpaluje nemíˇrenérakety, které zniˇcílod’ nepˇrítelena jeden zásah. Jejich efektivní využití vyžaduje mírný trénink.

40