Univerzita Karlova v Praze Matematicko-fyzik´aln´ı fakulta
´ RSK ˇ ´ PRACE ´ BAKALA A
Tom´aˇs Slav´ıˇcek Hern´ı 3D engine pro Windows Phone 7 Katedra teoretick´e informatiky a matematick´e logiky
Vedouc´ı bakal´aˇrsk´e pr´ace: Mgr. Ondˇrej S´ ykora Studijn´ı program: Informatika Studijn´ı obor: programov´an´ı
Praha 2011
Chtˇel bych podˇekovat Ondrovi S´ ykorovi za jeho ochotu, odbornou pomoc a cenn´e rady pˇri konzultac´ıch v pr˚ ubˇehu tvorby cel´e t´eto pr´ace a ˇcesk´emu zastoupen´ı spoleˇcnosti Microsoft, s.r.o. za poskytnut´ı telefonu k testov´an´ı t´eto knihovny.
Prohlaˇsuji, ˇze jsem tuto bakal´aˇrskou pr´aci vypracoval samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u, literatury a dalˇs´ıch odborn´ ych zdroj˚ u. Beru na vˇedom´ı, ˇze se na moji pr´aci vztahuj´ı pr´ava a povinnosti vypl´ yvaj´ıc´ı ze z´akona ˇc. 121/2000 Sb., autorsk´eho z´akona v platn´em znˇen´ı, zejm´ena skuteˇcnost, ˇze Univerzita Karlova v Praze m´a pr´avo na uzavˇren´ı licenˇcn´ı smlouvy o uˇzit´ı t´eto pr´ace jako ˇskoln´ıho d´ıla podle §60 odst. 1 autorsk´eho z´akona.
V ........ dne ............
Podpis autora
N´azev pr´ace: Hern´ı 3D engine pro Windows Phone 7 Autor: Tom´aˇs Slav´ıˇcek Katedra: Katedra teoretick´e informatiky a matematick´e logiky Vedouc´ı bakal´aˇrsk´e pr´ace: Mgr. Ondˇrej S´ ykora Abstrakt: Pr´ace se zab´ yv´a implementac´ı knihovny pro jednoduˇsˇs´ı v´ yvoj her na platformˇe Windows Phone 7. Je v n´ı analyzov´ano prostˇred´ı mobiln´ıch telefon˚ u a probr´ano, jak´e vlastnosti by mˇel hern´ı 3D engine obsahovat. Je navrˇzena hierarchie projektu, pops´any a naimplementov´any jednotliv´e komponenty. Dod´ana je podpora pro efektivnˇejˇs´ı spr´avu objekt˚ u ve sc´enˇe. Rozˇs´ıˇreny jsou grafick´e moˇznosti, pˇredevˇs´ım o zobrazov´an´ı polopr˚ uhlednosti a st´ın˚ u. Algoritmy jsou vybr´any s ohledem na omezen´ y v´ ykon mobiln´ıch zaˇr´ızen´ı. Pˇriloˇzen je vzorov´ y projekt a pops´ano jeho pouˇzit´ı. Kl´ıˇcov´a slova: 3D engine, mobiln´ı telefony, grafika, hry
Title: Game 3D engine for Windows Phone 7 Author: Tom´aˇs Slav´ıˇcek Department: Department of Theoretical Computer Science and Mathematical Logic Supervisor: Mgr. Ondˇrej S´ ykora Abstract: In this work, we implement a library for easier development of games for the Windows Phone 7 platform. We analyze the environment of mobile phone development and discuss what features should the 3D game engine include. We propose the hierarchy of the project, its components are described and implemented. The engine supports efficient management of objects in the scene. It provides functionality to improve the visual appeal of the games, especially displaying of transparency and shadows. The algorithms are chosen and implemented with respect to the limited performance of the mobile devices. The capabilities of the engine are demonstrated on a sample game project. Keywords: 3D engine, mobile phones, CGI, games
Obsah ´ Uvod
2
1 Anal´ yza probl´ emu 1.1 Sezn´amen´ı s platformou . . . . . 1.2 Specifika mobiln´ıho v´ yvoje . . . . 1.3 Anal´ yza her . . . . . . . . . . . . 1.4 Poˇzadovan´e vlastnosti 3D engine 1.5 Dalˇs´ı souˇc´asti her . . . . . . . . .
. . . . .
4 4 5 6 7 9
. . . . . .
10 10 11 13 14 16 20
. . . . . . . . .
25 25 27 28 31 32 34 37 39 40
4 Vyuˇ zit´ı v praxi 4.1 Uk´azkov´ y projekt, mˇeˇren´ı . . . . . . . . . . . . . . . . . . . . . . 4.2 Zhodnocen´ı pr´ace, rozˇsiˇritelnost . . . . . . . . . . . . . . . . . . . 4.3 Porovn´an´ı s dalˇs´ımi knihovnami . . . . . . . . . . . . . . . . . . .
43 43 46 47
Z´ avˇ er
48
Seznam pouˇ zit´ e literatury
49
A Obsah pˇ riloˇ zen´ eho CD
52
B Uˇ zivatelsk´ a dokumentace
53
C Program´ atorsk´ a dokumentace
55
2 N´ avrh hern´ıho 3D engine 2.1 Spr´ava hern´ıch obrazovek . . . . 2.2 Zpracov´an´ı uˇzivatelsk´eho vstupu 2.3 Spr´ava objekt˚ u . . . . . . . . . 2.4 Spr´avci sc´eny . . . . . . . . . . 2.5 Polopr˚ uhlednost . . . . . . . . . 2.6 Vylepˇsen´ı grafick´eho vzhledu . . 3 Implementace 3.1 Hierarchie projektu . . . . . . . 3.2 Glob´aln´ı vlastnosti engine . . . 3.3 Spr´ava obrazovek, komponenty 3.4 Spr´avci sc´eny . . . . . . . . . . 3.5 Implementace objekt˚ u . . . . . 3.6 Generovan´a primitiva . . . . . . 3.7 Serializace objekt˚ u ze souboru . 3.8 Kolize objekt˚ u. . . . . . . . . . 3.9 Kamery . . . . . . . . . . . . .
1
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . .
´ Uvod Mobiln´ı telefony se staly ned´ılnou souˇca´st´ı naˇseho ˇzivota. Lid´e je vyuˇz´ıvaj´ı nejen ke komunikaci, ale tak´e k hled´an´ı informac´ı na internetu nebo k pˇrehr´av´an´ı hudby. T´ım, jak se postupnˇe navyˇsoval v´ ykon tˇechto zaˇr´ızen´ı, se v´ yznamnou ˇc´ast´ı mobiln´ıho businessu staly tak´e mobiln´ı hry. Historie Jednou z prvn´ıch mobiln´ıch her byl Snake, uveden´ y v roce 1997 pro telefon Nokia 6110 [24]. V t´eto dobˇe byly hry jeˇstˇe velice jednoduch´e, k zobrazen´ı slouˇzil mal´ y ˇcernob´ıl´ y displej, k ovl´ad´an´ı ˇc´ıseln´a kl´avesnice. Tyto hry byly vytv´aˇreny na zak´azku pˇr´ımo pro konkr´etn´ı modely telefon˚ u, ze sv´ ych zaˇr´ızen´ı si je uˇzivatel´e nemohli odstranit ani nahradit jin´ ymi. Postupem ˇcasu se u mobiln´ıch telefon˚ u prosadila platforma J2ME (Java 2 Micro Edition) [26]. Tento standard umoˇznil v´ yvoj´aˇr˚ um vytvoˇrit jednu hru a nab´ıdnout ji pro v´ıce telefon˚ u r˚ uzn´ ych znaˇcek. Mobiln´ı hry se staly ˇza´dan´ ym zboˇz´ım, vznikala prvn´ı v´ yvoj´aˇrsk´a studia. D´ıky nar˚ ustaj´ıc´ımu v´ ykonu telefon˚ u, prvn´ım barevn´ ym displej˚ um a jejich vyˇsˇs´ımu rozliˇsen´ı, zaˇcaly hry tak´e vypadat mnohem l´epe. Jejich distribuce v t´e dobˇe prob´ıhala pˇredevˇs´ım pˇres mobiln´ı oper´atory. Z dalˇs´ı miln´ık ve v´ yvoji lze povaˇzovat uveden´ı telefonu Apple iPhone v roce 2007 [2]. Nab´ıdl jednoduch´e ovl´ad´an´ı pomoc´ı dotykov´eho displeje a pohybov´eho senzoru. V roce 2008 byl uveden digit´aln´ı obchod App Store, ˇc´ımˇz byl nast´ınˇen i nov´ y smˇer v distribuci her. Aplikace se daly st´ahnout pouze z jednoho centralizovan´eho obchodu, ten provozoval pˇr´ımo v´ yrobce telefon˚ u. Uˇzivatel´e si ale mohli vyb´ırat nov´e programy pˇr´ımo z telefonu, tedy mnohem jednoduˇsˇseji, neˇz dˇr´ıve. Stejnˇe tak se i v´ yvoj´aˇr˚ um ulehˇcila pr´ace, kdyˇz chtˇeli sv´e aplikace zaˇc´ıt nab´ızet. Na tento zp˚ usob distribuce v dneˇsn´ı dobˇe pˇreˇsly vˇsechny hlavn´ı platformy tzv. chytr´ ych telefon˚ u, sv˚ uj obchod s aplikacemi maj´ı operaˇcn´ı syst´emy Android, Symbian, Bada, nebo tak´e Windows Phone. Windows Phone Windows Phone 7 [18] je nov´a mobiln´ı platforma spoleˇcnosti Microsoft, uveden´a vu ´noru 2010. Obsahuje inovovan´e grafick´e uˇzivatelsk´e rozhran´ı. Hry zde hraj´ı velkou roli, v syst´emu maj´ı vyhrazenou celou svoji sekci, nˇekter´e mohou komunikovat i s hern´ı konzol´ı Xbox 360. Pro jejich tvorbu je v´ yvoj´aˇr˚ um k dispozici technologie XNA Framework [19]. Pro vytv´aˇren´ı jednoduch´ ych dvourozmˇern´ ych her je dobˇre pˇripravena, lze si pomoc´ı n´ı jednoduˇse naˇc´ıtat obr´azky nebo napˇr´ıklad zvukov´e 2
soubory do projektu, vyuˇz´ıvat pˇripravenou hern´ı smyˇcku, nebo dalˇs´ı pomocn´e funkce. Nen´ı to ale kompletn´ı hern´ı engine, nen´ı zde pln´a podpora pro spr´avu obrazovek a objekt˚ u na sc´enˇe, vykreslov´an´ı st´ın˚ u apod. Mnoho funkc´ı je potˇreba doplnit. C´ıle pr´ ace C´ılem t´eto pr´ace je navrhnout a naimplementovat knihovnu pro jednoduˇsˇs´ı a pohodlnˇejˇs´ı v´ yvoj her na t´eto platformˇe. Rozhodnout, jak´e funkce budou nejˇcastˇeji potˇreba pˇri tvorbˇe her a doplnit jejich konkr´etn´ı implementaci. Postarat se o uˇzivatelsk´ y vstup a navrhnout podporu pro spr´avu hern´ıch obrazovek. Urˇcit, jak budou jednotliv´e souˇca´sti hry dˇelen´e do komponent a popsat, jak spolu budou moci komunikovat. Doplnit implementaci nejˇcastˇejˇs´ıch souˇc´ast´ı hry, tj. pˇripravit komponenty pro vykreslov´an´ı ovl´adac´ıch prvk˚ u, hlavn´ıho menu apod. Dalˇs´ım c´ılem bude rozˇs´ıˇrit grafick´e moˇznost´ı XNA, pˇredevˇs´ım pro vykreslov´an´ı 3D sc´en. Vybrat a naimplementovat algoritmy pro vykreslov´an´ı st´ın˚ u a pouˇz´ıv´an´ı polopr˚ uhlednosti. Dodat podporu pro efektivnˇejˇs´ı spr´avu objekt˚ u, aby se pokud moˇzno vˇzdy vykreslovaly jen ty v zorn´em poli kamery. Doplnit podporu pro ˇreˇsen´ı jednoduch´ ych koliz´ı a pro naˇc´ıt´an´ı popisu hern´ı sc´eny ze souboru. Pouˇzit´ı jednotliv´ ych technik a algoritm˚ u bude diskutov´ano a vˇzdy vybr´ano s ohledem na omezen´e vlastnosti tˇechto mobiln´ıch zaˇr´ızen´ı. Struktura pr´ ace Pr´ace je rozdˇelena do ˇctyˇr ˇca´st´ı. V prvn´ı kapitole je analyzov´an probl´em, pops´ano prostˇred´ı mobiln´ıch telefon˚ u a ˇcten´aˇr je sezn´amen s platformou Windows Phone. Je zde probr´ano, jak´e vlastnosti by mˇel 3D engine obsahovat. Druh´a kapitola se zab´ yv´a popisem, jak konkr´etnˇe by se mohl hern´ı 3D engine navrhnout a jak´e souˇc´asti by mˇel obsahovat. Pops´ana je struktura projektu a je rozvedeno, jak´e by se mohly pouˇz´ıt grafick´e techniky pro vylepˇsen´ı vzhledu sc´eny. Kapitola 3 se zab´ yv´a konkr´etn´ı implementac´ı knihovny, je zde pops´ana jej´ı architektura a uvedena struktura tˇr´ıd. Je zde rozvedeno, jak spolu jednotliv´e ˇca´sti komunikuj´ı. V kapitole 4 je pops´an uk´azkov´ y projekt. Na z´avˇer jsou zhodnoceny moˇznosti t´eto knihovny a je porovn´ana s konkurenc´ı. Jako pˇr´ıloha je pˇriloˇzena uˇzivatelsk´a a program´atorsk´a dokumentace. Nach´az´ı se zde popis, jak projekt zprovoznit. Tak´e je zde pops´ano, jak by se mˇelo postupovat pˇri implementaci nov´e hry nad touto knihovnou.
3
1. Anal´ yza probl´ emu 1.1
Sezn´ amen´ı s platformou
Windows Phone 7 je v souˇcasn´e dobˇe (konec roku 2011) hlavn´ı mobiln´ı platforma Microsoftu. Byla uvedena v u ´noru 2010 na konferenci MWC v Barcelonˇe, prvn´ı zaˇr´ızen´ı se zaˇcala prod´avat p˚ ul roku pot´e. V pr˚ ubˇehu ˇcasu byly telefony s t´ımto syst´emem nˇekolikr´at aktualizov´any, postupnˇe jim byly pˇrid´av´any funkce, jako napˇr´ıklad podpora pro kop´ırov´an´ı a vkl´ad´an´ı textu. Posledn´ı velk´a aktualizace, nazvan´a Mango, se zaˇcala distribuovat 27. z´aˇr´ı 2011. Do telefon˚ u byla pˇrid´ana moˇznost rychl´eho pˇrep´ın´an´ı aplikac´ı, bylo zpˇr´ıstupnˇeno nˇekolik nov´ ych rozhran´ı pro program´atory. ˇ Spolu s touto aktualizac´ı tak´e pˇribyla pln´a podpora pro Ceskou republiku, vˇcetnˇe lokalizace syst´emu, moˇznosti n´akupu aplikac´ı pro ˇcesk´e uˇzivatele i jejich prodeje pro ˇcesk´e v´ yvoj´aˇre. V´ yvoj pro Windows Phone Pˇredch˚ udcem Windows Phone 7 byla platforma Pocket PC uveden´a v roce 2000, v roce 2003 pˇrejmenovan´a na Windows Mobile. Windows Phone 7 se od t´eto platformy liˇs´ı, obsahuje nov´e grafick´e rozhran´ı, nazvan´e Metro, kter´e s´az´ı na jednoduchost a typografii. Odliˇsn´ y je i zp˚ usob v´ yvoje aplikac´ı pro tyto telefony. Zmizela moˇznost nativn´ıho v´ yvoje v jazyce C++, stejnˇe tak i pro jazyky .NET (C# a VB.NET) se styl programov´an´ı zmˇenil. Nen´ı zde k dispozici kompletn´ı .NET Compact Framework, je nutn´e si vystaˇcit s dvˇema technologiemi – se Silverlightem a s XNA. Silverlight [17] vych´az´ı z desktopov´e technologie WPF, na Windows Phone je urˇcen´ y pˇredevˇs´ım pro vytv´aˇren´ı bˇeˇzn´ ych aplikac´ı. Hod´ı se pro psan´ı r˚ uzn´ ych utilit, m´a pˇr´ıstup k r˚ uzn´ ym telefonn´ım senzor˚ um, napˇr´ıklad k fotoapar´atu nebo akcelerometru. Oproti tomu XNA [19] je framework urˇcen´ y pˇredevˇs´ım pro tvorbu her. Je postaven´ y nad technologi´ı DirectX, snaˇz´ı se odst´ınit v´ yvoj´aˇre od specifick´ ych vlastnost´ı jednotliv´ ych platforem. D´a se pomoc´ı nˇej vyv´ıjet i pro osobn´ı poˇc´ıtaˇce, hern´ı konzole Xbox 360 a hudebn´ı pˇrehr´avaˇce Zune.
4
1.2
Specifika mobiln´ıho v´ yvoje
Ovl´ ad´ an´ı telefon˚ u Modern´ı mobiln´ı telefony, kter´ ymi se zab´ yv´a tato pr´ace, se v mnoh´em odliˇsuj´ı od ostatn´ıch typ˚ u zaˇr´ızen´ı. Oproti telefon˚ um klasick´e konstrukce jim vˇetˇsinou chyb´ı hardwarov´a ˇc´ıseln´a kl´avesnice, prostor zde naopak dost´av´a velk´ y displej. Poˇcet ovl´adac´ıch prvk˚ u je omezen na minimum, na telefonu se nach´az´ı jen ty nejnutnˇejˇs´ı kl´avesy, jako napˇr´ıklad pro n´avrat na pˇredchoz´ı obrazovku, nebo zpˇet do hlavn´ı nab´ıdky. Ostatn´ı ovl´adac´ı prvky se zobrazuj´ı pˇr´ımo na displeji podle aktu´aln´ıho kontextu. Displej je dotykov´ y, vˇetˇsinou s podporou stisknut´ı v´ıce dotyk˚ u z´aroveˇ n. Pro ovl´ad´an´ı telefonu se ˇcasto vyuˇz´ıvaj´ı gesta, jako rychl´e t´ahnut´ı prstu urˇcit´ ym smˇerem, nebo roztaˇzen´ı dvou prst˚ u od sebe. Pˇri n´avrhu her na tyto vlastnosti mus´ı b´ yt br´an ohled. Na rozd´ıl od kapesn´ıch hern´ıch konzol´ı tyto telefony nemaj´ı k dispozici ˇz´adn´e hardwarov´e ovl´adac´ı ˇsipky, joysticky a podobnˇe. Prim´arn´ı vstup tedy mus´ı poch´azet z dotykov´eho displeje [28], viz obr´azek 1.1.
Obr´azek 1.1: Windows Phone 7 telefon a jeho souˇca´sti: dotykov´ y displej, kl´avesy zpˇet, dom˚ u a hledat.
Senzory Druh´ ym zp˚ usobem ovl´ad´an´ı her je pouˇzit´ı vestavˇen´eho akcelerometru. Ten ud´av´a aktu´aln´ı n´aklon telefonu v prostoru. Bˇeˇzn´e aplikace na nˇej mohou reagovat zmˇenou sv´e orientace na v´ yˇsku, nebo na ˇs´ıˇrku. Ve hr´ach se ˇcasto pouˇz´ıv´a k ovl´ad´an´ı pohybu, nakl´apˇen´ım zaˇr´ızen´ı lze napˇr´ıklad ovl´adat zat´aˇcen´ı auta v z´avodn´ı hˇre. Nˇekter´e hry mohou tak´e vyuˇz´ıvat vstupu z dalˇs´ıch senzor˚ u, jako napˇr´ıklad z fotoapar´atu, digit´aln´ıho kompasu, z gyroskopu nebo z mikrofonu.
5
V´ ykon telefon˚ u Pro telefony se syst´emem Windows Phone byly stanoveny pevn´e minim´aln´ı hardwarov´e poˇzadavky. Kaˇzd´e zaˇr´ızen´ı obsahuje displej s rozliˇsen´ım 800x480 pixel˚ u, s podporou stisku nejm´enˇe ˇctyˇr dotyk˚ u najednou. K dispozici je v´ ykonn´ y procesor a dedikovan´a grafick´a karta s podporou DirectX 9 [28]. Celkov´ y v´ ykon nen´ı takov´ y, jako na poˇc´ıtaˇci, nebo na specializovan´ ych hern´ıch konzol´ıch, pˇresto se pro tyto telefony daj´ı vytv´aˇret i pomˇernˇe dobˇre vypadaj´ıc´ı trojrozmˇern´e hry.
1.3
Anal´ yza her
Kaˇzd´a komplexnˇejˇs´ı hra se skl´ad´a z nˇekolika oddˇelen´ ych ˇc´ast´ı. Obsahuje u ´vodn´ı obrazovku s hlavn´ım menu, obrazovku s nastaven´ım, nebo s v´ ypisem rekord˚ u. Mezi tˇemito obrazovkami se d´a pˇrech´azet, napˇr´ıklad vybr´an´ım poloˇzky v hlavn´ım menu. V hern´ım oknˇe se nach´az´ı hern´ı pl´an. To je sestava obr´azk˚ u, naˇcten´ ych model˚ u nebo dalˇs´ıch objekt˚ u rozm´ıstˇen´ ych na specifick´ ych pozic´ıch. Dohromady pˇredstavuj´ı prostˇred´ı, ve kter´em se odehr´av´a hra. M˚ uˇze to b´ yt napˇr´ıklad sestaven´e bludiˇstˇe pro hern´ı postaviˇcku. C´ılem hry potom m˚ uˇze b´ yt prokliˇckov´an´ı s hlavn´ım hrdinou mezi objekty tohoto hern´ıho pl´anu a docestov´an´ı aˇz do c´ıle. Pˇres tento hern´ı pl´an b´ yvaj´ı pˇrekreslen´e ovl´adac´ı prvky, ukazatele sk´ore apod. Hra vˇetˇsinou umoˇzn ˇuje naˇcten´ı v´ıce r˚ uzn´ ych level˚ u, neboli pˇredem urˇcen´ ych rozm´ıstˇen´ı objekt˚ u na hern´ım pl´anu. Danou hru je moˇzn´e pozastavit. M˚ uˇze se uloˇzit nejvyˇsˇs´ı dosaˇzen´e sk´ore v t´eto hˇre, nebo ho odeslat online. Tato struktura se opakuje prakticky u vˇsech her. U kaˇzd´e hry je tak´e potˇreba zpracov´avat dotyky na displeji, gesta, pˇr´ıpadnˇe informace z pohybov´eho senzoru (akcelerometru). Hern´ı ˇ z´ anry Hry mohou b´ yt rozdˇeleny do nˇekolika skupin. Obvykl´e dˇelen´ı b´ yv´a podle jejich ˇza´nr˚ u, mezi hlavn´ı z´astupce patˇr´ı ark´ady (rychl´e hry s jednoduch´ ymi pravidly), simul´atory (napˇr´ıklad z´avodn´ı a sportovn´ı hry), RPG (hry na hrdiny), nebo napˇr´ıklad akˇcn´ı hry (stˇr´ıleˇcky apod.). Hry mohou ˇcasto kombinovat i v´ıce ˇz´anr˚ u dohromady. Kaˇzd´emu ˇz´anru odpov´ıd´a urˇcit´ y zp˚ usob ovl´ad´an´ı, rychl´e akˇcn´ı hry vyˇzaduj´ı dobˇre navrˇzen´e ovl´adac´ı prvky s rychlou odezvou. Naopak napˇr´ıklad point & click adventury jsou na ovl´ad´an´ı nen´aroˇcn´e. U nich staˇc´ı, kdyˇz hra um´ı jednoduˇse zareagovat na kliknut´ı na displeji.
6
Zp˚ usoby zobrazen´ı sc´ eny Sp´ıˇs neˇz dan´ y ˇza´nr hry, bude pro n´avrh knihovny d˚ uleˇzitˇejˇs´ı zp˚ usob, jak´ ym se hra bude vykreslovat na sc´enu. Hra m˚ uˇze b´ yt renderov´ana dvourozmˇernˇe, bud’ pomoc´ı pˇrekr´ yv´an´ı obr´azk˚ u pˇres sebe, nebo pomoc´ı vektorov´e grafiky. Tato pr´ace se t´ yk´a pˇredevˇs´ım 3D her, tedy her, ve kter´ ych je vykreslov´an tˇr´ırozmˇern´y pohled na sc´enu. Hern´ı pl´an je pˇredstavov´an virtu´aln´ım svˇetem, na kter´ y se hr´aˇc ˇ d´ıv´a pomyslnou kamerou. Casto si s t´ımto pohledem m˚ uˇze posouvat nebo ot´aˇcet, pˇr´ıpadnˇe si toto zobrazen´ı m˚ uˇze pˇribliˇzovat a oddalovat. Mezi nejˇcastˇejˇs´ı zp˚ usoby zobrazen´ı 3D her patˇr´ı pohled prvn´ı osoby (takzvan´ y FPS pohled, hr´aˇc si prohl´ıˇz´ı objekty ve sc´enˇe z pohledu hern´ı postaviˇcky), pˇr´ıpadnˇe pohled tˇret´ı osoby (kamera m´ıˇr´ı shora na hr´aˇce a pohybuje se s n´ım), viz obr´azek 1.2. Ve hr´ach typu strategie se pouˇz´ıv´a kamera, kter´a m´ıˇr´ı shora na urˇcitou ˇc´ast hern´ıho svˇeta. Nˇekter´e hry vyuˇz´ıvaj´ı pohled zboku na hr´aˇce. Ve sc´enˇe tak´e m˚ uˇze b´ yt rozm´ıstˇeno nˇekolik pevn´ych kamer, kdy se jen pˇrep´ın´a pohled podle aktu´aln´ı pozice postaviˇcky.
Obr´azek 1.2: Hra Harvest pro Windows Phone 7 (akˇcn´ı RPG s pohledem ˇsikmo shora, Luma Arcade) [16], vytvoˇrena pomoc´ı technologie XNA
1.4
Poˇ zadovan´ e vlastnosti 3D engine
XNA Framework m´a jen ˇc´asteˇcnou podporu pro vytv´aˇren´ı sloˇzitˇejˇs´ıch her. Je zde k dispozici pˇripraven´a hern´ı smyˇcka (sada metod naˇcti, zaktualizuj, vykresli. . . , do kter´ ych lze dosazovat k´od). Je zde z´akladn´ı podpora pro vytv´aˇren´ı hern´ıch 7
komponent. Data do projektu lze naˇc´ıtat pomoc´ı mechanismu Content Pipeline, stejnˇe jako na PC a hern´ı konzoli Xbox 360. Jsou zde pˇripraven´e i z´akladn´ı matematick´e funkce uˇziteˇcn´e pro 3D grafiku ´ e zde ale chyb´ı nˇejak´a vyˇsˇs´ı abs(pro r˚ uzn´e v´ ypoˇcty s vektory a maticemi). Uplnˇ trakce, pro celkovˇe pohodlnˇejˇs´ı a jednoduˇsˇs´ı v´ yvoj. Spr´ ava objekt˚ u S objekty na hern´ım pl´anu by mˇelo b´ yt jednoduch´e manipulovat. Kaˇzd´ y by si mˇel pamatovat transformaˇcn´ı matici (um´ıstˇen´ı a pootoˇcen´ı v prostoru). Mˇelo by jim b´ yt moˇzn´e nastavit parametry jako osvˇetlen´ı, polopr˚ uhlednost nebo st´ıny. Pro moˇznost oˇsetˇrov´an´ı koliz´ı by si objekty mˇely pamatovat i opsan´e orientovan´e bounding boxy, pˇr´ıpadnˇe bounding sphere. Tyto objekty by mˇely b´ yt udrˇzov´any ve spoleˇcn´e kolekci, aby se daly jednoduˇse naˇc´ıst ze souboru, pˇr´ıpadnˇe aby se jim vˇsem najednou daly nastavit vybran´e parametry. Tato kolekce by tak´e mˇela umoˇzn ˇovat rozdˇelen´ı objekt˚ u do skupin, nebo jejich urˇcit´e seˇrazen´ı. Z uspoˇr´ad´an´ı v t´eto kolekci by potom ˇcerpaly algoritmy pro ovˇeˇrov´an´ı viditelnosti na displeji, nebo pro v´ ypoˇcty koliz´ı. Ve hr´ach se obvykle pouˇz´ıv´a nˇekolik typ˚ u objekt˚ u. Modely naˇcten´e do hry b´ yvaj´ı vytvoˇren´e v nˇekter´em ze specializovan´ ych 3D editor˚ u. Okolo hern´ı sc´eny m˚ uˇze b´ yt um´ıstˇen skybox simuluj´ıc´ı oblohu. Nˇekter´e objekty, jako napˇr´ıklad z´akladn´ı obd´eln´ıky nebo kv´adry mohou b´ yt generovan´e pˇr´ımo hrou. Stejnˇe tak i ter´en m˚ uˇze b´ yt vytv´aˇren aˇz za bˇehu podle nˇejak´eho popisu v souboru. Nˇekter´e objekty budou moci b´ yt deformovateln´e, nebo se budou moci animovat. Pro u ´ˇcely ladˇen´ı by mˇela hra umˇet zobrazit i dr´atˇen´e objekty pomocn´e geometrie, napˇr´ıklad pro vizualizaci bounding box˚ u pˇri testov´an´ı koliz´ı. Kamery Dan´e ˇza´nry her, jako napˇr´ıklad strategie, ˇcasto obsahuj´ı velice podobn´e moˇznosti ovl´ad´an´ı pohledu. S hern´ım pl´anem jde posouvat, ot´aˇcet, pˇr´ıpadnˇe si ho pˇribliˇzovat. U FPS stˇr´ıleˇcek zase pˇredpokl´ad´ame napˇr´ıklad omezen´ı pohybu v urˇcit´ ych os´ach (hr´aˇc se nem˚ uˇze naklopit nabok). Pro jednoduˇsˇs´ı manipulaci s pohledem na sc´enu se mohou pˇripravit objekty kamer. Nˇekter´e mohou vyuˇz´ıvat perspektivn´ı pohled, nˇekter´e ortografick´ y, mohou se liˇsit i dalˇs´ı jejich parametry. Grafick´ e techniky ˇ Casto je snaha co nejv´ıce vylepˇsit grafick´ y vzhled hry. Uˇziteˇcn´a bude podpora alespoˇ n pro vykreslov´an´ı z´akladn´ıch st´ın˚ u. Ty dok´aˇz´ı dodat sc´enˇe na hloubce, umoˇzn´ı uˇzivateli se l´epe orientovat na hern´ım pl´anu, odhadovat vz´ajemn´e pozice 8
objekt˚ u. Dobˇre vypadaj´ıc´ı st´ıny vykreslovan´e v re´aln´em ˇcase b´ yvaj´ı pomˇernˇe n´aroˇcn´e na v´ ykon, u mobiln´ıch her se proto vˇetˇsinou nepouˇz´ıvaj´ı. Existuj´ı ale jednoduˇsˇs´ı metody, kter´e t vypadaj´ı pomˇernˇe dobˇre. Podobnˇe se do hry m˚ uˇze doplnit podpora polopr˚ uhlednosti. Polopr˚ uhledn´e objekty je potˇreba ˇradit odzadu dopˇredu v˚ uˇci kameˇre, aby se spr´avnˇe vykreslily. Z d˚ uvod˚ u omezen´eho v´ ykonu mobiln´ıch zaˇr´ızen´ı se ve hr´ach polopr˚ uhlednost obvykle vyuˇz´ıv´a jen velice zˇr´ıdka, pˇresto m˚ uˇze pomˇernˇe pˇrispˇet k dobr´emu vzhledu. Dalˇs´ı grafick´e techniky, obˇcas tak´e pouˇz´ıvan´e v mobiln´ıch hr´ach, jsou napˇr´ıklad particle efekty (simulace kouˇre, ohnˇe apod.), pˇr´ıpadnˇe r˚ uzn´e pˇrekryvn´e 2D objekty (z´aˇre, v´ ybuchy apod.). Tyto objekty ˇcasto tak´e mohou b´ yt animovan´e.
1.5
Dalˇ s´ı souˇ c´ asti her
Ned´ılnou souˇc´ast´ı vˇetˇsiny her b´ yv´a pˇrehr´av´an´ı zvuk˚ u a hudby na pozad´ı. Tyto efekty mohou v´ yznamnˇe pozvednout celkov´ y z´aˇzitek ze hry. Hru je tak´e obvykle potˇreba lokalizovat do nˇekolika jazyk˚ u. Online sluˇ zby V dneˇsn´ı dobˇe se pˇredpokl´ad´a, ˇze vˇetˇsina mobiln´ıch telefon˚ u bude vyuˇz´ıvat pˇripojen´ı k internetu. Mobiln´ım hr´am to pˇrid´av´a mnoho moˇznost´ı. Lze sd´ılet nejvyˇsˇs´ı sk´ore s kamar´ady, nebo napˇr´ıklad dosaˇzen´e achievementy. Pˇripojen´ı k internetu umoˇzn ˇuje uˇzivateli stahovat do telefonu dalˇs´ı obsah do hry, napˇr´ıklad nov´e levely. Nˇekter´e hry mohou j´ıt hr´at i pˇr´ımo online mezi telefony, bud’ jako takov´a hra, nebo u ´plnˇe naˇzivo (realtime). Fyzik´ aln´ı simulace Mnoho mobiln´ıch her v dneˇsn´ı dobˇe vyuˇz´ıv´a algoritm˚ u pro simulaci fyzik´aln´ıch z´akon˚ u. Pad´an´ı kostek ve hr´ach potom vypad´a re´alnˇe, stejnˇe tak jako rozr´aˇzen´ı kuˇzelek, ovl´ad´an´ı auta apod. Tyto simulace se z d˚ uvodu omezen´eho v´ ykonu zaˇr´ızen´ı vˇetˇsinou pouˇz´ıvaj´ı jen u jednoduˇsˇs´ıch dvourozmˇern´ ych mobiln´ıch her. Existuje pro nˇe uˇz nˇekolik pˇripraven´ ych knihoven, jako napˇr´ıklad Farseer Physics Engine [10].
9
2. N´ avrh hern´ıho 3D engine Tato kapitola se zab´ yv´a konkr´etn´ım popisem, jak by se mohl 3D engine navrhnout a jak´e souˇca´sti by mˇel obsahovat. Pops´ana je struktura projektu a je rozvedeno, jak´e by se mohly vyuˇz´ıt grafick´e techniky pro vylepˇsen´ı vzhledu sc´eny.
2.1
Spr´ ava hern´ıch obrazovek
Z´akladn´ı poˇzadavek na spr´avu hern´ıch obrazovek byl, aby mˇel program´ator, kter´ y bude nad touto knihovnou vytv´aˇret svoji hru, co nejv´ıce ulehˇcenou pr´aci. Na zaˇc´atku hry by si nadefinoval jednotliv´e objekty obrazovek. Rozm´ıstil si na nˇe ovl´adac´ı prvky a urˇcil by, jak budou obrazovky mezi sebou prov´azan´e. D´al by uˇz do jejich bˇehu nemusel zasahovat, pˇrech´azen´ı mezi obrazovkami, naˇc´ıt´an´ı a ˇ o to rozodnaˇc´ıt´an´ı grafick´eho obsahu apod. by uˇz fungovalo automaticky. Slo hodnout, co vˇsechny by tedy tyto objekty obrazovek mˇely umˇet a jak´ y obsah by se na nich mohl nach´azet. Zvolen byl pˇr´ıstup, ˇze kaˇzd´a obrazovka m˚ uˇze obsahovat tˇri kolekce objekt˚ u– grafick´e vrstvy, dotykov´e vrstvy a vrstvy pohybov´eho senzoru. Pˇri programov´an´ı hry se jako prvn´ı na zvolenou obrazovku napˇr´ıklad um´ıst´ı vrstva pozad´ı, ta bude jen grafickou vrstvou. Nad ni se pˇrid´a objekt, kter´ y bude ´ e nejv´ vykreslovat naˇcten´ y hern´ı pl´an. Uplnˇ yˇs se potom um´ıst´ı ovl´adac´ı prvky, jako napˇr´ıklad virtu´aln´ı joystick. Bude tak oddˇelena logika jednotliv´ ych komponent. Vytvoˇren´e komponenty se d´ıky tomu budou moci vyuˇz´ıvat ve v´ıce hr´ach. Jednotliv´e komponenty budou moci obsahovat i vlastnosti v´ıce vrstev. Virtu´aln´ı joystick bude napˇr´ıklad definov´an jako grafick´a i dotykov´a vrstva, bude se tedy vykreslovat na displej i reagovat na dotyky a gesta. Grafick´ e vrstvy Objekt obrazovky se potom bude starat o spr´avn´e vol´an´ı metod jednotliv´ ych komponent. Pˇri sv´e inicializaci zavol´a inicializaci tak´e na vˇsechny svoje vrstvy. Grafick´ ym vrstv´am se nav´ıc postar´a o naˇcten´ı obsahu, v pˇr´ıpadˇe pˇrechodu na jinou obrazovku tak´e o jeho odnaˇcten´ı. Pokud nastane zmˇena orientace displeje, tuto informaci tak´e pˇred´a d´al vˇsem grafick´ ym vrstv´am. Tento koncept grafick´ ych vrstev byl ve v´ ysledn´e pr´aci nakonec jeˇstˇe rozˇs´ıˇren. Kaˇzd´e takov´e vrstvˇe se m˚ uˇze zadat sada dvojic obrazovek, mezi kter´ ymi by mˇela pˇreˇz´ıt. Objekt obrazovky se potom postar´a o to, aby pˇri pˇrechodu na jinou obrazovku nebyl jej´ı obsah odnaˇcten. M˚ uˇze se tak napˇr´ıklad udrˇzovat vrstva pozad´ı, kter´a bude um´ıstˇena pod vˇsemi 10
hern´ımi obrazovkami po celou dobu bˇehu programu. V pamˇeti bude ale uloˇzen´a jen jednou. Pokud se na n´ı budou vykreslovat napˇr´ıklad animace, ty na sebe budou plynule navazovat i pˇri pˇrechodech mezi obrazovkami. Dotykov´ e vrstvy U dotykov´ ych vrstev m´a objekt obrazovky za u ´kol starat se o to, aby kaˇzd´e takov´e vrstvˇe byly pos´ıl´any jen ty dotyky, kter´e se k n´ı mohly dostat. Kaˇzd´a vrstva si m˚ uˇze nadefinovat oblast, na kterou bude reagovat. Aktu´alnˇe stisknut´e dotyky na displeji se nejdˇr´ıv pos´ılaj´ı vrstvˇe, kter´a je nejv´ıc nahoˇre. Ta m˚ uˇze nˇekter´e odchytit a zpracovat. Ostatn´ım vrstv´am na niˇzˇs´ıch hladin´ach jsou potom odes´ıl´any uˇz jen ty dotyky, kter´e nebyly zpracov´any ostatn´ımi vrstvami. Uˇziteˇcn´e bude, pokud uˇzivatel bude moci zapoˇcnout taˇzen´ı prstu na ovl´adac´ım prvku, ale s t´ımto taˇzen´ım bude moci pokraˇcovat po oblasti cel´eho displeje. Nebude si muset hl´ıdat, zda se jeho prst st´ale nach´az´ı napˇr´ıklad na joysticku. Bude to tak pro nˇej mnohem pˇrirozenˇejˇs´ı. Stejnˇe tak, pokud se rozhodne posouvat hern´ı pl´an, t´ımto prstem bude moci pˇrej´ıˇzdˇet i pˇres ostatn´ı ovl´adac´ı prvky. Objekt obrazovky si tedy bude nav´ıc pamatovat, kter´e vrstvy se dan´ y dotyk poprv´e dotknul (kde zaˇcalo taˇzen´ı prstu). Informace o tomto dotyku se potom budou pos´ılat d´al uˇz jen t´eto zvolen´e vrstvˇe. Vrstvy nakl´ apˇ en´ı Tˇret´ım typem vrstev jsou komponenty, kter´e maj´ı za u ´kol zpracov´avat vstup z pohybov´eho senzoru. I kdyˇz toto asi nebude nejˇcastˇeji vyuˇz´ıvan´a funkcionalita, umoˇzn´ı to alespoˇ n oddˇelit logiku zpracov´avaj´ıc´ı nakl´apˇen´ı telefonu mimo bˇeˇznou aktualizaˇcn´ı metodu, stejnˇe tak, jako se to dˇelalo u ostatn´ıch typ˚ u vrstev. Na naklopen´ı telefonu bude moci na jedn´e obrazovce opˇet reagovat i v´ıce komponent. Bude se tak moci urˇcovat u ´hel naklonˇen´ı kamery, i napˇr´ıklad specifick´e pozice ovl´adac´ıch prvk˚ u.
2.2
Zpracov´ an´ı uˇ zivatelsk´ eho vstupu
Na zaˇca´tku kaˇzd´eho vykreslovan´eho sn´ımku se nejdˇr´ıve zjist´ı aktu´aln´ı vstup, ten se pˇred´a jednotliv´ ym vrstv´am na zobrazen´e obrazovce. Kaˇzd´a vrstva si ho bude moci zpracovat. Urˇcitˇe se bude hodit, aby tyto vrstvy mˇely nˇejakou moˇznost spolu jednoduˇse komunikovat. Virtu´aln´ı joystick bude moci napˇr´ıklad nastavit podle sv´e pozice poloˇzku posuˇ n pohled doleva. Kamera d´ıvaj´ıc´ı se na hern´ı pl´an potom na tuto promˇennou bude reagovat sv´ ym posunut´ım.
11
Meziobjekt uˇ zivatelsk´ eho vstupu Pro tuto komunikaci mezi komponentami se bude hodit vytvoˇrit nˇejak´ y spoleˇcn´ y objekt, ve kter´em budou udrˇzov´any informace o uˇzivatelsk´em vstupu. Tento objekt se na zaˇc´atku kaˇzd´eho sm´ınku postar´a o naˇcten´ı vstupu z displeje a hodnot z akcelerometru. Tak´e poslouˇz´ı jako urˇcit´a mezivrstva ostatn´ım objekt˚ um. Bude m´ıt nˇekolik pˇripraven´ ych poloˇzek jako posuˇ n hlavn´ıho hrdinu, otoˇc kamerou apod., spolu s nˇejak´ ym doporuˇcen´ım, jak´e hodnoty by se tam mˇely ukl´adat. Jednotliv´e komponenty na dan´e obrazovce potom budou moci tyto hodnoty nastavovat, nebo na nˇe nˇejak reagovat. Takto spolu budou moci komunikovat. Pokud by program´atorovi nevyhovovala ˇz´adn´a pˇripraven´a poloˇzka, bude m´ıt k dispozici i obecnou kolekci kl´ıˇc-hodnota, do kter´e si bude moci ukl´adat jak´ekoliv hodnoty. Podpora gest Protoˇze v´ ychoz´ı podpora gest v XNA nereflektuje navrˇzenou strukturu dotykov´ ych vrstev, do tohoto objektu se bude hodit pˇridat jeˇstˇe nˇekolik poloˇzek. Sem si budou moci komponenty ukl´adat doplˇ nuj´ıc´ı informace o taˇzen´ıch prst˚ u po displeji. Bude zde podpora pro posouv´an´ı jednoho dotyku a pro dvouprst´e pinch gesto. Pro toto pouˇzit´ı byla v t´eto pr´aci navrˇzena komponenta DragDropPad, v implementaˇcn´ı ˇca´sti budou pops´any jej´ı moˇznosti a jak prob´ıh´a jej´ı komunikace s komponentami kamer. Akcelerometr Jak jiˇz bylo ˇreˇceno, objekt uˇzivatelsk´eho vstupu se bude tak´e starat o naˇcten´ı hodnot z akcelerometru. Akcelerometr, ud´avaj´ıc´ı aktu´aln´ı n´aklon zaˇr´ızen´ı, je pomˇernˇe nepˇresn´a souˇca´stka. I kdyˇz je telefon poloˇzen nehybnˇe na rovn´em stole, ˇcten´e hodnoty st´ale kol´ısaj´ı. Tento objekt by se tedy mˇel postarat o pˇredzpracov´an´ı a vyˇciˇstˇen´ı tohoto vstupu, aby si to nemusely ˇreˇsit jednotliv´e komponenty po sv´em. ˇ stˇ Ciˇ en´ı zaˇ sumˇ en´ eho vstupu Byla zvolena varianta, kdy lze volitelnˇe zadat poˇcet posledn´ıch namˇeˇren´ ych hodnot, nad kter´ ymi se provede aritmetick´ y pr˚ umˇer. Ve v´ ychoz´ım stavu prob´ıh´a ˇcten´ı hodnot z akcelerometru kaˇzd´e 2 milisekundy. Byl zvolen obdobn´ y zp˚ usob, jako v ˇcl´anku [9].
12
Na posledn´ıch 10 mˇeˇren´ ych hodnot se provedl aritmetick´ y pr˚ umˇer. K tomu bylo jeˇstˇe pˇrid´ano pravidlo, aby se ignorovaly mal´e zmˇeny hodnot (do +-1.5%). Praktick´ y test na zaˇr´ızen´ıch (Samsung Omnia 7, HTC Trophy [12]) uk´azal dostateˇcnˇe pˇresn´e chov´an´ı, vhodn´e bez probl´em˚ u pro pouˇzit´ı ve hr´ach. Pro ˇcten´ı dat ze senzoru byla pouˇzita tˇr´ıda Accelerometer. V nov´em v´ yvojov´em SDK verze 7.1 pˇribyla jeˇstˇe druh´a moˇznost pˇr´ıstupu, pomoc´ı takzvan´eho Motion API. U telefon˚ u uveden´ ych v z´aˇr´ı 2011 (a novˇejˇs´ıch) tento zp˚ usob vyuˇz´ıv´a i vestavˇen´eho digit´aln´ıho gyroskopu. Z d˚ uvod˚ u zachov´an´ı kompatibility se starˇs´ımi zaˇr´ızen´ımi byl ale zvolen prvn´ı zmiˇ novan´ y pˇr´ıstup.
2.3
Spr´ ava objekt˚ u
Jak bylo prob´ır´ano v kapitole 1.4, hry se budou skl´adat z nˇekolik typ˚ u objekt˚ u. Ke vˇsem tˇemto objekt˚ um se budou udrˇzovat informace o jejich transformaˇcn´ı matici, osvˇetlen´ı, polopr˚ uhlednosti nebo st´ınech. Vˇsechny objekty budou m´ıt pˇripravenou metodu pro vykreslen´ı na sc´enu, nebo pro vykreslen´ı jejich st´ın˚ u. Transformace objekt˚ u Kaˇzd´ y objekt si pamatuje sv´e um´ıstˇen´ı na hern´ım pl´anu v transformaˇcn´ı matici. Lze mu ale nastavovat i jednotliv´e poloˇzky - pozici v trojrozmˇern´em prostoru, pootoˇcen´ı, zkosen´ı ve vˇsech os´ach, pˇr´ıpadnˇe mˇeˇr´ıtko. Transformaˇcn´ı matice je potom urˇcena jako v´ ysledek n´asoben´ı matic odvozen´ ych z tˇechto hodnot:
transf ormsM = scaleM × shearM × rotationM × translationM ;
(2.1)
Pootoˇcen´ı objektu je internˇe reprezentov´ano pomoc´ı quaternionu [15]. Lze tak jednoduˇse ovlivˇ novat rotaci objektu podle dan´ ych os, aniˇz by nastal probl´em zvan´ y gimbal lock [22]. Jsou pˇripraven´e ale i metody pro pˇrevod t´eto hodnoty do vektoru Eulerov´ ych u ´hl˚ u a zpˇet (ten je reprezentovan´ y tˇremi poloˇzkami – rotac´ı v ose X, Y a Z). Protoˇze v´ ysledn´a pozice transformac´ı se vztahuje k intern´ımu stˇredu objektu, i posunut´ı na urˇcitou pozici tento objekt posune tak, ˇze se na tomto bodˇe bude nal´ezat jeho stˇred. Pro nˇekter´e pˇr´ıpady se bude hodit metoda pro zarovn´an´ı objektu na dan´ y bod, podle jeho lev´eho doln´ıho zadn´ıho rohu.
13
Vykreslen´ı pohledu na sc´ enu To, z jak´eho u ´hlu vykresl´ı pohled na sc´enu, zajist´ı abstrakce kamer. Kamery budou objekty obsahuj´ıc´ı matici pohledu (view matrix) a projekˇcn´ı matici (projection matrix). Internˇe budou moci reagovat na zadan´ y uˇzivatelsk´ y vstup, podle nˇeho si pˇrepoˇc´ıt´avat tyto matice. Budou moci m´ıt implementovan´e omezen´ı pro pohyb v urˇcit´ ych os´ach, pro maxim´aln´ı naklonˇen´ı a podobnˇe. Na posun pohledu budou moci reagovat napˇr´ıklad kr´atk´ ym dojezdem. Kaˇzd´emu objektu se pro jeho vykreslen´ı bude pˇred´avat objekt kamery. V´ yvoj´aˇr bude m´ıt k dispozici nˇekolik pˇredpˇripraven´ ych objekt˚ u kamer. V t´eto pr´aci byla naimplementov´ana kamera pro strategie (pro pohled shora nebo zeˇsikma na hern´ı pl´an), FPS kamera a kamera simuluj´ıc´ı 2D pohled. V´ ysledn´ y pˇrepoˇcet pohledu na sc´enu je potom urˇcen pron´asoben´ım transformaˇcn´ı matice objektu (tak´e naz´ yvan´e world matrix) spolu s maticemi pohledu a projekce [14] f inalM = transf ormsM × viewM × projectionM
2.4
(2.2)
Spr´ avci sc´ eny
Objekty na sc´enˇe budou udrˇzov´any ve spr´avc´ıch sc´eny. Ty budou zajiˇst’ovat z´akladn´ı operace, jako jejich naˇcten´ı ze soubor˚ u, nebo n´asledn´e vykreslen´ı na displej. Tak´e budou pom´ahat odpov´ıdat na dotazy typu ”Kter´y objekt je nebl´ıˇz?”, pˇr´ıpadnˇe pom´ahat ovˇeˇrovat kolize mezi objekty. Bude na kaˇzd´em spr´avci sc´eny, do jak´ ych kolekc´ı a jak´ ym zp˚ usobem si bude tyto objekty vnitˇrnˇe uspoˇra´d´avat. Jedna hra bude moci vyuˇz´ıvat v´ıce takov´ ychto spr´avc˚ u. Jeden se bude napˇr´ıklad starat o statickou nepohyblivou geometrii, objekty si bude chytˇre rozdˇelovat podle jejich um´ıstˇen´ı (aby n´aslednˇe urychlil jejich vykreslen´ı). Druh´ y spr´avce sc´eny potom bude urˇcen´ y pro pohybuj´ıc´ı se hern´ı objekty. Hra bude moci b´ yt navrˇzena tak, ˇze napˇr´ıklad budou moci reagovat na klik´an´ı na displeji pouze objekty z jednoho konkr´etn´ıho spr´avce. Stejnˇe tak bude napˇr´ıklad moˇzn´e zvolit, ze kter´ ych spr´avc˚ u sc´eny by mˇely objekty vrhat dynamick´e st´ıny. Moˇ znosti spr´ avc˚ u sc´ eny Kaˇzd´ y spr´avce sc´eny bude umoˇzn ˇovat vykreslit vˇsechny nepr˚ uhledn´e, pˇr´ıpadnˇe polopr˚ uhledn´e objekty. Tak´e bude umoˇzn ˇovat “spl´acnout” aktu´aln´ı objekty na sc´enˇe a vykreslit je jako st´ın do urˇcit´e plochy. P˚ ujde pomoc´ı nˇeho tak´e zavolat vykreslen´ı pomocn´e geometrie (opsan´ ych orientovan´ ych kv´adr˚ u kolem objekt˚ u 14
apod.). Bude umoˇzn ˇovat vr´atit nejbliˇzˇs´ı objekt k zadan´emu paprsku, pˇr´ıpadnˇe vˇsechny s n´ım koliduj´ıc´ı objekty. Konkr´etn´ı spr´avci sc´eny budou moci pro urychlen´ı tˇechto operac´ı br´at ohled na um´ıstˇen´ı jednotliv´ ych objekt˚ u ve sc´enˇe. Budou umoˇzn ˇovat vykreslit jen aktu´alnˇe viditeln´e objekty na obrazovce. Stejnˇe tak i pˇri ovˇeˇrov´an´ı koliz´ı mezi objekty budou moci br´at ohled na svoji vnitˇrn´ı strukturu. Reprezentace sc´ eny Pro vnitˇrn´ı reprezentaci objekt˚ u v dan´em spr´avci sc´eny se d´a vyuˇz´ıt nˇekolika datov´ ych struktur. Obvykle se ve 3D grafice pouˇz´ıvaj´ı takzvan´e BSP stromy, dˇelen´ı sc´eny pomoc´ı port´al˚ u [8], nebo struktury jako octree a quadtree [11]. Prvn´ı dvˇe zmiˇ novan´e struktury maj´ı vyuˇzit´ı pˇredevˇs´ım ve specifick´em ˇz´anru FPS stˇr´ıleˇcek a vˇsude tam, kde se sc´eny skl´adaj´ı se z hodnˇe navz´ajem zakr´ yvaj´ıc´ıch se polygon˚ u. Mobiln´ı hry vˇetˇsinou budou obsahovat sp´ıˇse vˇetˇs´ı poˇcet mal´ ych objekt˚ u, na sc´enu se ˇcasto bude d´ıvat shora pohledem tˇret´ı osoby. Vyuˇzij´ı se tedy sp´ıˇse takov´e struktury, kter´e budou posuzovat cel´e objekty, ne jen jejich jednotliv´e polygony. Bude se hodit, kdyˇz hry budou moci obsahovat rozs´ahl´e levely pˇresahuj´ıc´ı velikost jedn´e obrazovky. Vykreslovat se z nich ale bude pokud moˇzno vˇzdy jen jejich viditeln´a ˇca´st. Struktury octree a quadtree naˇsi sc´enu budou dˇelit do krychl´ı (obr´azek 2.1) resp. obd´eln´ık˚ u. D´ıky nim bude moˇzn´e jednoduˇse ovˇeˇrit, se kter´ ymi koliduje pohledov´ y jehlan kamery a jak´e objekty by se tedy mˇely odeslat k vykreslen´ı. V t´eto pr´aci byl naimplementov´an spr´avce sc´eny vyuˇz´ıvaj´ıc´ı struktury octree a objekt ter´enu, internˇe vyuˇz´ıvaj´ıc´ı struktury quadtree (posuzuj´ı se tak jeho jednotliv´e polygony). Octree Spr´avce sc´eny, kter´ y se obvykle bude pouˇz´ıvat ve hr´ach pro ukl´adan´ı statick´e geometrie, bude internˇe vyuˇz´ıvat strukturu octree. Na zaˇc´atku bude m´ıt pˇripraven jeden uzel, ten bude pˇredstavovat krychli obep´ınaj´ıc´ı celou sc´enu. S kaˇzd´ ym pˇrid´an´ım dalˇs´ıho objektu do sc´eny si odkaz na nˇej pˇrid´a i do tohoto uzlu. Pokud celkov´ y poˇcet objekt˚ u v jednom uzlu pˇres´ahne urˇcitou hodnotu, tato krychle se rozdˇel´ı na 8 menˇs´ıch podkrychl´ı a do tˇechto nov´ ych uzl˚ u se popˇrehazuj´ı odkazy na tyto objekty. Pokud bude sv´ ym rozmˇerem objekt pˇresahovat rozhran´ı dvou krychl´ı, bude se moci nach´azet i ve v´ıce uzlech. Ve v´ ychoz´ım stavu bude nastaven maxim´aln´ı poˇcet objekt˚ u v jednom uzlu napˇr´ıklad na 5 kus˚ u, kaˇzd´a hra si to ale bude moci nastavit po sv´em. Bude zde jeˇstˇe omezen´ı na nejmenˇs´ı moˇznou velikost stˇeny, aby nevznikaly zbyteˇcnˇe mal´e
15
krychliˇcky. Pod tuto hodnotu se uˇz d´ale uzly nebudou dˇelit (ve v´ ychoz´ım stavu bude minim´aln´ı velikost stˇeny krychle nastavena napˇr´ıklad na 2 hern´ı jednotky). Prvotn´ı nastaven´ı velikosti nejvˇetˇs´ı krychle bude moci b´ yt urˇceno i dynamicky, objekty se pˇredem naˇctou do jin´eho pomocn´eho spr´avce sc´eny, ten vr´at´ı potˇrebnou ide´aln´ı velikost a um´ıstˇen´ı. Vykreslov´ an´ı pomoc´ı octree Pˇri vykreslov´an´ı objekt˚ u se bude proch´azet tato stromov´a struktura. Pokud se bude dan´ y uzel nach´azet cel´ y v pohledov´em jehlanu kamery, vykresl´ı se vˇsechny jeho objekty. Pokud se tam bude nach´azet jen ˇca´steˇcnˇe, posoud´ı se rekurzivnˇe vˇsech jeho osm poduzl˚ u. Kdyˇz bude dan´ y uzel u ´plnˇe mimo, bude se ignorovat. Protoˇze se dan´ y objekt bude moci nach´azet ve v´ıce uzlech najednou, bude potˇreba si d´at pozor, aby byl vykreslov´an jen jednou. Obdobnˇe bude fungovat i algoritmus pro testov´an´ı koliz´ı objekt˚ u s dan´ ym paprskem.
Obr´azek 2.1: Struktura octree, projekˇcn´ı st´ıny a st´ınov´a koleˇcka
2.5
Polopr˚ uhlednost
S t´ım, jak funguj´ı spr´avci sc´eny, tak´e souvis´ı podpora polopr˚ uhlednosti. Vykreslov´an´ı polopr˚ uhledn´ ych objekt˚ u ve 3D sc´enˇe se vˇetˇsinou mus´ı ˇreˇsit zvl´aˇst’. Pro bˇeˇzn´e nepr˚ uhledn´e objekty funguje bez probl´em˚ u posuzov´an´ı viditelnosti podle takzvan´e pamˇeti hloubky (depth bufferu) [6]. To je bitmapa o velikosti displeje, v kaˇzd´em pixelu si pamatuje, jak daleko je na t´eto pozici bod nejbliˇzˇs´ıho dosud 16
vykreslen´eho objektu. Pokud se bude cht´ıt vykreslit dalˇs´ı objekt, kter´ y se bude nach´azet za n´ım, posoud´ı se jeho pozice podle t´eto pamˇeti a pˇr´ıpadnˇe se nˇejak´a jeho ˇca´st nevykresl´ı. Tohle bude v XNA fungovat automaticky, aniˇz by se muselo nˇeco extra nastavovat. U polopr˚ uhledn´ ych objekt˚ u ale nastane probl´em, ˇze bude poˇzadov´ano, aby skrz nˇe bylo ˇca´steˇcnˇe vidˇet. Pokud by se nejdˇr´ıve vykreslil zadn´ı objekt a aˇz potom ten pˇred n´ım, vˇse by bylo v poˇra´dku. Pokud by se ale jejich poˇrad´ı prohodilo, zadn´ı objekt by opticky vystoupil dopˇredu. Bude potˇreba tedy tyto objekty nˇejak´ ym zp˚ usobem ˇradit v˚ uˇci pozici kamery. ˇ Razen´ ı objekt˚ u V kaˇzd´em spr´avci sc´eny jsou navrˇzeny oddˇelen´e metody pro vykreslov´an´ı polopr˚ uhledn´ ych a nepr˚ uhledn´ ych objekt˚ u. Obvykl´e pouˇzit´ı ve hr´ach je takov´e, ˇze se nejdˇr´ıve vykresl´ı vˇsechny nepr˚ uhledn´e objekty pomoc´ı vˇsech spr´avc˚ u sc´en. Potom se teprve zavol´a vykreslen´ı polopr˚ uhledn´ ych objekt˚ u. Ty je potˇreba seˇradit vz´ajemnˇe v˚ uˇci sobˇe napˇr´ıˇc vˇsemi spr´avci sc´en. [29] Objekty se mohou ˇradit bud’ jen podle jejich nejvzd´alenˇejˇs´ıch bod˚ u od kamery, nebo l´epe. Hlavnˇe u sloˇzitˇejˇs´ıch sc´en se n´am bude hodit modifikovan´a varianta mal´ıˇrova algoritmu (Newell Newell Sancha). [23] Modifikovan´ y mal´ıˇ r˚ uv algoritmus Objekty se v tomto algoritmu budou ˇradit v˚ uˇci sobˇe podle jejich orientovan´ ych kv´adr˚ u. Stoj´ı za to zm´ınit, ˇze ne vˇzdy takov´e setˇr´ıdˇen´ı bude v˚ ubec existovat. I za situace, ˇze kv´adry budou na sebe navz´ajem kolm´e a nebudou se spolu nijak prot´ınat, bude moci nastat pˇri urˇcit´em pohledu kamery neˇreˇsiteln´a situace, viz obr´azek 2.2. Pokud ale seˇrazen´ı bude existovat, vˇzdy se ho pokus´ı tento algoritmus naj´ıt.
Obr´azek 2.2: Neˇreˇsiteln´a situace uspoˇr´ad´an´ı orientovan´ ych kv´adr˚ u (fotografie)
17
Z kaˇzd´eho objektu se vezme 8 bod˚ u jeho orientovan´eho bounding boxu. Situace se bude posuzovat v transformovan´ ych souˇradnic´ıch do prostoru obrazovky. Hodnoty X a Y se pˇrevedou tak, aby nab´ yvaly hodnot od –1 do 1. Souˇradnice Z se bude pohybovat od 1 (bod v nekoneˇcnu), do 0 (bod na oˇrezov´e rovinˇe kamery). Tyto kv´adry se pot´e setˇr´ıd´ı podle jejich nejvzd´alenˇejˇs´ı souˇradnice Z. Vezme se nejvzd´alenˇejˇs´ı kv´adr a postupnˇe se bude testovat nˇekolika podm´ınkami v˚ uˇci vˇsem bliˇzˇs´ım. Pokud se potvrd´ı vˇzdy nˇekter´a z podm´ınek v˚ uˇci vˇsem testovan´ ym kv´adr˚ um, bude to znamenat, ˇze testovan´ y kv´adr je dobˇre um´ıstˇen´ y a m˚ uˇze se vykreslit (ˇze se nach´az´ı za vˇsemi ostatn´ımi kv´adry, nebo na jeho poˇrad´ı vykreslen´ı nez´aleˇz´ı). Pokud v˚ uˇci nˇejak´emu kv´adru jedna z podm´ınek selˇze, tento kv´adr se pˇresune na zaˇca´tek (tj. na nejvzd´alenˇejˇs´ı pozici) a oznaˇc´ı se, ˇze byl uˇz pˇresouv´an. Pokud uˇz nyn´ı probl´em nenastane, bude se moci bez probl´em˚ u vykreslit. Pokud se zjist´ı, ˇze by se nˇekter´ y kv´adr mˇel znovu pˇresouvat na zaˇca´tek, i kdyˇz byl uˇz jednou pˇresouv´an, rovnou se poˇsle na vykreslen´ı (znamen´a to, ˇze tuto situaci by algoritmus nedok´azal jinak vyˇreˇsit). Sada podm´ınek je navrˇzena od v´ ypoˇcetnˇe nejjednoduˇsˇs´ıch po ty sloˇzitˇejˇs´ı. Kv´adr b1 je testovan´ y, posuzujeme se oproti ostatn´ım kv´adr˚ um b2. Jak jiˇz bylo ˇreˇceno, pokud nˇekter´a z tˇechto podm´ınek uspˇeje, je to v poˇr´adku a m˚ uˇze se j´ıt testovat v˚ uˇci dalˇs´ımu kv´adru: 1. Nejvzd´alenˇejˇs´ı souˇradnice b2.Z je bl´ıˇz, neˇz nejbliˇzˇs´ı b1.Z 2. b1 a b2 se neprot´ınaj´ı v ose X 3. b1 a b2 se neprot´ınaj´ı v ose Y 4. Cel´ y box b1 je za boxem b2 5. Cel´ y box b2 je pˇred boxem b1 ˇ Ctvrt´ a i p´at´a podm´ınka vypad´a na prvn´ı pohled podobnˇe. Proˇc je ale potˇreba ovˇeˇrit oba pˇr´ıpady je vidˇet na obr´azku 2.3. Obˇe posledn´ı podm´ınky se ale jeˇstˇe liˇs´ı od standardn´ıho mal´ıˇrova algoritmu v tom, ˇze zat´ımco on vˇzdy posuzuje v˚ uˇci sobˇe dva polygony, zde se porovn´avaj´ı cel´e kv´adry. Porovn´ av´ an´ı um´ıstˇ en´ı kv´ adr˚ u Kv´adr se m˚ uˇze rozloˇzit na ˇsest stˇen. Podle norm´alov´eho vektoru kaˇzd´e strany se pozn´a, jestli je tato strana v˚ uˇci pohledu kamery odvr´acen´a nebo pˇrivr´acen´a. Dosazen´ım tˇr´ı bod˚ u t´eto stˇeny se urˇc´ı rovnice roviny. Pokud se do n´ı nyn´ı dosad´ı vˇsechny body druh´eho kv´adru a vˇzdy vyjde v´ ysledek > 0, bude to znamenat 18
ˇ Obr´azek 2.3: Ctvrt´ a a p´at´a podm´ınka v mal´ıˇrovˇe algoritmu (porovn´an´ı vz´ajemn´e pozice polygon˚ u v˚ uˇci pohledu kamery) u ´spˇech (vˇsechny body druh´eho kv´adru se budou nach´azet pˇred, resp. za nˇejakou stˇenou prvn´ıho). Protoˇze by mohly u pˇrilehl´ ych stˇen vznikat jeˇstˇe zaokrouhlovac´ı nepˇresnosti, bude se v t´eto rovnici m´ısto nuly porovn´avat napˇr´ıklad v˚ uˇci hodnotˇe -0.000001. Pokud ve sc´enˇe budou i nˇejak´e 2D objekty, ty budou oˇsetˇreny zvl´aˇst’ (bude se u nich uvaˇzovat jen jedna stˇena). Protoˇze se toto ˇrazen´ı bude volat pˇred vykreslov´an´ım kaˇzd´eho sn´ımku, budou se zde hodit i urˇcit´e optimalizace na u ´rovni k´odu. Potˇrebn´a pomocn´a pole by mˇela b´ yt nadeklarov´ana pˇredem na zaˇca´tku, jejich velikost by se mˇela mˇenit jen pˇri zmˇenˇe poˇctu polopr˚ uhledn´ ych objekt˚ u na sc´enˇe. Pro ˇrazen´ı kv´adr˚ u podle vzd´alenosti by zase mohlo b´ yt vyuˇzito upraven´e pole, ke kter´emu by ˇslo pˇristupovat i jako k obousmˇern´emu spojov´emu seznamu (aby se kv´adry mohly co nejrychleji vymˇen ˇovat). V´ ysledn´ y pohled na sc´enu bude vypadat napˇr´ıklad jako na obr´azku 2.4.
Obr´azek 2.4: Sc´ena s polopr˚ uhledn´ ymi objekty
19
2.6
Vylepˇ sen´ı grafick´ eho vzhledu
Bude snaha, aby 3D sc´ena vˇzdy vypadala co nejl´epe. Na pˇekn´ y vzhled objekt˚ u ve hr´ach bude m´ıt vliv pˇredevˇs´ım jejich osvˇetlen´ı. Dalˇs´ı techniky, jako napˇr´ıklad vrˇzen´e st´ıny, potom budou pˇrisp´ıvat k odliˇsen´ı jejich vz´ajemn´ ych pozic a budou pom´ahat k celkovˇe lepˇs´ı orientaci ve sc´enˇe (obr´azek 2.7). Nejlepˇs´ı metody s nejkvalitnˇejˇs´ımi v´ ysledky budou ˇcasto ale ne´ umˇernˇe n´aroˇcn´e pro pouˇzit´ı na mobiln´ıch telefonech. Bude tedy z´aleˇzet, jak´ y se zvol´ı kompromis a kter´e techniky se naimplementuj´ı. Osvˇ etlen´ı Samotn´e urˇcov´an´ı spr´avn´eho osvˇetlen´ı objekt˚ u (neboli st´ınov´an´ı, shading) [32] je uˇz v XNA pˇripraven´e. Pokud se naˇcte do projektu model, nastav´ı se mu parametry svˇetla a vykresl´ıme se, jeho odvr´acen´a ˇca´st bude automaticky tmavˇs´ı, neˇz ta bliˇzˇs´ı ke zdroji svˇetla. Stejnˇe tak pokud se budou pˇr´ımo ze hry generovat nˇejak´e vlastn´ı objekty, bude jim staˇcit jen spr´avnˇe nastavit norm´alov´e vektory pro jejich jednotliv´e vertexy. O spr´avn´e vykreslen´ı se potom v obou pˇr´ıpadech postar´a objekt typu BasicEffect. XNA internˇe pouˇz´ıv´a Blinn-Phong˚ uv osvˇetlovac´ı model [13], kter´ y dohromady kombinuje dif´ uzn´ı sloˇzku svˇetla (diffuse light) a sloˇzku odlesk˚ u (specular light). Lze si zvolit per-pixel nebo per-vertex osvˇetlen´ı, nasv´ıtit si objekt aˇz tˇremi svˇetly, nebo urˇcit parametry mlhy. Kaˇzd´ y objekt ve hˇre bude moci b´ yt nasvˇetlov´an zvl´aˇst’, jeho parametry osvˇetlen´ı budou urˇceny podle glob´aln´ıch parametr˚ u engine. Nastaven´ı tˇechto parametr˚ u ale p˚ ujde upravit i jednotliv´ ym konkr´etn´ım objekt˚ um. St´ıny Tato pr´ace se bude zab´ yvat pˇredevˇs´ım druhou kategori´ı grafick´ ych vylepˇsen´ı, tedy jak se daj´ı do sc´eny doplnit vrˇzen´e st´ıny od objekt˚ u. Toto uˇz v XNA nen´ı automaticky ˇreˇseno, pro vykreslov´an´ı st´ın˚ u existuje v 3D grafice mnoho algoritm˚ u i rozd´ıln´ ych pˇr´ıstup˚ u. Nejpˇresnˇejˇs´ı b´ yvaj´ı metody takzvan´eho fotorealistick´eho zobrazov´an´ı, kdy se tmavosti jednotliv´ ych ˇca´st´ı sc´eny posuzuj´ı vrh´an´ım paprsk˚ u (tzv. ray-casting). Tyto metody ale nejsou vhodn´e pro pouˇzit´ı ve hr´ach, kdy poˇzadujeme, aby se vˇse renderovalo v re´aln´em ˇcase. Mezi dva nejpouˇz´ıvanˇejˇs´ı zp˚ usoby vykreslov´an´ı st´ın˚ u v poˇc´ıtaˇcov´ ych hr´ach patˇr´ı metody st´ınov´ ych map (shadow maps) a st´ınov´ ych tˇeles (volume shadows). [3] Oba zp˚ usoby generuj´ı dostateˇcnˇe dobˇre vypadaj´ıc´ı st´ıny, reflektuj´ıc´ı celou sc´enu. Objekty mohou na sebe vrhat st´ıny vz´ajemnˇe, mohou se bˇehem hry i pohybovat a animovat.
20
Tyto plnˇe dynamick´e metody ale nejsou vhodn´e pro mobiln´ı pouˇzit´ı kv˚ uli jejich velk´e v´ ypoˇcetn´ı n´aroˇcnosti. Metody st´ınov´ ych tˇeles jsou velmi n´achyln´e na sloˇzitˇejˇs´ı geometrii model˚ u. Nav´ıc generuj´ı jen ostr´e st´ıny, ne nˇejak´ ym zp˚ usobem rozmazan´e. Metody st´ınov´ ych map mohou pod´avat v urˇcit´ ych pˇr´ıpadech lepˇs´ı v´ ysledky, pro jejich dobrou implementaci je ale zapotˇreb´ı ˇca´st k´odu prov´adˇet pˇr´ımo na grafick´e kartˇe. Psan´ı vlastn´ıch shader˚ u ale nen´ı pro Windows Phone v SDK 7.1 zat´ım povoleno. Mus´ı se tedy zvolit jeˇstˇe jin´a varianta. St´ınov´ a koleˇ cka V´ ypoˇcetnˇe nejjednoduˇsˇs´ı, ale pˇritom pro vˇetˇsinu her dostaˇcuj´ıc´ı, bude metoda takzvan´ ych st´ınov´ ych koleˇcek. Pod dan´ y objekt se um´ıst´ı pr˚ uhledn´ y ˇctverec, kter´emu se nastav´ı nˇejak´a textura. Vˇetˇsinou to bude nˇejak´e rozmazan´e koleˇcko, tento obsah ale bude moci b´ yt odvozen i od tvaru p˚ uvodn´ıho objektu. Kdyˇz se potom s objektem bude pohybovat, bude se s n´ım automaticky h´ ybat i jeho st´ın. Tato metoda bude vhodn´a pro vˇsechny pohybuj´ıc´ı se objekty ve hˇre. Pˇri prvotn´ım nastavov´an´ı tohoto st´ınov´eho koleˇcka mu bude zad´ano, na jak´e v´ yˇsce (pozici Y) by se mˇelo vykreslovat. Bude se taky moci zapnout, aby se zmenˇsovalo, pokud se od t´eto hladiny objekt dostateˇcnˇe v´ yˇskovˇe vzd´al´ı. V kontextu engine potom tento st´ınov´ y objekt bude ˇrazen mezi ostatn´ı polopr˚ uhledn´e objekty, bude se na nˇej vztahovat i zmiˇ novan´e ˇrazen´ı podle vzd´alenosti. Projekˇ cn´ı st´ıny Druhou metodou, dostupnou v t´eto knihovnˇe, budou takzvan´e projekˇcn´ı st´ıny na plochu, viz obr´azek 2.1. Urˇc´ı se matice, kter´a zajist´ı prom´ıtnut´ı objekt˚ u do zadan´e plochy, podle smˇeru svˇetla. Objekty ze zadan´eho spr´avce sc´eny se potom t´ımto deformovan´ ym zp˚ usobem vykresl´ı, budou m´ıt pro tuto operaci pˇripravenou upravenou vykreslovac´ı metodu. Objekty se vykresl´ı bez osvˇetlen´ı, jen ˇsedou barvou, se zadanou polopr˚ uhlednost´ı. Aby v´ ysledn´ y st´ın p˚ usobil jednolitˇe, kromˇe pamˇeti hloubky (depth bufferu) se zde vyuˇzije i stencil buffer [20]. Bude se v nˇem, jako ve speci´aln´ı pomocn´e pamˇeti, pamatovat, jestli se na dan´e m´ısto uˇz zapisovalo. St´ıny od r˚ uzn´ ych tˇeles se tedy nebudou nijak sˇc´ıtat a pˇrekr´ yvat, v pˇr´ıpadˇe, ˇze uˇz nˇekde bude nˇejak´ y st´ın, ˇsed´a barva se tam vykresl´ı jen jednou. Toto se nebude renderovat do nˇejak´e textury, ale pˇr´ımo na obrazovku. Obvykl´ y postup pˇri programov´an´ı hry bude takov´ y, ˇze se vykresl´ı vˇsechny nepr˚ uhledn´e objekty, potom se zavol´a vykreslen´ı tˇechto dynamick´ ych st´ın˚ u na plochu. N´aslednˇe se budou moci vykreslit ostatn´ı polopr˚ uhledn´e objekty. Protoˇze se pro kaˇzd´ y objekt bude volat jeho standardn´ı vykreslovac´ı metoda a
21
nav´ıc ta, pro vykreslen´ı st´ınu, vykreslen´ı sc´eny bude tedy cca dvakr´at n´aroˇcnˇejˇs´ı, neˇz bez st´ın˚ u. Nemˇelo by ale b´ yt v´ıce ovlivnˇeno vz´ajemnou pozic´ı objekt˚ u apod. V pˇr´ıpadˇe vyuˇzit´ı spr´avce sc´eny se strukturou octree se tak´e bude moci ˇcerpat i z optimalizac´ı, ˇze se budou renderovat jen st´ıny od potenci´alnˇe viditeln´ ych objekt˚ u. Stoj´ı za to pˇripomenout, ˇze tyto st´ıny tak´e nebudou rozmazan´e (budou ostr´e) a budou vˇzdy vykreslen´e do jedn´e plochy (objekty nebudou vrhat st´ıny na jin´e objekty). Tato metoda ale bude vhodn´a, stejnˇe tak jako ta pˇredchoz´ı, pro dynamick´e pohybuj´ıc´ı se objekty. Lightmapy Pro pouˇzit´ı v mobiln´ıch hr´ach bude vhodn´e naimplementovat jeˇstˇe jeden typ st´ın˚ u. Pro statick´e nepohybliv´e objekty bude moˇzn´e pˇredpoˇc´ıtat, kam by na nˇe dopadly st´ıny od ostatn´ıch objekt˚ u. St´ıny se tedy nebudou poˇc´ıtat dynamicky pˇri vykreslov´an´ı kaˇzd´eho sn´ımku, ale vypoˇc´ıtaj´ı se jen jednou na zaˇca´tku, napˇr´ıklad pˇri prvn´ım spuˇstˇen´ı hry. Vykreslov´an´ı potom nebude tˇemito v´ ypoˇcty zpomalovan´e. St´ıny tak´e bude moˇzn´e pˇripravit ve vyˇsˇs´ı kvalitˇe, bude je moˇzn´e vygenerovat i v grafick´em 3D editoru a n´aslednˇe naˇc´ıst do hry. V´ yhodou tak´e bude, ˇze pˇrekryvn´e lightmapy budou moci b´ yt v jin´em rozliˇsen´ı, neˇz samotn´e textury na objektech. Stejn´e textury budou moci b´ yt opakov´any na v´ıce objektech, jednotliv´e lightmapy k nim budou urˇceny nez´avisle. Zmˇenou jejich rozliˇsen´ı bude tak´e moˇzn´e regulovat jejich pamˇet’ovou n´aroˇcnost. Dos´ahne se t´ım, mimo jin´e, tak´e urˇcit´eho pˇr´ıjemn´eho rozmazan´eho efektu. V implementovan´e knihovnˇe bude zahrnuta podpora pro generov´an´ı lightmap do obd´eln´ık˚ u a pro kv´adry. Pˇri jejich v´ ypoˇctu bude pro kaˇzdou stˇenu takov´ehoto kv´adru urˇcena jedna textura. Do n´ı si vykresl´ı sv´e st´ıny vˇsechny objekty, kter´e je tam mohli vrhnout. Podobnˇe, jako pˇri posuzov´an´ı poˇrad´ı objekt˚ u v algoritmu polopr˚ uhlednosti, zde bude nutn´e zjistit, kter´e z tˇechto objekt˚ u se nach´azely za poˇzadovan´ ym polygonem (v˚ uˇci smˇeru svˇetla). Takov´e objekty se zanedbaj´ı, aby na dan´ y polygon nevrhaly faleˇsn´ y st´ın. Protoˇze se tyto st´ıny budou pˇredpoˇc´ıt´avat na zaˇc´atku, bude moˇzn´e si dovolit i dalˇs´ı vylepˇsen´ı vzhledu. St´ıny budou vypadat jemnˇe zapuˇstˇen´e, pokud se na texturu provede jeˇstˇe voliteln´e rozmaz´an´ı (viz obr´azky 2.5 a 2.6). Mlha Dojem hloubky m˚ uˇze sc´enˇe dodat tak´e efekt takzvan´e mlhy. Vzd´alenˇejˇs´ı ˇc´asti objekt˚ u od kamery se vyrenderuj´ı pˇrekryt´e urˇcitou barvou. V pˇr´ıpadˇe ˇcern´e barvy bude sc´ena vypadat jakoby v ˇseru (obr´azek 2.8). Tato funkcionalita je uˇz v XNA k dispozici, bude ji potˇreba jen zahrnout do kontextu ostatn´ıch ˇca´st´ı knihovny.
22
Obr´azek 2.5: Pˇredpoˇc´ıtan´e lightmapy aplikovan´e na kv´adry
Obr´azek 2.6: Lightmapa aplikovan´a na plochu (st´ın na podlaze)
23
Obr´azek 2.7: Sc´ena vykreslen´a se st´ıny (1) a bez st´ın˚ u (2). St´ıny dod´avaj´ı sc´enˇe mnohem pˇrirozenˇejˇs´ı vzhled, umoˇzn ˇuj´ı l´epe odhadovat vzd´alenosti mezi pˇredmˇety.
Obr´azek 2.8: Uk´azka efektu mlha (ˇcern´e barvy), aplikovan´eho na sc´enu
24
3. Implementace V t´eto kapitole je pops´ana konkr´etn´ı implementace knihovny, jej´ı architektura a uvedena struktura tˇr´ıd. Je zde rozvedeno, jak spolu jednotliv´e ˇca´sti komunikuj´ı. Pro implementaci knihovny byl zvolen jazyk C# 4.0 (.NET Framework 4.0) a XNA Framework verze 4.0. Vyuˇzito bylo Windows Phone SDK verze 7.1 [19].
3.1
Hierarchie projektu
Kaˇzd´a hra m˚ uˇze obsahovat nˇekolik hern´ıch obrazovek. Jedna z nich bude vˇzdy vybran´a jako aktu´alnˇe zobrazen´a. Objekt hry si tak´e udrˇzuje odkaz na objekt uˇzivatelsk´eho vstupu (viz obr´azek 3.1). Hern´ı obrazovka se m˚ uˇze skl´adat z nˇekolika vrstev (z konkr´etn´ıch komponent, napˇr´ıklad ovl´adac´ıch prvk˚ u, virtu´aln´ıho joysticku apod.). Kaˇzd´a takov´ato vrstva m˚ uˇze obsahovat nˇekolik spr´avc˚ u sc´eny, kaˇzd´ y si bude udrˇzovat svoji kolekci objekt˚ u na hern´ım pl´anu. Vrstva si tak´e drˇz´ı odkaz na objekt kamery. Odkaz na tuto kameru je pˇred´av´an konkr´etn´ım hern´ım objekt˚ u pro jejich vykreslen´ı, pˇr´ıpadnˇe do nˇekter´ ych metod dan´eho spr´avce sc´eny.
Obr´azek 3.1: Hierarchie projektu 25
Do objektu uˇzivatelsk´eho vstupu mohou zapisovat a ˇc´ıst data vˇsechny vrstvy, ˇc´ıst z nˇej hodnoty m˚ uˇze i objekt kamery. Mimo tuto z´akladn´ı hierarchii tak´e existuje objekt EngineParams, kter´ y obsahuje glob´aln´ı parametry a nastaven´ı, je dosaˇziteln´ y ze vˇsech ˇc´ast´ı knihovny. Jmenn´ e prostory projektu Projekt byl rozdˇelen do nˇekolika jmenn´ ych prostor˚ u. Hlavn´ı funkcionalita knihovny je sdruˇzena ve jmenn´em prostoru MyEngine. Zde jsou udrˇzov´any glob´aln´ı parametry sc´eny, osvˇetlen´ı a mlhy. Tak´e je zde k dispozici nˇekolik pomocn´ ych funkc´ı rozˇsiˇruj´ıc´ıch funkcionalitu XNA, kter´e mohou b´ yt uˇziteˇcn´e pro vˇsechny souˇc´asti engine. Ostatn´ı tˇr´ıdy jsou rozdˇeleny do jmenn´ ych podprostor˚ u, podle sv´eho urˇcen´ı: MyEngine.Input Zpracov´an´ı uˇzivatelsk´eho vstupu, naˇc´ıt´an´ı hodnot z akcelerometru. MyEngine.ScreenManagement Spr´ava hern´ıch obrazovek. B´azov´e objekty pro grafick´e, dotykov´e vrstvy a vrstvy nakl´apˇen´ı. Implementace konkr´etn´ıch komponent, jako virtu´aln´ıho joysticku, plochy pro zpracov´an´ı gest a pro vykreslov´an´ı hlavn´ıho menu. MyEngine.SceneManagers Spr´ava objekt˚ u ve sc´enˇe. Nach´az´ı se zde obecn´ y b´azov´ y objekt, i konkr´etn´ı implementace spr´avc˚ u sc´eny (jednoduch´ y manaˇzer a octree). V tomto jmenn´em prostoru se tak´e nach´az´ı algoritmy pro serializaci objekt˚ u ze souboru, pro jejich ˇrazen´ı pˇri polopr˚ uhlednosti a pro generov´an´ı lightmap. MyEngine.Objects Hern´ı objekty a jejich konkr´etn´ı implementace. Z´akladn´ı primitiva (kv´adry, jehlany apod.), deformovateln´a a dr´atˇen´a primitiva, objekt ter´enu, objekty vyuˇz´ıvaj´ıc´ı lightmapy. Skybox a objekt pro ukl´ad´an´ı model˚ u naˇcten´ ych z grafick´eho editoru. MyEngine.Cameras Objekty kamer, pro ovl´ad´an´ı pohledu na sc´enu. FPS kamera, kamera pro strategie, obecn´a statick´a kamera, pˇr´ıp. kamera simuluj´ıc´ı 2D pohled na obrazovce. MyEngine.Helpers Pomocn´e komponenty pro testov´an´ı her (zobrazov´an´ı FPS, lad´ıc´ıho textu)
26
3.2
Glob´ aln´ı vlastnosti engine
Glob´aln´ı parametry engine jsou sdruˇzeny v hlavn´ım jmenn´em prostoru MyEngine, ve statick´e tˇr´ıdˇe EngineParams. Je to nˇekolik poloˇzek urˇcuj´ıc´ıch vlastnosti a parametry vykreslov´an´ı. Ty jsou dostupn´e ze vˇsech ˇc´ast´ı knihovny. Program´atoˇri, stavˇej´ıc´ı nad touto knihovnou hru, mohou tak´e tyto parametry nastavovat podle sv´ ych potˇreb. Je zde uloˇzen odkaz na meziobjekt uˇzivatelsk´eho vstupu a pˇr´ıpadnˇe i na pomocn´e komponenty pro vykreslov´an´ı sn´ımkovac´ı frekvence, pˇr´ıpadnˇe lad´ıc´ıho textu. Je zde udrˇzov´an odkaz na aktu´aln´ı zobrazenou hern´ı obrazovku. D´ale se zde daj´ı nastavit grafick´e parametry, jako smˇer a polopr˚ uhlednost vrˇzen´ ych st´ın˚ u, vlastnosti svˇetla a mlhy nebo barvy vykreslovan´e pomocn´e geometrie. Z´ akladn´ı hern´ı jednotka M˚ uˇze se zde tak´e urˇcit, jak velk´a bude z´akladn´ı jednotka engine. Jej´ı hodnota ud´av´a ˇs´ıˇrku jedn´e krychle velikosti 1x1x1 v hern´ım svˇetˇe. Pokud budou vˇsechny objekty naˇcten´e z grafick´eho editoru napˇr´ıklad 20x vˇetˇs´ı, bude se moci nastavit tato z´akladn´ı jednotka tak´e na dvacetin´asobek. Podle t´eto hodnoty potom bude automaticky urˇceno rozliˇsen´ı textur lightmap, nebo napˇr´ıklad vzd´alenost vrˇzen´ ych st´ınov´ ych koleˇcek od zadan´e plochy. Parametry mal´ıˇrova algoritmu pro ˇrazen´ı polopr˚ uhledn´ ych objekt˚ u budou tak´e ovlivnˇeny touto jednotkou. Kamery na ni budou reagovat napˇr´ıklad pˇrenastaven´ım pˇredn´ı a zadn´ı oˇrezov´e plochy, nebo zmˇenou rychlosti posunu po hern´ım pl´anu. Mapov´an´ı textur na objekty tak´e nebude muset z´aviset jen na rozmˇerech objekt˚ u, bude se moci pˇrepnout na mapov´an´ı podle t´eto z´akladn´ı jednotky. Parametry svˇ etla a mlhy Pro nastaven´ı parametr˚ u svˇetla a mlhy se vyuˇz´ıvaj´ı pˇripraven´e objekty LightParams a FogParams. Svˇetlu je moˇzn´e nastavit vlastnosti jako smˇer, z´akladn´ı barvu, barvu odlesk˚ u apod. V pˇr´ıpadˇe mlhy jsou zde uloˇzeny parametry jako barva a kde mlha zaˇc´ın´a a konˇc´ı. Obˇema objekt˚ um je moˇzn´e vybrat dan´e parametry i z nˇekolika pˇredvolen´ ych nastaven´ı, jako napˇr´ıklad z hodnot typu ostr´e b´ıl´e svˇetlo, nebo veˇcern´ı soumrak. Rychlejˇ s´ı naˇ c´ıt´ an´ı obr´ azk˚ u Ve statick´e tˇr´ıdˇe Operations se nach´az´ı sada metod uˇziteˇcn´ ych pro r˚ uzn´e souˇca´sti knihovny. Je moˇzn´e k zadan´emu obd´eln´ıku vr´atit obd´eln´ık takov´e velikosti, aby jeho obˇe strany byly velikosti mocniny dvou (d´elky stran budou vˇetˇs´ı nebo rovny
27
p˚ uvodn´ım d´elk´am). To se hod´ı napˇr´ıklad pro urˇcov´an´ı velikost´ı textur lightmap. XNA na Windows Phone v urˇcit´ ych pˇr´ıpadech vyˇzaduje textury tˇechto velikost´ı, pro dosaˇzen´ı optim´aln´ıho v´ ykonu. V t´eto tˇr´ıdˇe se tak´e nach´az´ı nˇekolik metod vyuˇziteln´ ych pro ovˇeˇrov´an´ı koliz´ı, v´ıce viz kapitola 3.9. Ve tˇr´ıdˇe Operations je rovnˇeˇz pˇripravena metoda pro rychlejˇs´ı naˇc´ıt´an´ı obr´azk˚ u ze souboru. XNA na Windows Phone pˇri nahr´av´an´ı obr´azk˚ u do projektu pomoc´ı Content Pipeline konvertuje grafick´e soubory do bezkompresn´ıho form´atu. Nev´ yhodou je, ˇze se tyto pˇreveden´e soubory kop´ıruj´ı i do v´ ysledn´eho archivu, ten potom m˚ uˇze nab´ yvat velk´ ych rozmˇer˚ u. Kv˚ uli jejich datov´e velikosti je tak´e pomalejˇs´ı jejich naˇc´ıt´an´ı [27]. V t´eto metodˇe bylo naimplementov´ano pˇr´ım´e nahr´av´an´ı obr´azku ze souboru pomoc´ı streamu. Obr´azek se vyrenderuje do potˇrebn´e textury, vˇcetnˇe po´ e se takto obejde Content Pipeline, odpadnou zmiˇ lopr˚ uhlednosti. Uplnˇ novan´e nev´ yhody. Tento zp˚ usob se d´a vyuˇz´ıt napˇr´ıklad pro naˇc´ıt´an´ı hodnˇe velk´ ych obr´azk˚ u. Jako v´ ychoz´ı zp˚ usob naˇc´ıt´an´ı vˇsech obr´azk˚ u byl ale v t´eto knihovnˇe ponech´an standardn´ı pˇr´ıstup pomoc´ı Content Pipeline. Oproti tomuto ˇreˇsen´ı m´a oˇsetˇreno, ˇze naˇc´ıt´a stejn´e obr´azky ze souboru jen jednou. Ve hˇre m˚ uˇze m˚ uˇze nav´ıc existovat v´ıce Content Manager˚ u, kaˇzd´ y m˚ uˇze obsahovat nˇejakou skupinu naˇcten´ ych objekt˚ u. Stejnˇe tak i objekty z jednoho Content Manageru se mohou n´aslednˇe odnaˇc´ıtat ze sc´eny nez´avisle na ostatn´ıch.
3.3
Spr´ ava obrazovek, komponenty
Objekty t´ ykaj´ıc´ı se spr´avy obrazovek jsou sdruˇzeny ve jmenn´em prostoru MyEngine.ScreenManagement. Z´akladn´ım objektem je tˇr´ıda Screen, kter´a pˇredstavuje jednu hern´ı obrazovku. Jak jiˇz bylo zm´ınˇeno v kapitole 2.1, na kaˇzdou hern´ı obrazovku se mohou umist’ovat komponenty. V kontextu n´ami navrˇzen´ ych tˇr´ıd je dan´a komponenta objekt, kter´ y implementuje vlastnosti alespoˇ n jednoho typu vrstev. Rozhran´ı ITouchLayer pˇredepisuje vlastnosti, kter´e mus´ı obsahovat kaˇzd´a dotykov´a vrstva. Rozhran´ı ITiltLayer urˇcuje poˇzadovan´e vlastnosti vrstev nakl´apˇen´ı. Abstraktn´ı tˇr´ıda GraphicalLayer potom pˇredepisuje nutn´e vlastnosti a chov´an´ı grafick´ ych vrstev (obr´azek 3.1). Tˇr´ıda Screen je podˇedˇen´a od typu DrawableGameComponent. Objekty tohoto typu patˇr´ı ke speci´aln´ı funkcionalitˇe XNA, umoˇzn ˇuj´ı oddˇelit k´od z hlavn´ı hern´ı smyˇcky. Kaˇzdy objekt typu DrawableGameComponent obsahuje metody Initialize, Update, Draw apod., stejnˇe, jako tˇr´ıda Game1. Tyto metody jsou mu vol´any automaticky, vˇzdy po proveden´ı metod stejn´eho n´azvu v Game1. Pˇri pˇrechodu na jinou obrazovku se jen p˚ uvodn´ı obrazovka odebere z kolekce Game.Components a pˇreregistruje se tam nov´a obrazovka. 28
Obr´azek 3.2: Spr´ava obrazovek, vrstvy Komponenty na obrazovk´ ach Komponenty umist’ovan´e na obrazovky (podˇedˇen´e od GraphicalLayer, ITouchLayer nebo ITiltLayer ) uˇz nejsou typu DrawableGameComponent. Vol´an´ı jejich metod je ˇr´ızenou tˇr´ıdou Screen (podle popsan´eho chov´an´ı v kapitole 2.1), vˇcetnˇe naˇc´ıt´an´ı a odnaˇc´ıt´an´ı obsahu (jak bylo ˇreˇceno, nˇekter´e grafick´e vrstvy mohou napˇr´ıklad pˇreˇz´ıvat i mezi v´ıce obrazovkami). Kaˇzd´a grafick´a vrstva obsahuje vlastn´ı Content Manager, pomoc´ı kter´eho si naˇc´ıt´a data. Pokud m´a b´ yt tato vrstva odnaˇctena, odnaˇcte i obsah sv´eho Content Manageru a t´ım odalokuje zabran´a data. Pˇrechod na jinou obrazovku m˚ uˇze b´ yt proveden bud’ stisknut´ım hardwarov´eho tlaˇc´ıtka zpˇet (podle nastaven´e poloˇzky Screen.PreviousScreen), nebo m˚ uˇze b´ yt vyvol´an nˇekterou dotykovou vrstvou. Kaˇzd´a dotykov´a vrstva m´a moˇznost ve tˇr´ıdˇe Screen vyvolat ud´alost pˇrechodu na jinou obrazovku. To m˚ uˇze b´ yt v´ yhodn´e napˇr´ıklad u komponenty hlavn´ıho menu. Hlavn´ı menu Hlavn´ı menu je pˇripraven´a komponenta pro pˇrep´ın´an´ı mezi obrazovkami. Obsahuje vlastnosti grafick´e i dotykov´e vrstvy. Dok´aˇze vykreslit zadan´ y poˇcet poloˇzek pod sebou, spolu s logem hry (obr´azek 3.2). Poloˇzky tohoto menu mohou obsahovat obr´azek i text. Pˇri prvn´ım zobrazen´ı, nebo pˇri zmˇenˇe orientace displeje, se
29
animuj´ı. Jsou renderovan´e jako obd´eln´ıky ot´aˇcej´ıc´ı se v trojrozmˇern´em prostoru, pomoc´ı ortografick´e kamery. Poloˇzky jsou zobrazen´e ve sloupeˇcku pod sebou, lze jim nastavit z´akladn´ı parametry jako velikost okraj˚ u, celkovou ˇs´ıˇrku nebo polopr˚ uhlednost. Aby mohly poloˇzky obsahovat text i podkladov´ y obr´azek, jsou tyto dvˇe poloˇzky nejdˇr´ıve vykresleny pˇres sebe do textury. Tato textura je potom aplikov´ana na dan´ y obd´eln´ık.
Obr´azek 3.3: Komponenta hlavn´ıho menu (ve hˇre Galaxy Jet [31])
Virtu´ aln´ı joystick Virtu´aln´ı joystick je komponenta, kter´a na displej vykresluje analogovou p´aˇcku. M˚ uˇze se pomoc´ı nˇej ovl´adat pohyb nebo ot´aˇcen´ı objektu, stejnˇe tak posun a ot´aˇcen´ı kamery, nebo pˇribliˇzov´an´ı jej´ıho pohledu. Lze urˇcit, na jakou pozici na displeji se joystick vykresl´ı (do kter´eho rohu obrazovky), jakou bude m´ıt barvu, velikost, pˇr´ıpadnˇe polopr˚ uhlednost (viz obr´azek 2.5 dole). Jednotliv´e ˇc´asti joysticku (okraje, p´aˇcka) jsou sestaveny z mal´ ych troj´ uheln´ıˇck˚ u a vykreslov´any podle jejich vertex˚ u a index˚ u. Pozice p´aˇcky se urˇcuje v metodˇe HandleTouch implementovan´e z rozhran´ı ITouchLayer. Vych´ ylen´ı p´aˇcky joysticku do strany nastavuje zvolenou poloˇzku v meziobjektu pro zpracov´an´ı vstupu. Jakou konkr´etn´ı poloˇzku m´a nastavovat, se urˇcuje pˇri deklaraci joysticku. Pˇred´a se odkaz na tˇr´ırozmˇern´ y vektor (pro tyto u ´ˇcely byla vytvoˇrena jeho referenˇcn´ı verze). Tento vektor si potom mohou ˇc´ıst dalˇs´ı komponenty, napˇr´ıklad jiˇz zmiˇ novan´e kamery. 30
Komponenta DragDropPad Komponentu DragDropPad lze pouˇz´ıvat z´aroveˇ n s virtu´aln´ım joystickem, na hern´ım pl´anu bude vˇetˇsinou um´ıstˇena pod n´ım. Pom´ah´a ve zpracov´an´ı gest na displeji, ze surov´ ych dat rozpozn´av´a, kdy se t´ahnulo prstem po displeji, nebo kdy se provedlo dvouprst´e pinch gesto. Doplˇ nuje z´akladn´ı podporu gest v XNA, umoˇzn ˇuje ale detekovat gesta jen na urˇcit´e vrstvˇe. Nad touto vrstvou se mohou nach´azet dalˇs´ı pˇrekryvn´e ovl´adac´ı prvky. Pokud se bude napˇr´ıklad t´ahnout prstem po hern´ım pl´anu a z´aroveˇ n se bude druh´ ym prstem h´ ybat s ovl´adac´ım joystickem, bude na hern´ım pl´anu spr´avnˇe detekov´ano jen jednoprst´e gesto. Do objektu UserInput se takto nastav´ı poˇc´ateˇcn´ı pozice a posunut´ı prvn´ıho dotyku, pˇr´ıpadnˇe i druh´eho. Tyto hodnoty si potom zpracuje dalˇs´ı komponenta, nebo pˇr´ımo zadan´a kamera. V t´eto pr´aci byla naimplementov´ana podpora pro posouv´an´ı a zoom pohledu v objektu StrategyCamera (kamera pro zobrazen´ı pohledu jako ve strategick´ ych hr´ach, v´ıce viz kap. 3.6).
3.4
Spr´ avci sc´ eny
B´azick´ ym objektem pro vˇsechny spr´avce sc´en je abstraktn´ı tˇr´ıda GenericSceneManager. Od n´ı jsou pot´e podˇedˇen´ı konkr´etn´ı spr´avci sc´en – SimpleManager a OctreeManager. Tˇr´ıda GenericSceneManager urˇcuje, jak´e vˇsechny vlastnosti by mˇely tyto spr´avci obsahovat a jak´e metody implementovat (obr´azek 3.3). Kaˇzd´ y spr´avce obsahuje dvˇe pole solidObjects a transparentObjects, ve kter´ ych m´a uloˇzeny nepr˚ uhledn´e a polopr˚ uhledn´e objekty. Ty si m˚ uˇze ale d´ale reprezentovat i po sv´em, napˇr´ıklad rozdˇelovat do struktury Octree. Kaˇzd´ y spr´avce obsahuje metodu pro pˇrid´an´ı nov´eho objektu do kolekce a sadu metod pro vykreslen´ı objekt˚ u (nepr˚ uhledn´ ych, polopr˚ uhledn´ ych apod.). Tak´e se zde nach´az´ı metody pro ovˇeˇrov´an´ı koliz´ı objekt˚ u s koul´ı nebo s paprskem, pˇr´ıpadnˇe pro vr´acen´ı viditeln´ ych, nebo vˇsech objekt˚ u. Polopr˚ uhledn´e objekty by mˇely b´ yt vykreslov´any vˇsechny najednou, aby se mohly ˇradit podle sv´e vzd´alenosti od kamery (bylo pops´ano v kapitol´ach 2.4 a 2.5). V objektu GenericSceneManager je tedy pro nˇe pˇripraven´a statick´a metoda, do kter´e se pˇredaj´ı odkazy na vˇsechny potˇrebn´e spr´avce sc´en. Zvol´ı se typ ˇrazen´ı, jestli se m´a posuzovat jen podle jejich nejvzd´alenˇejˇs´ıch souˇradnic od kamery, nebo jestli se m´a vyuˇz´ıt kompletn´ı mal´ıˇr˚ uv algoritmus. Konkr´ etn´ı spr´ avci sc´ en Naimplementov´any byly konkr´etn´ı spr´avci sc´en SimpleManager a OctreeManager. SimpleManager je jednoduch´a ob´alka kolem z´akladn´ı funkcionality GenericSce31
neManager, objekty m´a uloˇzen´e jen v pol´ıch solidObjects a transparentObjects, d´ale si je nijak neorganizuje. Hod´ı se pro ukl´ad´an´ı pohybuj´ıc´ıch se objekt˚ u ve sc´enˇe, pˇr´ıp. jako pomocn´ y spr´avce pro dalˇs´ı kolekce. Objekty se mohou do nˇej napˇr´ıklad naˇc´ıst ze souboru, zjist´ı se jejich parametry (celkov´a velikost) a podle tˇechto parametr˚ u se pot´e postav´ı struktura Octree. OctreeManager si vnitˇrnˇe organizuje objekty podle jejich pozic a velikost´ı do uzl˚ u stromu, jak bylo pops´ano v kap. 2.4. Hod´ı se pro statickou nepohyblivou geometrii. Pro u ´ˇcely testov´an´ı hry je moˇzn´e zapnout, aby se vykreslovala vizualizace jeho struktury. Krychle, ve kter´ ych se nenach´az´ı ˇza´dn´e objekty, budou zanedb´any, vykreslov´any budou jen koncov´e uzly stromu.
Obr´azek 3.4: Spr´avce sc´eny
3.5
Implementace objekt˚ u
Jak bylo ˇreˇceno v kap. 2.3, ve sc´enˇe se budou nach´azet objekty nˇekolika typ˚ u (modely, geometrick´a primitiva vygenerovan´a knihovnou apod.). Kaˇzd´ y objekt bude obsahovat transformaˇcn´ı matici a dalˇs´ı vlastnosti, jako parametry osvˇetlen´ı, polopr˚ uhlednosti apod. Kaˇzd´ y objekt se bude moci tak´e vykreslit, pˇr´ıpadnˇe bude moci b´ yt vykreslen jeho st´ın. Z´akladn´ım b´azov´ ym typem, sdruˇzuj´ıc´ı vˇsechny tyto vlastnosti, byla zvolena abstraktn´ı tˇr´ıda GenericObject. Obsahuje veˇskerou logiku spoleˇcnou pro vˇsechny 32
objekty na hern´ım pl´anu, tj. metody pro pˇrepoˇc´ıt´av´an´ı souˇradnic, pro nastaven´ı st´ınov´eho koleˇcka apod. Obsahuje tak´e pˇr´ıznak [SerializableFromXML] znaˇc´ıc´ı, ˇze je moˇzn´e tyto objekty naˇc´ıtat ze souboru. Od GenericObject jsou podˇedˇen´e objekty ModelObject a PrimitiveObject (obr´azek 3.4). Oba obsahuj´ı nav´ıc jednu poloˇzku, odkaz na naˇcten´ y model, respektive na vygenerovan´e primitivum. Jejich vykreslovac´ı metody jsou tak´e naimplementovan´e tak, aby braly ohled na to, jestli vykresluj´ı model/primitivum. Tˇr´ıda ModelObject obsahuje jeˇstˇe poloˇzku BoneTransforms, kde jsou uloˇzeny pozice kost´ı dan´eho modelu. Tyto hodnoty je potom moˇzn´e vyuˇz´ıt napˇr´ıklad pro jeho animace.
Obr´azek 3.5: Hierarchie objekt˚ u
Skybox Od tˇr´ıdy ModelObject je jeˇstˇe podˇedˇena tˇr´ıda SkyboxObject. Do tohoto objektu se ukl´ad´a model, kter´ y pˇredstavuje skybox okolo hern´ı sc´eny. Ten se skl´ad´a z ˇsesti velk´ ych ˇctverc˚ u, pohybuje se z´aroveˇ n s kamerou. M´a pozmˇenˇenou vykreslovac´ı metodu, vykresluje se bez osvˇetlen´ı, u ´plnˇe za vˇsemi objekty. V´ ysledn´a obloha potom p˚ usob´ı tak, ˇze se nach´az´ı nekoneˇcnˇe daleko za sc´enou.
33
3.6
Generovan´ a primitiva
Objekt typu PrimitiveObject obsahuje poloˇzku PrimitiveObj. V t´e je uloˇzeno konkr´etn´ı primitivum. Primitiva jsou geometrick´e objekty vygenerovan´e pˇr´ımo knihovnou pomoc´ı vertex˚ u a index˚ u, jako napˇr´ıklad krychle, kv´adry apod. Spadaj´ı pod nˇe i pokroˇcilejˇs´ı objekty, jako napˇr´ıklad ter´en, nebo dr´atˇen´e objekty. B´azovou tˇr´ıdou pro vˇsechna primitiva je tˇr´ıda GenericPrimitive (obr´azek 3.5). Obsahuje z´akladn´ı vlastnosti kaˇzd´eho primitiva, jako jeho barvu, velikost a z n´ı odvozen´ y bounding box. Je zde moˇzn´e zadat i texturu spolu s jej´ım pˇribl´ıˇzen´ım. Lze pˇrepnout parametr st´ınov´an´ı z per-vertex na per-pixel.
Obr´azek 3.6: Hierarchie primitiv Od t´eto tˇr´ıdy potom dˇed´ı vlastnosti konkr´etn´ı objekty, napˇr´ıklad Sphere (koule) nebo Cylinder (v´alec). Z t´eto tˇr´ıdy jsou odvozen´e i cel´e dalˇs´ı skupiny objekt˚ u. GenericLightmapPrimitive zastˇreˇsuje vˇsechna primitiva, na kter´a lze aplikovat pˇredgenerovan´e lightmapy. WireframePrimitive pˇredstavuje b´azickou tˇr´ıdu pro dr´atˇen´a primitiva. Stejnˇe tak objekty odvozen´e od IDeformablePrimitive mohou m´ıt speci´aln´ı vlastnosti, jako napˇr´ıklad, ˇze je se s jejich vrcholy moˇzn´e bˇehem hry nez´avisle pohybovat.
34
Naimplementovan´ a primitiva v t´ eto knihovnˇ e: RectanglePrimitive Objekt obd´eln´ıku. Lze zvolit mapov´an´ı textury podle jeho kratˇs´ı nebo delˇs´ı strany, podle glob´aln´ıch nastaven´ ych parametr˚ u engine, nebo u ´plnˇe specificky. Obd´eln´ık je vykreslen nastojato (jeho norm´ala smˇeˇruje ve smˇeru osy Z), stˇred 0,0,0 se nach´az´ı na pr˚ useˇc´ıku jeho u ´hlopˇr´ıˇcek. Box Objekt kv´adru. Textury jsou mapov´any tak, aby u boˇcn´ıch stˇen na sebe navazovaly, horn´ı a spodn´ı stˇena je mapovan´a zvl´aˇst’. Intern´ı stˇred se nach´az´ı na pr˚ useˇc´ıku jeho tˇelesov´ ych u ´hlopˇr´ıˇcek. Cylinder Objekt v´alce, pˇr´ıpadnˇe komol´eho kuˇzelu (lze zvolit velikost polomˇeru kaˇzd´e podstavy). Lze zadat poˇcet stˇen pl´aˇstˇe. V´ ychoz´ı st´ınov´an´ı je nastaveno na per-pixel. Pyramid, Roof Objekty jehlanu a ”stˇrechy”. Sphere Objekt koule. Lze zvolit pˇresnost, z kolika stˇen se bude skl´adat. V´ ychoz´ı st´ınov´an´ı je tak´e nastaveno na per-pixel. DirectPrimitive Obecn´e primitivum, kter´emu lze zadat pˇr´ımo pole vertex˚ u, norm´al a index˚ u. Umoˇzn ˇuje takto nahr´at do hry jak´ ykoliv obecn´ y objekt. WireframeBox, WireframeSphere Dr´atˇen´a primitiva pro vykreslov´an´ı testovac´ı geometrie. Maj´ı upravenou vykreslovac´ı metodu, nemohou vrhat st´ıny. Dr´atˇen´a koule se vykresluje jako tˇri kruˇznice, kaˇzd´a okolo jedn´e osy. Lze opˇet zvolit poˇcet ˇcar, ze kter´ ych se budou skl´adat. DeformableBox, DeformableSphere Deformovateln´a primitiva. M´ısto standardn´ıho vertex bufferu pouˇz´ıvaj´ı dynamick´ y vertex buffer. Pozice jejich vrchol˚ u lze bˇehem hry mˇenit. Pro uk´azku byla naimplementov´ana metoda Deform, kter´a umoˇzn ˇuje zploˇstit krychli nebo kouli tak, aby byl zachov´an jej´ı objem. LightmapRectangle, LightmapBox, DirectLightmapPrimitive Objekty umoˇzn ˇuj´ıc´ı vyuˇzit´ı pˇredgenerovan´ ych lightmap. Jejich b´azovou tˇr´ıdou je tˇr´ıda GenericLightmapPrimitive. Maj´ı zmˇenˇen´ y vertex buffer a upravenou metodu pro vykreslov´an´ı. Ke kaˇzd´emu vertexu se neukl´ad´a jen jeho pozice, norm´ala a souˇradnice textury, ale i souˇradnice druh´e textury (t´e
35
st´ınov´e lightmapy, kterou je potom objekt potaˇzen). Vytvoˇren byl vlastn´ı typ deklarace vertex˚ u – DualTextureVertexType, kter´ y obsahuje vˇsechny tyto poloˇzky. Textura dan´e lightmapy se vypoˇc´ıt´av´a v metodˇe InitializeLightmap, pˇred´av´a se do n´ı odkaz na konkr´etn´ıho spr´avce sc´eny. Z tohoto spr´avce sc´eny jsou potom do textury vykresleny st´ıny vˇsech jeho objekt˚ u. Protoˇze pˇri vykreslov´an´ı pomoc´ı efektu DualTextureEffect se nevyhodnocuje standardn´ı st´ınov´an´ı objektu (jako u z´akladn´ıho efektu BasicEffect), je potˇreba jeˇstˇe pˇred vykreslen´ım st´ın˚ u urˇcit v´ ychoz´ı svˇetlost dan´eho polygonu. Ta se urˇc´ı podle smˇeru jeho norm´aly a podle nastaven´eho ambientn´ıho a difuzn´ıho svˇetla. Terrain Ter´en je dalˇs´ı specifick´e primitivum. Na zaˇca´tku se mu pˇred´a jeho celkov´ y rozmˇer a bitmapa s uloˇzenou v´ yˇskovou mapou. Podle n´ı se mu vygeneruje reli´ef kopc˚ uau ´dol´ı. Poˇcet troj´ uheln´ıˇck˚ u, ze kter´ ych se bude skl´adat, bude urˇcen podle rozliˇsen´ı t´eto textury. Ter´en m´a pˇripraveno nˇekolik metod, umoˇzn ˇuje k zadan´emu bodu vr´atit jeho v´ yˇsku (line´arn´ı interpolac´ı mezi vrcholy jednotliv´ ych troj´ uheln´ık˚ u), podle ˇctyˇr zadan´ ych bod˚ u je moˇzn´e tak´e urˇcit pozici a naklopen´ı objektu poloˇzen´eho na toto m´ısto. Takto se mohou na ter´en pozicovat objekty, m˚ uˇze po nˇem napˇr´ıklad jezdit aut´ıˇcko a bude to vypadat pˇrirozenˇe. Cel´ y ter´en je potaˇzen jednou texturou, ta se ale m˚ uˇze opakovat (lze zvolit jej´ı mˇeˇr´ıtko, obdobnˇe jako u objektu Rectangle), viz obr´azek 4.2. Pˇri vytv´aˇren´ı je ter´en rozdˇelen na obd´eln´ıky o zadan´e maxim´aln´ı velikosti. Tyto obd´eln´ıky jsou uloˇzeny do struktury quadtree. Pˇri vykreslov´an´ı ter´enu se bere ohled na pozici kamery a vykresluj´ı se jen ty obd´eln´ıky, kter´e mohly b´ yt viditeln´e (podobnˇe jako u struktury octree, viz kap. 2.4). Oproti quadtree je zde jeˇstˇe jedna zmˇena – v pˇr´ıpadˇe, ˇze je nˇekter´a ˇc´ast ter´enu dlouh´a, ale u ´zk´a, je rozdˇelov´ana jen na poloviny, ne na ˇctvrtiny. Opˇet je moˇzn´e pro testovac´ı u ´ˇcely vykreslovat vizualizaci t´eto struktury. Konstrukce primitiv a pˇ rid´ av´ an´ı objekt˚ u na hern´ı pl´ an Kaˇzd´e primitivum se skl´ad´a z vertex˚ u a index˚ u, kter´e mu jsou urˇceny na zaˇca´tku v metodˇe ConstructPrimitive. Pˇri t´eto konstrukci primitiva se uvaˇzuj´ı objektov´e souˇradnice, tedy intern´ı souˇradnice vztahuj´ıc´ı se jen k tomuto primitivu. Samotn´e napozicov´an´ı na hern´ı pl´an je ˇreˇseno aˇz na u ´rovni objektu GenericObject, resp. PrimitiveObject. Stejnˇe tak i dalˇs´ı operace, jako napˇr´ıklad pootoˇcen´ı, zkosen´ı apod. jsou ˇreˇseny aˇz v tomto objektu.
36
Spr´avce sc´eny si udrˇzuje odkazy pr´avˇe na objekty typu GenericObject. Ty mohou internˇe obsahovat primitiva (v objektu PrimitiveObject), nebo naˇcten´e modely (v objektu ModelObject), vˇzdy ale maj´ı k dispozici stejnou sadu vlastnost´ı a metod. Vˇsem se m˚ uˇze zavolat vykreslen´ı na hern´ı pl´an (i kdyˇz si tuto metodu mohou internˇe ˇreˇsit po sv´em). Kaˇzd´ y takov´ yto objekt m˚ uˇze b´ yt do spr´avce sc´eny nahr´an dvˇema zp˚ usoby. Bud’ se postupnˇe nadeklaruje jako nov´ y objekt, napˇr´ıklad typu PrimitiveObject, a nastav´ı se mu parametry um´ıstˇen´ı na hern´ım pl´anu. Do nˇej se uloˇz´ı konkr´etn´ı primitivum, napˇr´ıklad kv´adr, v konstruktoru se mu rovnou urˇc´ı jeho parametry (rozmˇery, mapov´an´ı textury apod.). Cel´ y tento objekt se potom vloˇz´ı do dan´eho spr´avce sc´eny.
3.7
Serializace objekt˚ u ze souboru
Druh´ ym zp˚ usobem, jak lze naˇc´ıtat objekty do projektu, je jejich serializace z XML souboru. V souboru je uloˇzen jejich popis, ten se proch´az´ı a parsuje, podle nˇej se rekonstruuj´ı objekty. C´ılem bylo navrhnout toto naˇc´ıt´an´ı ze souboru co nejobecnˇeji, aby bylo co nejm´enˇe z´avisl´e na zmˇen´ach struktury engine. Pokud by se do knihovny pˇridaly nov´e funkce, nebo se nˇekter´e zmˇenily, aby se nemusel pˇrepisovat parser, pˇr´ıpadnˇe nemusela mˇenit specifikace form´atu souboru. Parsov´ an´ı pˇ res reflexi Zvolen a naimplementov´an byl obecn´ y pˇr´ıstup vyuˇz´ıvaj´ıc´ı reflexi. Soubor se proch´az´ı postupnˇe od zaˇca´tku. Jednotliv´e tagy v XML odpov´ıdaj´ı skuteˇcn´ ym n´azv˚ um tˇr´ıd v engine, vnoˇren´e tagy potom jejich vlastnostem (Property) nebo datov´ym poloˇzk´am (Field). Tyto tagy mohou obsahovat dalˇs´ı vnoˇren´e tagy, m˚ uˇze se takto rekonstruovat cel´a stromov´a struktura objekt˚ u. Prvn´ım pr˚ uchodem parser projde soubor a zjist´ı, kter´e konkr´etn´ı tˇr´ıdy by mˇel oˇcek´avat. Ke kaˇzd´emu tagu v XML souboru najde pomoc´ı reflexe odpov´ıdaj´ıc´ı tˇr´ıdu. Nejdˇr´ıv zkontroluje tagy hloubky zanoˇren´ı 1, uvaˇzuje je jen tehdy, pokud jim odpov´ıdaj´ıc´ı tˇr´ıdy obsahuj´ı atribut [SerializableFromXML]. K jejich vnoˇren´ ym tag˚ um tak´e dohled´a odpov´ıdaj´ıc´ı poloˇzky. Nalezen´e dvojice ’n´azev tagu – odpov´ıdaj´ıc´ı tˇr´ıda’ si uloˇz´ı do vyrovn´avac´ı pamˇeti. Pokud se v souboru bude nach´azet v´ıce stejn´ ych tag˚ u, nebude je nutn´e pokaˇzd´e znovu vyhled´avat. N´aslednˇe parser znovu proch´az´ı soubor a vytv´aˇr´ı odpov´ıdaj´ıc´ı objekty typu PrimitiveObject, ModelObject apod. Zanoˇruje se do struktury a vytv´aˇr´ı vnoˇren´e objekty, tˇem opˇet nastavuje vlastnosti a datov´e poloˇzky.
37
XML tag tak´e m˚ uˇze obsahovat atribut Type. Ten urˇcuje konkr´etn´ı typ objektu, kter´ y se m´a na toto m´ısto vloˇzit. N´azev tagu m˚ uˇze b´ yt napˇr´ıklad PrimitiveObj. Pomoc´ı reflexe se najde, ˇze tato poloˇzka je typu GenericPrimitive. V atributu XML tagu uˇz bude ale urˇceno konkr´etn´ı primitivum, kter´e od tˇr´ıdy GenericPrimitive dˇed´ı. Napˇr´ıklad LightmapRectangle (viz pˇriloˇzen´ y k´od). Vytvoˇren potom bude tento konkr´etn´ı objekt.
<E u l e r R o t a t i o n> <X>1 . 5 7 0 8 t r u e f a l s e f a l s e <S i z e> <X>9 7 Content \ GameTextures \ t e x 1 4 4 5
Rekonstrukce objekt˚ u Takto se podle XML souboru zinicializuj´ı vˇsechny objekty a naˇctou se jejich potˇrebn´e parametry. Podle tˇechto parametr˚ u je ale bude potˇreba jeˇstˇe ’oˇzivit’. Kaˇzd´emu konkr´etn´ımu primitivu se zavol´a metoda ConstructPrimitive, kter´a zajist´ı vygenerov´an´ı spr´avn´ ych pozic vertex˚ u a index˚ u. N´aslednˇe se jeho rodiˇcovsk´emu objektu PrimitiveObject nastav´ı bounding box a bounding sphere, pˇr´ıpadnˇe zinicializuj´ı dalˇs´ı parametry. Obdobnˇe se pro vˇsechny objekty typu ModelObject zavol´a naˇcten´ı jejich modelu, podle nastaven´e poloˇzky AssetName. Pokud byla nav´ıc objektu nastavena poloˇzka AlignedToPosition na true, provede se jeho zarovn´an´ı na danou pozici, podle jeho doln´ıho zadn´ıho lev´eho rohu. Pot´e, co se pˇridaj´ı vˇsechny objekty do dan´eho spr´avce sc´eny, provede se inicializace lightmap. Bude tak zaruˇceno, ˇze na sebe budou moci vrhat st´ıny vˇsechny objekty vz´ajemnˇe. 38
Tento zp˚ usob rekonstrukce objekt˚ u ze souboru nutnˇe vyˇzaduje, aby vˇsechny serializovateln´e objekty mˇely k dispozici bezparametrick´ y konstruktor. Stejnˇe tak, aby se i vˇsechny jejich poloˇzky daly vytvoˇrit bezparametricky. Nutnost rozhodov´an´ı se, kter´ y konstruktor objektu by se mˇel pouˇz´ıt, by zbyteˇcnˇe zvyˇsovala sloˇzitost parseru i z´apisu v souboru. Vˇsechny objekty tedy mus´ı b´ yt navrˇzen´e tak, aby je bylo moˇzn´e vytvoˇrit s v´ ychoz´ım nastaven´ım, potom se jim teprve nastavily parametry (a n´aslednˇe po naˇcten´ı vˇsech parametr˚ u se jim pˇr´ıpadnˇe provedla konstrukce).
3.8
Kolize objekt˚ u
Kaˇzd´ y objekt ve sc´enˇe (podˇedˇen´ y od GenericObject) obsahuje nˇekolik poloˇzek, kter´e se mohou vyuˇz´ıvat pˇri ovˇeˇrov´an´ı koliz´ı. Nach´az´ı se zde uloˇzen´ y transformovan´y bounding box (AABB) [5], neboli nejmenˇs´ı kv´adr, kter´ y obep´ın´a objekt um´ıstˇen´ y na hern´ım pl´anu. Hodnoty jeho vrchol˚ u jsou ve svˇetov´ ych souˇradnic´ıch, jeho stˇeny jsou rovnobˇeˇzn´e s osami. Obdobnˇe se zde nach´az´ı bounding sphere, nejmenˇs´ı koule obep´ınaj´ıc´ı objekt. Tak´e je transformovan´a do svˇetov´ ych souˇradnic podle transformac´ı objektu. Tˇret´ı vlastnost´ı, kterou obsahuje kaˇzd´ y objekt, je takzvan´ y orientovan´y bounding box (OBB), viz obr´azek 3.6. To je nejmenˇs´ı kv´adr obep´ınaj´ıc´ı objekt, jeho stˇeny ale mohou b´ yt pootoˇcen´e z´aroveˇ n s objektem. Tento kv´adr bude vˇzdy menˇs´ı, neˇz transformovan´ y bounding box. V t´eto knihovnˇe je reprezentovan´ y jako pole osmi bod˚ u. Vyuˇz´ıv´a se napˇr´ıklad pro posuzov´an´ı vz´ajemn´ ych pozic objekt˚ u v mal´ıˇrovˇe algoritmu.
Obr´azek 3.7: Transformovan´ y a orientovan´ y bounding box, bounding sphere
39
Naˇ c´ıt´ an´ı bounding box˚ u Generovan´ ym primitiv˚ um jsou bounding boxy a bounding sphere urˇceny pri jejich konstrukci, podle jejich zadan´ ych rozmˇer˚ u. Model˚ um je potˇreba tyto ob´alky urˇcit pˇri jejich naˇc´ıt´an´ı. V t´eto knihovnˇe je to umoˇznˇeno dvˇema zp˚ usoby. Bylo vytvoˇreno rozˇs´ıˇren´ı Content Pipeline, naps´an vlastn´ı ContentProcessor. Pokud se modelu zvol´ı Content Processor na ModelBoundingBoxProcessor, bude jeho bounding box automaticky vypoˇc´ıt´an pˇri nahr´av´an´ı do projektu. Pokud by se tento parametr u objektu zapomnˇel pˇrepnout, zavol´a se pˇr´ıpadnˇe jeˇstˇe metoda GetBoundingBox ve tˇr´ıdˇe Operations, kdy se bounding box vypoˇc´ıt´a z vertex˚ u modelu pˇr´ımo za bˇehu. Dalˇ s´ı operace Ve statick´e tˇr´ıdˇe Operations se nach´az´ı i dalˇs´ı metody vyuˇziteln´e pˇri ovˇeˇrov´an´ı koliz´ı, nebo pˇri vyb´ır´an´ı objekt˚ u. K zadan´emu dvourozmˇern´emu bodu na obrazovce lze vr´atit paprsek ve 3D prostoru. Podle zadan´eho paprsku a plochy lze vr´atit pr˚ useˇc´ık s touto plochou. Tyto metody potom mohou b´ yt vyuˇz´ıv´any ze spr´avc˚ u sc´eny. Je moˇzn´e vr´atit k zadan´emu paprsku nejbliˇzˇs´ı objekt (podle jeho bounding sphere), stejnˇe tak i vˇsechny objekty, kter´e se s dan´ ym paprskem prot´ınaj´ı. Takto byla naimplementov´ana moˇznost, aby se hern´ı objekty mohly vyb´ırat kliknut´ım na displeji. Z dan´eho spr´avce sc´eny je tak´e moˇzn´e vr´atit vˇsechny objekty, kter´e koliduj´ı s vybranou bounding sphere. Tyto metody vyuˇz´ıvaj´ı efektivnˇe vnitˇrn´ı struktury dan´ ych spr´avc˚ u sc´eny, tedy napˇr´ıklad octree. Tato sada vlastnost´ı a metod d´av´a dobrou podporu pro dalˇs´ı algoritmy. Do knihovny by se d´ale mohla doplnit moˇznost pˇresnˇejˇs´ıho v´ ybˇeru objekt˚ u podle jejich orientovan´ych bounding box˚ u, nejen podle jejich bounding sphere. Stejnˇe tak by se urˇcitˇe hodilo doplnit nˇekolik metod pom´ahaj´ıc´ıch s oˇsetˇrov´an´ım situac´ı typu ’auto jede proti zdi, mˇelo by se zastavit tˇesnˇe pˇred n´ı’.
3.9
Kamery
Jak bylo pops´ano v kapitole 2.3, objekt˚ um se bude pˇred´avat pro vykreslen´ı odkaz na vybran´ y objekt kamery. Kamerou bude kaˇzd´ y objekt podˇedˇen´ y od interface ICamera (obr´azek 3.7). Vˇzdy bude obsahovat matice pohledu a projekce, stejnˇe tak jako dalˇs´ı parametry jako pozici kamery, jej´ı smˇerov´ y vektor a kterou stranou m´ıˇr´ı nahoru. Tak´e zde bude moˇzn´e nastavit pˇredn´ı a zadn´ı oˇrezovou plochu pohledu.
40
Naimplementov´ano bylo nˇekolik konkr´etn´ıch kamer. Nejjednoduˇsˇs´ım objektem je SimpleCamera, slouˇz´ı jen jako ob´alka okolo tˇechto hodnot. Hod´ı se, pokud se objektu potˇrebuj´ı do vykreslovac´ı metody pˇredat specifick´e hodnoty a od kamery nen´ı oˇcek´avan´a ˇz´adn´a dalˇs´ı vnitˇrn´ı logika. StaticCamera uˇz obsahuje nav´ıc implementace metod Initialize a Update, a metody pro zmˇenu orientace displeje. Je podˇedˇen´a od GameComponent, to znamen´a, ˇze jej´ı metody Update a Initialize jsou j´ı vol´any automaticky. V nich si tato kamera podle nastaven´e pozice a smˇerov´ ych vektor˚ u pˇrepoˇc´ıt´av´a matice pohledu a projekce.
Obr´azek 3.8: Kamery
Vol´ an´ı kamer Obecnˇe je to navrˇzeno tak, ˇze kaˇzdou kameru dˇed´ıc´ı od GameComponent si m˚ uˇze jednoduˇse vyuˇz´ıt nˇekter´a z grafick´ ych vrstev na dan´e obrazovce. Vol´an´ı jej´ı metody Update bude prov´adˇeno aˇz na konci kaˇzd´eho sn´ımku, kdy uˇz bude pˇreˇcten´ y veˇsker´ y uˇzivatelsk´ y vstup a vˇsechny vrstvy uˇz budou m´ıt nastaven´e potˇrebn´e parametry v meziobjektu uˇzivatelsk´eho vstupu UserInput. Kamera tedy bude moci reagovat na to, ˇze m´a napˇr´ıklad v poloˇzce UserInput.RotateView nastaven´e pob´ıdnut´ı k otoˇcen´ı pohledu.
41
Dalˇ s´ı objekty kamer Dalˇs´ı naimplementovanou kamerou je objekt Screen2DCamera. Dˇed´ı od statick´e kamery StaticCamera, m´a nav´ıc upravenou metodu pro pˇrepoˇc´ıt´av´an´ı projekce. Jej´ım u ´kolem je nastavit matice pohledu tak, aby mohly b´ yt objekty ve 3D sc´enˇe jednoduˇse renderov´any na obrazovku dvourozmˇernˇe. Pouˇz´ıv´a se ortografick´ y pohled, na displej se renderuj´ı objekty s nastaven´ ymi souˇradnicemi X a Y od nuly do ˇs´ıˇrky/v´ yˇsky obrazovky (na osu Z se nebude br´at ohled). Objekt StrategyCamera StrategyCamera je nejpokroˇcilejˇs´ı naimplementovan´a kamera. Simuluje pohled na hern´ı pl´an jako ve strategi´ıch. M˚ uˇze se j´ı zvolit, jestli se m´a d´ıvat shora, z boku, na ˇsikmo, nebo napˇr´ıklad izometricky. Lze pˇrep´ınat ortografick´ y i perspektivn´ı pohled. M˚ uˇze se ot´aˇcet kolem sv´e osy a nakl´apˇet nahoru a dol˚ u. Lze omezit u ´hly, pod kter´ ymi se m˚ uˇze nakl´apˇet. M˚ uˇze tak´e sv´ ym drobn´ ym nakl´apˇen´ım reagovat na vstup z akcelerometru. Tato kamera dok´aˇze reagovat na vstup i gesta nastaven´a v objektu UserInput. S pohledem se m˚ uˇze posouvat (lze zvolit voliteln´ y dojezd kamery). Pˇribl´ıˇzen´ı kamery lze ovl´adat dvouprst´ ym gestem, i napˇr´ıklad virtu´aln´ım joystickem. Lze omezit minim´aln´ı a maxim´aln´ı pˇribl´ıˇzen´ı pohledu. Mohou se tak´e ’vyp´ınat’ jednotliv´e funkce kamery, v nˇekter´ ych hr´ach tato kamera napˇr´ıklad nemus´ı umoˇzn ˇovat ot´aˇcen´ı, jen posun a pˇribliˇzov´an´ı. Pro reprezentaci jej´ı rotace byly vyuˇzity quaterniony [15]. Kameˇre se na zaˇc´atku zad´av´a plocha, na kterou by se mˇela d´ıvat. Polomˇer ot´aˇcen´ı pohledu je urˇcen jako pr˚ useˇc´ık pohledov´eho paprsku kamery s touto plochou. Pˇri posouv´an´ı pohledu se tak´e nejdˇr´ıve zjist´ı, jak´eho bodu plochy se prst dotknul, potom se hern´ı pl´an posunuje tak, aby se vˇzdy tento bod nach´azel pod dan´ ym prstem. Obdobnˇe funguje i dvouprst´e pinch gesto pro pˇribliˇzov´an´ı pohledu, zjist´ı se projekce obou bod˚ u na danou plochu a projekce jejich posunut´ı, podle toho se urˇc´ı pˇribl´ıˇzen´ı kamery. FirstPersonCamera FirstPersonCamera je objekt pˇredstavuj´ıc´ı kameru obvyklou ve stˇr´ıleˇck´ach hran´ ych z prvn´ıho pohledu. Je s n´ı povoleno rozhl´ıˇzet se do stran, nebo pohybovat smˇerem dopˇredu. Tato kamera neumoˇzn ˇuje pˇribliˇzov´an´ı, nebo dodateˇcn´e nakl´apˇen´ı pomoc´ı pohybov´eho senzoru.
42
4. Vyuˇ zit´ı v praxi V t´eto kapitole je pops´an uk´azkov´ y projekt. Na z´avˇer jsou zhodnoceny moˇznosti t´eto knihovny a je porovn´ana s konkurenc´ı.
4.1
Uk´ azkov´ y projekt, mˇ eˇ ren´ı
Spolu s knihovnou byl k t´eto pr´aci pˇriloˇzen i projekt uk´azkov´e hry pro Windows Phone. Sest´av´a se z obrazovky hlavn´ıho menu a z pˇeti vzorov´ ych sc´en. V kaˇzd´e sc´enˇe jsou demonstrov´any jednotliv´e moˇznosti engine. Na jednotliv´ ych obrazovk´ach jsou pro uk´azku zapnut´e, nebo vypnut´e vybran´e parametry vykreslov´an´ı (napˇr´ıklad vizualizace pomocn´e geometrie). Po vˇsech sc´en´ach se lze pohybovat s kamerou, v nˇekter´ ych je moˇzn´e klikat na objekty nebo ovl´adat jejich pohyb. Octree V t´eto sc´enˇe je demonstrov´an spr´avce sc´eny vyuˇz´ıvaj´ıc´ı strukturu octree. Je zapnuta vizualizace jej´ı struktury a vypisov´ano ˇc´ıslo, kolik objekt˚ u se aktu´alnˇe vykresluje. Sc´ena obsahuje vygenerovan´a primitiva i naˇcten´e modely (objekty raketek). Na plochu potaˇzenou texturou tr´avy je aplikov´ana lightmapa. Pod objekty koule, jehlanu a komol´eho kuˇzelu jsou vykreslov´ana st´ınov´a koleˇcka, viz obr´azek 4.1. Komol´ y kuˇzel, kter´ y se pohybuje nahoru a dol˚ u, nen´ı zahrnut do t´eto statick´e struktury. Je souˇca´st´ı druh´eho spr´avce sc´eny, konkr´etnˇe typu SimpleManager. Na plochu je vykreslov´an jeho projekˇcn´ı st´ın. Prav´ y joystick slouˇz´ı k ot´aˇcen´ı pohledu, lev´ y joystick k jeho oddalov´an´ı. Hern´ı pl´an jde posouvat t´ahnut´ım prstu, lze ho i pˇribliˇzovat dvouprst´ ym gestem. Pohled na sc´enu se nakl´ap´ı podle naklopen´ı zaˇr´ızen´ı. Na sc´enu je aplikov´ana ˇcern´a mlha, vzd´alenˇejˇs´ı objekty se tedy jev´ı tmavˇs´ı. Objekty zde nevyuˇz´ıvaj´ı polopr˚ uhlednosti. Mˇ eˇ ren´ı Pro ilustraci, na mobiln´ım telefonu Samsung Omnia 7 [12] renderov´an´ı t´eto sc´eny bˇeˇz´ı stabiln´ıch 23 FPS (sn´ımk˚ u za sekundu). Tento telefon patˇr´ı k prvn´ı generaci zaˇr´ızen´ı s operaˇcn´ım syst´emem Windows Phone, novˇejˇs´ı zaˇr´ızen´ı uˇz maj´ı v´ ykonnˇejˇs´ı grafick´ y ˇcip. Pokud se s pohledem posune tak, aby nebyly vidˇet modely raketek, rychlost vykreslov´an´ı stoupne na 42 FPS. Zvolen´ y model totiˇz obsahuje velk´e
43
mnoˇzstv´ı polygon˚ u a texturu s velk´ ym rozliˇsen´ım, pro pouˇzit´ı na mobiln´ıch telefonech nen´ı u ´plnˇe vhodn´ y. Kdyˇz se z´aroveˇ n s modely raketek vypne vykreslov´an´ı skyboxu, pˇr´ıpadnˇe projekˇcn´ıch st´ın˚ u, vykreslov´an´ı stoupne aˇz na 50 FPS. Teoretick´ ym maximem telefonu je aˇz 60 FPS, podle jeho dan´e technologie displeje.
Obr´azek 4.1: Prvn´ı uk´azkov´a sc´ena, struktura octree
Polopr˚ uhlednost Ve druh´e sc´enˇe je demonstrov´ano pouˇzit´ı polopr˚ uhlednosti, viz obr´azek 2.4. Vˇsechna primitiva maj´ı nastavenou polopr˚ uhlednost na 60%, k jejich ˇrazen´ı je vyuˇzita naimplementovan´a verze mal´ıˇrova algoritmu (viz kapitola 2.5). Na pˇr´ıkladu podlahy je uk´az´ano pouˇzit´ı objektu DirectLightmapPrimitive. To je primitivum obecn´eho tvaru, kter´e je potaˇzen´e lightmapou. Je definov´ano v´ yˇctem vertex˚ u a index˚ u. Mˇ eˇ ren´ı Na telefonu Samsung Omnia 7 se sc´ena vykresluje 36 aˇz 43 FPS (jen primitiva, bez model˚ u raketek). Rychlost z´avis´ı na aktu´aln´ım pohledu kamery. Pro porovn´an´ı, totoˇzn´a sc´ena, ale u ´plnˇe bez polopr˚ uhlednosti, je vykreslov´ana 44 FPS. Tento mal´ y rozd´ıl je d´an t´ım, ˇze prim´arn´ı z´atˇeˇz zde pˇredstavuje vykreslov´an´ı skyboxu, pˇr´ıp. ostatn´ıch objekt˚ u. Algoritmus ˇrazen´ı objekt˚ u vykreslovan´e sc´enˇe nepˇrid´av´a takovou v´ ypoˇcetn´ı n´aroˇcnost, nav´ıc je poˇc´ıt´an na procesoru, ne na grafick´e kartˇe. Zpomalen´ı 44
je kombinac´ı nutnosti pˇrekreslov´an´ı v´ıce objekt˚ u pˇres sebe a ˇcasu str´aven´eho t´ımto ˇrazen´ım. Ve vˇetˇsinˇe her ale nebudou polopr˚ uhledn´e objekty v˚ uˇci sobˇe um´ıstˇen´e tak komplexnˇe, zpomalen´ı tedy bude jeˇstˇe menˇs´ı. Lightmapy Ve tˇret´ı sc´enˇe je uk´az´ano pouˇzit´ı generovan´ ych lightmap, viz obr´azek 2.5. Naˇcten´ y model vodn´ıho rezervo´aru vrh´a st´ıny na ostatn´ı kv´adry. Tyto st´ıny se pˇredpoˇc´ıt´avaj´ı vˇzdy pˇri spuˇstˇen´ı, jejich vygenerov´an´ı trv´a na telefonu cca jednu aˇz dvˇe sekundy. Na vˇsechny tyto textury je zde nav´ıc aplikov´ano rozmaz´an´ı, zpr˚ umˇerov´an´ı hodnot ok´enkem 3x3 body. Tato sc´ena je naˇc´ıt´ana podle popisu v XML souboru level2.xml, viz kapitola 3.7. Mˇ eˇ ren´ı Na dan´em telefonu bˇeˇz´ı vykreslov´an´ı 26 FPS. Bez naˇcten´eho modelu vodn´ıho rezervo´aru se sc´ena vykresluje 29 FPS. Pokud se primitiva nahrad´ı za jejich ekvivalenty bez lightmap, rychlost vykreslov´an´ı sc´eny stoupne na 39 FPS. Primitiva a ter´ en Ve ˇctvrt´e sc´enˇe je demonstrov´an objekt ter´enu, spolu s vizualizac´ı jeho struktury quadtree, viz kapitola 3.6. Po sc´enˇe se jde opˇet pohybovat s kamerou, ˇca´sti ter´enu mimo jej´ı pohled se nevykresluj´ı. Na dan´em telefonu se zobrazen´ ym st´ınov´an´ım a zapnutou mlhou bˇeˇz´ı renderov´an´ı 34 FPS. Pˇri zobrazen´ı jen poloviny ter´enu stoupne rychlost na 46 FPS.
Obr´azek 4.2: Objekt ter´enu a vizualizace jeho struktury (quadtree)
45
Pohyb objektu V t´eto jednoduch´e sc´enˇe je uk´az´ana moˇznost ovl´ad´an´ı pohybu objekt˚ u pomoc´ı virtu´aln´ıho joysticku. Kliknut´ım lze vybrat krychli, zobraz´ı se kolem n´ı jej´ı bounding sphere. Nastaven´ım jeho pozice prav´eho joysticku lze ud´avat objektu smˇer a rychlost. S pohledem na sc´enou se m˚ uˇze libovolnˇe posouvat a pˇribliˇzovat.
4.2
Zhodnocen´ı pr´ ace, rozˇ siˇ ritelnost
Do v´ ysledn´e pr´ace se nakonec podaˇrilo naimplementovat vˇsechny poˇzadovan´e souˇc´asti. Do dalˇs´ıch verz´ı knihovny by mohla b´ yt o nˇeco rozˇs´ıˇrena podpora koliz´ı, v souˇcasn´e podobˇe z˚ ustala jen pomˇernˇe z´akladn´ı. Hodilo by se pˇripravit a dokonˇcit dalˇs´ı komponenty vyuˇziteln´e ve hr´ach, napˇr´ıklad pro vykreslen´ı seznamu level˚ u. Ohlednˇe grafick´ ych technik, vhodn´a by tak´e byla zabudovan´a podpora pro zobrazen´ı billboard˚ u (2D obr´azk˚ u, kter´e se ot´aˇc´ı za pohledem kamery). V t´eto pr´aci tak´e nebyly nijak ˇreˇseny animace model˚ u, jen byla vytvoˇrena z´akladn´ı podpora pro jejich zobrazov´an´ı. Tak´e navrˇzen´a struktura spr´avc˚ u sc´eny zat´ım nezahrnula podporu pro urˇcov´an´ı hierarchie mezi objekty, aby napˇr´ıklad otoˇcen´ı jednoho mohlo ovlivˇ novat pozici druh´eho. Vˇsechny tyto souˇca´sti by ale nemˇel b´ yt probl´em doplnit do dalˇs´ı verze. Dalˇ s´ı souˇ c´ asti her V kapitole 1.5 byly zmiˇ nov´any jeˇstˇe dalˇs´ı obvykl´e souˇca´sti her, napˇr´ıklad zobrazov´an´ı online ˇzebˇr´ıˇck˚ u, nebo vyuˇz´ıv´an´ı simulac´ı fyziky. Tyto moduly nebyly do implementovan´e knihovny pˇr´ımo zahrnuty. Bud’ je jejich podpora dostateˇcn´a uˇz pˇr´ımo v XNA Frameworku, nebo se tyto souˇc´asti daj´ı jednoduˇse vyuˇz´ıt jako dodateˇcn´e komponenty. Ve hr´ach Galaxy Jet a Ethereal Pad [31] byla pro uk´azku nˇekter´a tato dodateˇcn´a funkcionalita vyuˇzita. Obˇe hry byly postaveny nad touto knihovnou, vyuˇzily z n´ı spr´avu hern´ıch obrazovek. Pro sd´ılen´ı online sk´ore byla vyuˇzita sluˇzba mogade.com [21]. Pro pˇrehr´av´an´ı zvuk˚ u postaˇcilo v´ ychoz´ı chov´an´ı XNA Frameworku – pˇrehr´av´an´ı pomoc´ı tˇr´ıdy SoundEffect. Lokalizace hry byla provedena pomoc´ı standardn´ıch souˇca´st´ı XNA. Pro simulaci pohybu ˇca´stic byla vyuˇzita knihovna Particles Pipeline [1].
46
4.3
Porovn´ an´ı s dalˇ s´ımi knihovnami
V dobˇe zad´av´an´ı t´eto pr´ace nebyla dostupn´a ˇza´dn´a podobn´a knihovna, urˇcen´a pro Windows Phone. V XNA existovaly hern´ı 3D engine pro Xbox 360 nebo PC. Od t´e doby vzniklo nˇekolik projekt˚ u, vˇetˇsinou pr´avˇe rozˇs´ıˇren´ım tˇechto jiˇz existuj´ıc´ıch knihoven. Tato ˇreˇsen´ı, vyv´ıjen´a po mnoho let profesion´aln´ımi t´ ymy, budou urˇcitˇe nab´ızet v´ıce moˇznost´ı, neˇz zde implementovan´a knihovna. Pˇresto se ale najdou funkce a vlastnosti, kter´e bude m´ıt tato knihovna origin´aln´ı. Pro porovn´an´ı je uveden seznam nejzn´amˇejˇs´ıch aktu´alnˇe dostupn´ ych knihoven pro Windows Phone, spolu s popisem jejich hlavn´ıch rozd´ıl˚ u. SunBurn 2.0 (Synapse Gaming) 3D engine ofici´alnˇe podporovan´ y Microsoftem, s mnoha moˇznostmi. Ve verzi pro Windows Phone 7 podporuje pokroˇcil´e mapov´an´ı svˇetla na objekty, dynamick´e osvˇetlen´ı, kolize, pˇr´ıpadnˇe zdroje zvuku ve 3D sc´enˇe. Umoˇzn ˇuje z´akladn´ı post-process efekty a bloom. K dispozici je nˇekolik editor˚ u pro pozicov´an´ı objekt˚ u, ovl´ad´an´ı nastaven´ı parametr˚ u sc´eny apod. Nen´ı zn´amo, ˇze by tento engine umoˇzn ˇoval generovat nov´e objekty pˇr´ımo za bˇehu (primitiva), kromˇe ter´enu. Nen´ı zde nijak extra ˇreˇseno ˇrazen´ı objekt˚ u pˇri polopr˚ uhlednosti. Engine je zamˇeˇren pˇredevˇs´ım na grafick´e techniky, neˇreˇs´ı spr´avu obrazovek, grafick´ ych a dotykov´ ych vrstev apod. Je zpoplatnˇen $250 USD [30]. Delta Engine Multiplatformn´ı engine pro Windows Phone, Android a iOS. Nab´ız´ı ˇreˇsen´ı pro spr´avu sc´eny, vykreslov´an´ı grafiky, pˇrehr´av´an´ı multim´edi´ı. Je k nˇemu pˇriloˇzen´ ych nˇekolik uk´azkov´ ych her. Je open-source, ale aktu´alnˇe st´ale ve v´ yvoji. V pˇr´ıpadˇe z´ajmu o implementaci hry nad t´ımto engine je zat´ım nutn´e kontaktovat autory [7]. Balder 3D engine 3D engine postaven´ y nad technologi´ı Silverlight, dostupn´ y i pro Windows Phone. Je zdarma pro nekomerˇcn´ı u ´ˇcely. Jeho omezen´ı vych´az´ı z pouˇzit´e technologie, oproti knihovn´am postaven´ ym nad XNA Frameworkem jsou jeho moˇznosti omezen´e. Souˇcasn´a verze nepodporuje polopr˚ uhlednost. [4] Nova4Phone Technologick´e demo pro zobrazov´an´ı 3D grafiky. Nen´ı veˇrejnˇe dostupn´e, nenab´ız´ı dalˇs´ı funkce oˇcek´avan´e od hern´ıho engine [25].
47
Z´ avˇ er Hlavn´ım c´ılem t´eto pr´ace bylo naimplementovat sadu knihoven, kter´a program´atoˇ pˇredevˇs´ım o doplnˇen´ı funkc´ı, kter´e v r˚ um zjednoduˇs´ı pr´aci pˇri vytv´aˇren´ı her. Slo ˇcist´em XNA Frameworku nejsou dostupn´e, a o rozˇs´ıˇren´ı jeho grafick´ ych moˇznost´ı. S kaˇzd´ ym pˇrid´an´ım nov´e grafick´e techniky na sc´enu (vykreslen´ı st´ın˚ u apod.) se samozˇrejmˇe zved´a jej´ı komplexita a sniˇzuje se celkov´a vykreslovac´ı frekvence hry. Jak bylo ale uk´az´ano na vzorov´em projektu, pˇri volbˇe dostateˇcnˇe vhodn´ ych technik je moˇzn´e dos´ahnout pˇekn´ ych v´ ysledk˚ u i na nev´ ykonn´ ych mobiln´ıch telefonech. Do v´ ysledn´e pr´ace se podaˇrilo naimplementovat vˇsechny poˇzadovan´e souˇc´asti. Syst´em hierarchie hern´ıch obrazovek a grafick´ ych a dotykov´ ych vrstev byl v praxi ovˇeˇren na hˇre Galaxy Jet [31]. Zp˚ usob oddˇelen´ı k´odu jednotliv´ ych komponent a obrazovek do r˚ uzn´ ych tˇr´ıd se pˇri jej´ı implementaci osvˇedˇcil. Pˇrid´an´ı podpory alternativn´ıch zp˚ usob˚ u ovl´ad´an´ı do jiˇz hotov´e hry bylo rychl´e a bezprobl´emov´e.
48
Seznam pouˇ zit´ e literatury [1] App Hub: Particles Pipeline code sample [online]. 2010-10 [cit. 2011-12-05] [2] Apple: iPhone Premieres This Friday Night at Apple Retail Stores [online]. 2007-06 [cit. 2011-11-24] ´ Michal: Optimalizace metody st´ınov´e pamˇeti hloubky : [3] AUGUSTYN, ˇ diplomov´a pr´ace, Praha : CVUT, Fakulta elektrotechnick´a, 2008, 128 l. s. 26-29, Vedouc´ı diplomov´e pr´ace Ing. David Ambroˇz [4] Balder: 3D engine for Silverlight [online]. Verze 0.8.8.9 2010-10 [cit. 2011-1206] [5] BERGEN, Gino van den: Collision Detection in Interactive 3D Environments, 1st edition, Morgan Kaufmann : 2002-11, 277 p., p. 193–200. ISBN: 155860801X [6] DAWES, Adam.: Windows Phone 7 Game Development, 1st edition, Apress : 2010-27, 592 p., p. 219–222. ISBN: 1430233060 [7] Delta Engine: Easy & fast multiplatform development with .NET [online]. Verze 0.9.1 Beta Preview [cit. 2011-12-06] [8] EBERLY, David H.: 3D Game Engine Design, Second Edition: A Practical Approach to Real-Time Computer Graphics, 2nd edition, Morgan Kaufmann : 2006-11, 1040 p., p. 366–375. ISBN: 0122290631 [9] EDSON, Dave: Using the Accelerometer on Windows Phone 7, [online] The Windows Phone Developer Blog 2010-09-08 [cit. 2011-11-24]. [10] Farseer Physics Engine: version 3.3.1 [online]. 2011-09 [cit. 2011-11-29] [11] GROOTJANS, Riemer: XNA 3.0 Game Programming Recipes : A ProblemSolution Approach, 1st printing, Apress : 2009, 673 p., p. 88–120. ISBN: 143021855X [12] GSM Arena: Samsung i8700 Omnia 7 [online]. [cit. 2011-12-05] 49
[13] HARGREAVES, Shawn: Blog. Specularity, [online]. 2007-04-12 [cit. 2011-11-24] [14] KOCI, Roberto. World, View and Projection Matrix Unveiled, [online]. 2010-08-03 [cit. 2011-11-24] [15] LAMOTHE, Andre: Tricks of the 3D Game Programming Gurus - Advanced 3D Graphics and Rasterization, 1st printing, Sams : 2003, 1728 p., p. 317–337. ISBN: 0672318350 [16] Luma: Blog of Luma The Harvest!, [online]. 2010-03 [cit. 2011-12-07] [17] Microsoft: Silverlight, [online]. [cit. 2011-11-24] [18] Microsoft: Windows Phone [online]. Verze 7.5 [cit. 2011-11-24] [19] Microsoft: XNA Framework [online]. [cit. 2011-11-24] [20] Microsoft MSDN: How To: Draw a Shadow, [online]. XNA Game Studio 3.1 [cit. 2011-11-24] [21] Mogade: Free Solutions For Casual Game Developers [online]. [cit. 2011-1204] [22] MSDN Forums - XNA Framework: Quaternion Tutorial - BlueG [online]. 2006-12-15 [cit. 2011-11-29] [23] NEWELL, M. E. a NEWELL, R. G. a SANCHA, T. L.: A solution to the hidden surface problem, Proceedings of the ACM annual conference, 1972, Vol. 1, p. 443–450, Dostupn´e na WWW: [24] Nokia: The Nokia story [online]. [cit. 2011-11-24] [25] Nova4Phone: Nova by Vertice Team [online]. 2010-08 [cit. 2011-12-06] 50
[26] Oracle: Java for Mobile Devices [online]. [cit. 2011-11-24] [27] POZNANSKI, Jake: Speeding up XNA Content Load [online]. [cit. 2011-1203] ˇ [28] SLAV´ICEK, Tom´aˇs: Specifika platformy, Marketplace. Vyv´ıj´ıme pro Windows Phone, [online]. 2011 (2. d´ıl) [cit. 2011-11-24] ˇ [29] SLAV´ICEK, Tom´aˇs: Vykreslov´an´ı polopr˚ uhledn´ych objekt˚ u ve 3D sc´enˇe, [online]. 2010-11-21 [cit. 2011-11-24] [30] SunBurn: Game Engine, Synapse Gaming [online]. Verze 2.0 [cit. 2011-12-06] [31] Windows Phone Marketplace: aplikace Galaxy Jet, Ethereal Pad. Tom´aˇs Slav´ıˇcek, [online]. [cit. 2011-12-05] ˇ ARA, ´ [32] Z Jiˇr´ı a kolektiv autor˚ u: Modern´ı poˇc´ıtaˇcov´a grafika, 2. vyd´an´ı. Brno : Computer Press, 2004, 609 s., s. 339-342. EAN: 9788025104545
51
A. Obsah pˇ riloˇ zen´ eho CD Soubory pˇ riloˇ zen´ e na CD WP7 Game.xap Uk´azkov´ y projekt – instalaˇcn´ı bal´ıˇcek do telefonu (viz uˇzivatelsk´a dokumentace). sloˇ zka WP7 Game Zdrojov´ y k´od implementovan´e knihovny a uk´azkov´eho projektu. Pˇriloˇzen zkompilovan´ y soubor knihovny MyEngine.dll. sloˇ zka Galaxy Jet Druh´a uk´azkov´a hra – demostrace vyuˇzit´ı spr´avy obrazovek na re´aln´e hˇre. Bakal´ aˇ rsk´ a pr´ ace.pdf Soubor s bakal´aˇrskou prac´ı. Na konci je pˇriloˇzena uˇzivatelsk´a a program´atorsk´a dokumentace. Uˇ zivatelsk´ a dokumentace.pdf Extra pˇriloˇzen´ y soubor s n´avodem, jak zprovoznit vzorov´ y projekt na telefonu, pˇr´ıp. v emul´atoru. Program´ atorsk´ a dokumentace.pdf Extra pˇriloˇzen´ y soubor s popisem struktury projektu a jednotliv´ ych souˇca´st´ı hry. Tak´e je uveden n´avod, jak nad touto knihovnou lze postavit hru. sloˇ zka WP7 Game documentation Vygenerovan´a dokumentace ze zdrojov´eho k´odu (v angliˇctinˇe).
52
B. Uˇ zivatelsk´ a dokumentace Spuˇ stˇ en´ı uk´ azkov´ eho projektu na telefonu Uk´azkov´ y projekt, popsan´ y v kapitole 4.1, lze zprovoznit nˇekolika zp˚ usoby. Pro spuˇstˇen´ı hry pˇr´ımo na re´aln´em telefonu je potˇreba v´ yvoj´aˇrsky odemˇcen´e zaˇr´ızen´ı se syst´emem Windows Phone 7.5. Telefon lze odemknout na str´ank´ach App Hub [19], po zaregistrov´an´ı v´ yvoj´aˇrˇ e republiky, pro bˇeˇzn´eho v´ sk´eho u ´ˇctu. Ten si lze zaloˇzit i z Cesk´ yvoj´aˇre stoj´ı registrace $99 USD na rok, registrace studentsk´eho u ´ˇctu je zdarma. Druh´ ym zp˚ usobem, jak se d´a zaˇr´ızen´ı odemknout, je sluˇzba Chevron WP7 na str´ank´ach labs.chevronwp7.com. Zde je odemˇcen´ı zpoplatnˇeno $9 USD. Pro moˇznost nahr´av´an´ı aplikaˇcn´ıch bal´ıˇck˚ u do telefonu je d´ale si nutn´e nainstalovat v´ yvojov´e n´astroje Windows Phone SDK 7.1, opˇet ze str´anek App Hub na adrese create.msdn.com. Spolu s n´astroji se nainstaluje i v´ yvojov´e prostˇred´ı Visual Studio for Windows Phone, emul´ator telefonu a dalˇs´ı utilitky. Pro odesl´an´ı aplikace do telefonu slouˇz´ı poloˇzka Application Deployment v nab´ıdce start, ve sloˇzce Windows Phone SDK 7.1. V tomto dialogu se vybere soubor WP7 Game.xap pˇriloˇzen´ y k t´eto pr´aci, t´ım se nainstaluje dan´ y uk´azkov´ y projekt. V telefonu se bude nach´azet v seznamu aplikac´ı pod poloˇzkou WP7 Game. Spuˇ stˇ en´ı projektu pomoc´ı beta programu Druh´ ym zp˚ usobem, jak si lze odzkouˇset aplikaci na re´aln´em zaˇr´ızen´ı, je takzvan´ y beta program. Je jednoduˇsˇs´ı zp˚ usob v tom, ˇze si potenci´aln´ı uˇzivatel nemus´ı v´ yvoj´aˇrsky odemykat zaˇr´ızen´ı. Hru lze nahr´at na zkouˇsku do jak´ehokoliv telefonu, z nˇeho se potom po 90 dnech smaˇze. Pro vyuˇzit´ı tohoto pˇr´ıstupu je potˇreba kontaktovat v´ yvoj´aˇre a pˇredat mu LIVE ID u ´ˇctu, ze kter´eho by mˇela b´ yt aplikace pˇr´ıˇstupn´a. Potom probˇehne jeˇstˇe kontroln´ı schvalov´an´ı ze strany Microsoftu, do nˇekolika dn´ı by se ale mˇela aplikace na dan´em telefonu objevit. Spuˇ stˇ en´ı v emul´ atoru Pro moˇznost zkompilov´an´ı k´odu a spuˇstˇen´ı hry v emul´atoru je potˇreba m´ıt nainstalovan´e jiˇz zmiˇ novan´e v´ yvojov´e n´astroje Windows Phone SDK 7.1. K´od lze kompilovat z jak´ekoliv verze Visual Studia, tyto v´ yvojov´e n´astroje se do nˇej pˇri instalaci zaintegruj´ı. Aby vzorov´ y projekt v emul´atoru fungoval, je potˇreba m´ıt grafickou kartu
53
s podporou alespoˇ n DirectX 10 a operaˇcn´ı syst´em Windows alespoˇ n verze Vista, nebo 7 (na starˇs´ıch Windows XP emul´ator nefunguje). Pro optim´aln´ı bˇeh je potˇreba m´ıt alespoˇ n 2 GB operaˇcn´ı pamˇeti. V´ ykon emul´atoru neodpov´ıd´a pˇr´ımo v´ ykonu telefon˚ u, na poˇc´ıtaˇci vˇetˇsinou pobˇeˇz´ı hra rychleji a s vyˇsˇs´ı sn´ımkovac´ı frekvenc´ı. Aby se dalo simulovat v´ıce dotyk˚ u na displeji najednou, je tak´e potˇreba m´ıt k poˇc´ıtaˇci pˇripojen´ y monitor s podporou v´ıce dotyk˚ u. Pro zkompilov´an´ı projektu staˇc´ı otevˇr´ıt soubor WP7 Game.sln ve sloˇzce pˇriloˇzen´e k t´eto pr´aci. Solution se skl´ad´a z nˇekolika projekt˚ u, projekt MyEngine pˇredstavuje implementovanou knihovnu, v projektu WP7 Game se nach´az´ı soubory uk´azkov´eho projektu. V rozbalovac´ı paletce, nahoˇre ve Visual Studiu, se zvol´ı c´ılov´a platforma Windows Phone Emulator. Projekt se zkompiluje a spust´ı stiskem kl´avesy F5. V emul´atoru se d´a simulovat zmˇena orientace displeje, klik´an´ım na ikonky ot´aˇcen´ı v mal´e nab´ıdce napravo (objev´ı se, pokud se pˇres emul´ator pˇrejede myˇs´ı). Zde se d´a tak´e rozbalit nab´ıdka s moˇznost´ı simulace vstupu z akcelerometru.
54
C. Program´ atorsk´ a dokumentace Struktura projektu a hierarchie tˇr´ıd byla pops´ana v kapitole 3. Na CD je d´ale pˇriloˇzena vygenerovan´a program´atorsk´a dokumentace. V t´eto kapitole bude rozvedeno, z jak´ ych souˇca´st´ı se skl´ad´a hra vyuˇz´ıvaj´ıc´ı tento engine a jak s n´ım komunikuje. Na konci bude shrnuto, na co je potˇreba pamatovat pˇri portaci jiˇz existuj´ıc´ı hry nad tento engine. u: Pˇriloˇzen´ y zdrojov´ y k´od ve sloˇzce WP7 Game se skl´ad´a z tˇechto projekt˚ MyEngine Zdrojov´ y k´od implementovan´e knihovny. Nach´az´ı se zde vˇsechny souˇca´sti popisovan´e v kapitole 3. MyEngineContent Grafick´e soubory pˇribalen´e z´aroveˇ n s knihovnou. Nach´az´ı se zde v´ ychoz´ı p´ısma pro vykreslov´an´ı sn´ımkovac´ı frekvence displeje nebo lad´ıc´ıho textu. V podsloˇzce Textures se nach´az´ı v´ ychoz´ı textura st´ınov´ ych koleˇcek. WP7 Game Soubory vzorov´eho projektu, kter´ y vyuˇz´ıv´a implementovanou knihovnu. V souboru Game1.cs se nach´az´ı definice hern´ıch obrazovek a jednotliv´ ych vrstev. Sloˇzka MyGame obsahuje implementace jednotliv´ ych obrazovek se vzorov´ ymi sc´enami. Ve sloˇzce Levels se nach´az´ı XML soubory s popisem sc´eny. WP7 GameContent Grafick´e soubory pˇribalen´e ke vzorov´emu projektu. Ve sloˇzce GameTextures se nach´az´ı textury vyuˇz´ıvan´e ve sc´enˇe s lightmapami. Sloˇzka Models obsahuje modely raketky a vodn´ıho rezervo´aru. Ve sloˇzce Skybox se nach´az´ı ˇsest potˇrebn´ ych textur pro zobrazen´ı oblohy. Sloˇzka Textures obsahuje textury vyuˇz´ıvan´e v ostatn´ıch sc´en´ach, nebo v komponentˇe hlavn´ıho menu. ContentPipelineExtension Rozˇs´ıˇren´ı naˇc´ıt´an´ı model˚ u o jejich bounding boxy, viz kapitola 3.8. Jak nad engine postavit hru Jak je provedena implementace vzorov´e hry, lze vyˇc´ıst ze tˇr´ıdy Game1 v projektu WP7 Game. Tato tˇr´ıda z˚ ust´av´a prakticky pr´azdn´a, veˇsker´a konkr´etn´ı implementace je ponech´ana pro objekty jednotliv´ ych hern´ıch obrazovek. V konstruktoru Game1 je provedeno jen nˇekolik zmˇen, je pˇrepnuta rychlost zobrazov´an´ı aˇz na maxim´aln´ıch 60 sn´ımk˚ u za sekundu a nastavena barevn´a hloubka na 32 bit˚ u. Definice hern´ıch obrazovek a jednotliv´ ych vrstev je provedena v metodˇe Initialize. Vˇzdy je vytvoˇren objekt dan´e obrazovky, do nˇej jsou vloˇzeny odkazy na 55
jednotliv´e vrstvy. Je zde zinicializov´an objekt hlavn´ıho menu. M˚ uˇzou se zde tak´e zadat z´avislosti, mezi kter´ ymi obrazovkami by jak´e vrstvy mˇely mˇely pˇreˇz´ıt. Na konci metody Initialize se urˇc´ı obrazovka, kter´a by se mˇela zobrazit jako prvn´ı a pˇr´ıpadnˇe se zinicializuj´ı komponenty pro vykreslov´an´ı pomocn´eho textu. Tak´e je zde d˚ uleˇzit´e zinicializovat objekt uˇzivatelsk´eho vstupu UserInput. Implementace hern´ı obrazovky Pro konkr´etn´ı implementaci hern´ı obrazovky a n´avod, jak naˇc´ıtat hern´ı pl´an, se lze pod´ıvat napˇr´ıklad do tˇr´ıdy LightmapGamePlan ve sloˇzce MyGame. V jej´ım konstruktoru jsou nejdˇr´ıve nastaveny parametry vykreslov´an´ı glob´aln´ımu objektu EngineParams. Dan´a sc´ena obsahuje dva spr´avce sc´eny, jeden pro statick´e objekty (vyuˇz´ıvaj´ıc´ı strukturu octree) a druh´ y pro dynamick´e objekty (vyuˇz´ıvaj´ıc´ı tˇr´ıdu SimpleManager). V metodˇe LoadContent je nadefinov´an objekt kamery a do dan´ ych spr´avc˚ u sc´en jsou naˇcteny objekty. Do octree jsou serializov´any z XML souboru, do SimpleManageru jsou vloˇzeny manu´alnˇe (objekt pohybuj´ıc´ıho se komol´eho kuˇzelu). V metodˇe Update m˚ uˇze b´ yt objekt˚ um ud´av´an pohyb, je zde vytvoˇrena vzorov´a animace pohybu komol´eho kuˇzelu. Jsou zde naimplementov´any i metody HandleTouch a HandleTilt. V metodˇe andleTouch jsou zpracov´av´any dotyky na displeji, pro uk´azku je naimplementov´ana moˇznost vyb´ır´an´ı objekt˚ u klik´an´ım. V metodˇe HandleTilt je vytvoˇreno propojen´ı mezi aktu´aln´ım vstupem z akcelerometru a nakl´anˇen´ım kamery. Metoda Draw slouˇz´ı k vykreslov´an´ı sc´eny, je zde vidˇet struktura obvykl´eho vol´an´ı metod na spr´avc´ıch sc´en. Nejdˇr´ıv jsou vykresleny vˇsechny nepr˚ uhledn´e objekty, pˇr´ıpadnˇe jejich dr´atˇen´a geometrie. Jsou vykresleny statick´e objekty, pot´e dynamick´e (vˇcetnˇe projekˇcn´ıch st´ın˚ u). Na konci jsou vyrenderov´any polopr˚ uhledn´e objekty. Portace existuj´ıc´ı hry Pro vyuˇzit´ı tohoto engine v nov´em, nebo existuj´ıc´ı projektu, je potˇreba prov´est tyto kroky: • Pˇridat do projektu referenci na MyEngine.dll a na zaˇc´atek tˇr´ıdy Game1 pˇridat ˇra´dek using MyEngine; • Pˇripravit si objekt grafick´e vrstvy, ta bude um´ıstˇena na vytvoˇren´ y objekt obrazovky. Tato tˇr´ıda bude dˇedit od GraphicalLayer, pˇr´ıpadnˇe od ITouchLayer nebo ITiltLayer (pokud bude cht´ıt vyuˇz´ıvat vstup z dotykov´eho displeje nebo akcelerometru). 56
• Pokud uˇz p˚ uvodn´ı tˇr´ıda Game1 obsahovala nˇejakou hern´ı logiku, jej´ı k´od se m˚ uˇze pˇresunout do nov´eho objektu grafick´e vrstvy. Logika z metody Update, zab´ yvaj´ıc´ı se uˇzivatelsk´ ym vstupem, se m˚ uˇze oddˇelit do metod HandleTouch a HandleTilt. • Pokud p˚ uvodn´ı k´od ve tˇr´ıdˇe Game1 vyuˇz´ıval naˇc´ıt´an´ı objekt˚ u pomoc´ı Content Pipeline, nebo vyuˇz´ıval grafick´eho rozhran´ı, v nov´em objektu vrstvy je potˇreba nahradit promˇennou Content za contentManager a promˇennou GraphicsDevice za game.GraphicsDevice. Pˇr´ıpadn´e vol´an´ı this.Exit() je potˇreba nahradit za game.Exit(). • Do metody Initialize tˇr´ıdy Game1 je potˇreba pˇridat inicializaci objektu pro zpracov´an´ı uˇzivatelsk´eho vstupu: EngineParams . U s e r I n p u t = new U s e r I n p u t ( t h i s , t r u e ) ;
• V metodˇe Initialize je d´ale potˇreba vytvoˇrit nov´ y objekt Screen a do nˇej vloˇzit odkazy na vytvoˇrenou vrstvu (zde pro uk´azku pojmenovan´a GamePlan). S c r e e n gameScreen = new S c r e e n ( t h i s , ” gameScreen ” ) ; GamePlan gamePlan = new GamePlan ( t h i s ) ; gameScreen . G r a p h i c a l L a y e r s . Add( gamePlan ) ; gameScreen . TouchLayers . Add( gamePlan ) ; gameScreen . T i l t L a y e r s . Add( gamePlan ) ;
• Na konec metody Initialize je potˇreba doplnit nastaven´ı t´eto obrazovky jako aktu´aln´ı a jej´ı pˇrid´an´ı mezi hern´ı komponenty. EngineParams . A c t u a l S c r e e n = gameScreen ; Components . Add( gameScreen ) ;
• Posledn´ı vˇec, kterou je potˇreba udˇelat, je zapsat do metody Update tˇr´ıdy Game1 jeˇstˇe vol´an´ı aktualizace uˇzivatelsk´eho vstupu. EngineParams . U s e r I n p u t . U p d a t e S t a t e s ( ) ;
• Je potˇreba si zkontrolovat, ˇze na konci metody Initialize se nach´az´ı ˇra´dek pro vol´an´ı inicializaˇcn´ı metody vybran´e obrazovky: base . I n i t i a l i z e ( ) ;
• Stejnˇe tak, ˇze i v metod´ach LoadContent, UnloadContent, Update a Draw se nach´az´ı obdobn´a vol´an´ı. V t´eto chv´ıli by mˇel plnˇe fungovat syst´em spr´avy obrazovek a dan´ ych vrstev. Na kompletn´ı implementaci se lze pod´ıvat do pˇriloˇzen´eho projektu WP7 Game do souboru Game1.
57