České vysoké učení technické v Praze Fakulta elektrotechnická
Diplomová práce
Hra Dungeon Mobile pro mobilní zařízení. Bc. Václav Krejza
Vedoucí práce: Ing. Boţena Mannová Ph.D. Studijní program: Elektronika a informatika strukturovaný bakalářský Obor: Počítačová grafika leden 2011
ii
Poděkování: Tímto bych chtěl poděkovat vedoucí mé diplomové práce Ing. Boţeně Mannové Ph.D. za věcné připomínky k textu této diplomové práce. Také bych chtěl poděkovat své rodině za trpělivost a podporu při psaní této diplomové práce a také svým kamarádům, kteří mi pomohli při testování hry na svých zařízeních. iii
iv
Prohlášení: Prohlašuji, ţe jsem svou diplomovou práci vypracoval samostatně a pouţil jsem pouze podklady uvedené v přiloţeném seznamu. Nemám závaţný důvod proti uţití tohoto školního díla ve smyslu §60 Zákona č. 121/2000 SB., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Praze dne 3. 1. 2011
..................................................................................................
v
vi
Abstract This thesis deals with Dungeon Mobile game implementation, which is designed for mobile phones running Windows Mobile operating system. Application is written in C# language for mobile platforms. The game offers a possibility to use custom pictures for enemies, items and creation of custom levels. Introduction describes chosen game principles and defines goals of the thesis. Second part of thesis is aimed at analysis of available graphics and sound libraries for Windows Mobile operating system. User interface concept is described in the third part. Forth part mentions game implementation and also describes structure of the game archive. In the last part is evaluation of the thesis results and the user interface usability tests.
Abstrakt Tato diplomová práce pojednává o implementaci hry Dungeon Mobile, která je určená pro mobilní telefony s operačním systémem Windows Mobile. Aplikace je vytvořena v programovacím jazyce C# pro mobilní platformu. Hra umoţňuje tvůrcům také pouţít vlastní obrázky pro nepřátele, předměty a také vytváření zcela vlastních úrovní. Úvodní část práce popisuje zvolené principy ve hře a určuje cíle práce. Druhá část se zabývá analýzou dostupných grafických a zvukových knihoven pro operační systém Windows Mobile. Návrh uţivatelského rozhraní je popsaný v třetí části. Čtvrtá část se zabývá vlastní implementací hry a popisuje veškeré její prvky a jak je lze konfigurovat a také popisuje strukturu archivu vlastní hry. V poslední části se nachází zhodnocení výsledků celé práce a také provedení testu pouţitelnosti na navrţeném uţivatelském rozhraní aplikace.
vii
viii
Obsah 1.
2.
Úvod ................................................................................................................................... 1 1.1
Motivace....................................................................................................................... 1
1.2
Cíle ............................................................................................................................... 1
1.3
Základní popis principů hry ......................................................................................... 1
Analýza a návrh architektury ............................................................................................. 3 2.1
Analýza grafických knihoven pro Windows Mobile ................................................... 3
2.2
Analýza zvukových knihoven ...................................................................................... 6
2.3 Návrh architektury aplikace ......................................................................................... 8 2.3.1 Game API ............................................................................................................. 8 2.3.2 Grafický plugin ..................................................................................................... 9 2.3.3 Aplikace ................................................................................................................ 9 3.
4.
Návrh uţivatelského rozhraní ........................................................................................... 11 3.1
Úvodní obrazovka ...................................................................................................... 11
3.2
Výběr vlastní hry........................................................................................................ 11
3.3
Aktuální hra................................................................................................................ 12
3.4
Inventář hrdiny ........................................................................................................... 12
3.5
Dialog moţností hry ................................................................................................... 14
Implementace ................................................................................................................... 15 4.1
Cíle implementace...................................................................................................... 15
4.2
Pouţité knihovny........................................................................................................ 15
4.3 Implementace grafického rozhraní............................................................................. 15 4.3.1 IGraphicsInterface .............................................................................................. 15 4.3.2 Implementace fontů ............................................................................................ 15 4.3.3 Cachování obrázků ............................................................................................. 16 4.4
Implementace zvuku .................................................................................................. 16
4.5 Popis nejdůleţitějších částí a funkcí aplikace ............................................................ 17 4.5.1 Struktura adresáře hry ......................................................................................... 17 4.5.2 Struktura vlastní hry ........................................................................................... 18 4.5.3 Popis základních XML souborů ......................................................................... 20 4.5.4 Popis základních objektů hry .............................................................................. 21 4.6 Popis základní umělé inteligence ............................................................................... 54 4.6.1 Základní chování nepřátel................................................................................... 54 4.6.2 Třída Monster ..................................................................................................... 55 4.7 Implementace uţivatelského rozhraní aplikace ......................................................... 59 4.7.1 Implementace úvodní obrazovky........................................................................ 59 4.7.2 Implementace výběru vlastní hry........................................................................ 59 4.7.3 Implementace rozhraní ve hře ............................................................................ 60 4.7.4 Implementace inventáře ...................................................................................... 60 4.7.5 Implementace dialogu moţnosti hry................................................................... 61 4.8
Přehled základních tříd aplikace ................................................................................ 62 ix
5.
Testování .......................................................................................................................... 65 5.1
Základní testy............................................................................................................. 65
5.2 Usability test .............................................................................................................. 65 5.2.1 Cílová skupina .................................................................................................... 66 5.2.2 Sada testů ............................................................................................................ 66 5.2.3 Výsledky testů .................................................................................................... 67 5.2.4 Závěry na základě testů ...................................................................................... 68 6.
7.
Závěr ................................................................................................................................ 69 6.1
Zhodnocení ................................................................................................................ 69
6.2
Další moţnosti vylepšení ........................................................................................... 70
Literatura .......................................................................................................................... 71
Příloha A – Uţivatelská příručka ................................................................................................. 73 Příloha B – Obsah přiloţeného CD .............................................................................................. 79 Příloha C – Fyzické přílohy diplomové práce ............................................................................. 81
x
Seznam obrázků Obrázek 1: Znázornění hierarchie aplikace .................................................................................... 8 Obrázek 2: Návrh úvodní obrazovky ........................................................................................... 11 Obrázek 3: Návrh obrazovky pro výběr nové hry ........................................................................ 12 Obrázek 4: Návrh hlavní obrazovky hry ...................................................................................... 12 Obrázek 5: Návrh hlavní obrazovky inventáře hrdiny ................................................................. 13 Obrázek 6: Detailnější návrh inventáře hrdiny............................................................................. 13 Obrázek 7: Návrh dialogu moţností hry ...................................................................................... 14 Obrázek 8: Struktura adresáře nově nainstalované hry ................................................................ 17 Obrázek 9: Struktura adresáře v archivu vlastní hry .................................................................... 18 Obrázek 10: Znázornění pole viditelných objektů z pohledu hráče ............................................. 23 Obrázek 11: Zdrojový obrázek objektu One Alcove a Alcove .................................................... 26 Obrázek 12: Zdrojový obrázek objektu Altar............................................................................... 27 Obrázek 13: Zdrojový obrázek objektu Decoration ..................................................................... 28 Obrázek 14: Zdrojové obrázky objektu Door............................................................................... 29 Obrázek 15: Zdrojový obrázek objektu Wall ............................................................................... 30 Obrázek 16: Příklad zdrojového obrázku objektu FloorDecoration ............................................ 32 Obrázek 17: Příklad zdrojového obrázku objektu FloorSwitch ................................................... 33 Obrázek 18: Zdrojový obrázek objektu FluxCage ....................................................................... 34 Obrázek 19: Zdrojový obrázek objektu Fountain......................................................................... 35 Obrázek 20: Zdrojový obrázek objektu Generator ....................................................................... 36 Obrázek 21: Zdrojový obrázek objektu Launcher ........................................................................ 36 Obrázek 22: Zdrojový obrázek objektu Mirrror ........................................................................... 37 Obrázek 23: Zdrojový obrázek objektu Pillar .............................................................................. 38 Obrázek 24: Zdrojový obrázek objektu Pit .................................................................................. 39 Obrázek 25: Zdrojový obrázek objektu PowerGem ..................................................................... 40 Obrázek 26: Zdrojový obrázek objektu Sconce ........................................................................... 41 Obrázek 27: Zdrojový obrázek objektu Stairs .............................................................................. 42 Obrázek 28: Zdrojový obrázek objektu Stormbringer ................................................................. 43 Obrázek 29: Zdrojový obrázek objektu Teleport ......................................................................... 44 Obrázek 30: Příklady zdrojového obrázku objektu WallSwitch. ................................................. 45 Obrázek 31: Příklad zdrojového obrázku zámku pro objekt WallSwitch .................................... 46 Obrázek 32: Příklad zdrojového obrázku slotu pro mince objektu WallSwitch .......................... 46 Obrázek 33: Příklad pouţitého fontu textu na objektu Writing ................................................... 47 Obrázek 34: Příklad zdrojového obrázku objektu Scroll ............................................................. 50
xi
Obrázek 35: Příklad zdrojového obrázku předmětu Chest .......................................................... 50 Obrázek 36: Zdrojový obrázek objektu Chest pro pouţití v inventáři hrdiny ............................. 50 Obrázek 37: Příklad zdrojového obrázku nepřítele Mummy. ...................................................... 55 Obrázek 38: Úvodní obrazovka hry ............................................................................................. 59 Obrázek 39: Dialog výběru nové hry ........................................................................................... 60 Obrázek 40: Ukázka celého rozhraní aplikace ............................................................................. 60 Obrázek 41: Inventář hrdiny ........................................................................................................ 61 Obrázek 42: Ukázka statistik hrdiny v inventáři .......................................................................... 61 Obrázek 43: Dialog moţností hry ................................................................................................ 62 Obrázek 44: Přehled tříd aplikace ................................................................................................ 62 Obrázek 45: Ukázka usability laboratoře ..................................................................................... 66 Obrázek 46: Vstupní obrazovka hry ............................................................................................ 73 Obrázek 47: Dialog výběru hry.................................................................................................... 74 Obrázek 48: Panel pro pohyb v úrovni ........................................................................................ 74 Obrázek 49: Ukázka inventáře hrdiny ......................................................................................... 75 Obrázek 50: Panel kouzel ............................................................................................................ 75 Obrázek 51: Panel pro boj s nepřáteli .......................................................................................... 76 Obrázek 52: Panel hrdiny ............................................................................................................. 76 Obrázek 53: Rozmístění hrdinů v úrovni ..................................................................................... 76 Obrázek 54: Inventář hrdiny ........................................................................................................ 77 Obrázek 55: Statistiky hrdiny v inventáři .................................................................................... 77 Obrázek 56: Dialog pro volbu moţností hry ................................................................................ 78
xii
Seznam tabulek Tabulka 1: Srovnání grafických knihoven ..................................................................................... 4 Tabulka 2: Srovnání zvukových knihoven ..................................................................................... 7 Tabulka 3: Přehled proměnných, které obsahují statistiky hrdiny ............................................... 52 Tabulka 4: Přehled slovních názvů úrovní dovedností ................................................................ 53
xiii
xiv
Seznam použitých zkratek RPG – Role-Playing Game – hra na hrdiny XML – Extensible Markup Language – rozšiřitelný značkovací jazyk UML – Unified Modeling Language – značkovací jazyk pro vizualizaci, specifikaci a navrhování a dokumentaci programových systémů. API – Application Programming Interface – rozhraní pro programování aplikací AI – Artifical Intelligence – umělá inteligence LRU – Least Recently Used RAM – Random Access Memory UI – User Interface – uţivatelské rozhraní NPC – Non-player character – hráč ovládaný programem GPL – General Public Licence
xv
xvi
KAPITOLA 1. ÚVOD
1. Úvod 1.1
Motivace
Jako téma své diplomové práce jsem si vybral návrh a implementaci hry pro mobilní telefony s operačním systémem Windows Mobile a dotykovým displayem. Jednou z motivací je si vyzkoušet návrh a implementaci celé hry s vyuţitím dostupných knihoven pro grafiku a zvuky. Zároveň také navrhnout uţivatelské rozhraní hry a vytvořit systém, pomocí kterého bude moţné si vytvářet vlastní hry.
1.2
Cíle
Cílem diplomové práce je prozkoumat herní principy tzv. Roleplaying games (RPG) [1] a poté navrhnout a implementovat hru, která bude na těchto herních principech stavět. Konkrétně moje práce staví na herních principech hry Dungeon Master [2]. Při implementaci je kladen důraz na výběr vhodné knihovny pro grafiku a pro zvuky. Dále na zvolení vhodné architektury aplikace a vytvoření systému tak, aby šlo upravovat si vzhled úrovní, definovat si vlastní předměty hry popřípadě definovat si vlastní chování nepřátel v jednotlivých úrovních. Aplikace také má moţnost komunikovat s různými grafickými knihovnami pomoci svého rozhraní. Samozřejmostí je také implementace jednoduché inteligence nepřátel.
1.3
Základní popis principů hry
Moje implementace hry tedy vychází z principů hry Dungeon Master, jehoţ tvůrcem je jiţ neexistující firma FTL. Konkrétně tato hra patří také do kategorie D&D her [3]. Ve hře si lze zvolit aţ 4 hrdiny a s nimi pak zaţívat nejrůznější dobrodruţství. Hra je převáţně koncipována tak, ţe na hráče je předpřipraveno několik poměrně rozsáhlých úrovní, ve kterých nachází různé hádanky, unikátní předměty a také různí nepřátelé s unikátními vlastnostmi. V poslední úrovni se pak nejčastěji nachází finální nepřítel, kterého je nutné zneškodnit pomocí speciální zbraně. Po jednotlivých úrovních se nachází různé předměty, ať uţ jsou to různé zbraně, oblečení nebo speciální předměty, pomocí kterých lze i vyřešit některé hádanky. Kaţdý hrdina také můţe nést určité mnoţství předmětů. Součástí hry je také systém kouzel. RPG hry jsou známé tím, ţe kaţdý hrdina má své statistiky, které se v průběhu hraní vylepšují. Zde tomu není jinak, pouze je nelze stanovovat manuálně. Dále kaţdý hrdina má také moţnost se zlepšovat ve 4 základních dovednostech. Ty lze trénovat pouţíváním předmětů nebo kouzel.
1
2
KAPITOLA 1. ÚVOD
KAPITOLA 2. ANALÝZA A NÁVRH ARCHITEKTURY
3
2. Analýza a návrh architektury V této kapitole se budu zabývat analýzou dostupných grafických knihoven a také knihoven pro zvuk. U jednotlivých knihoven také uvedu jejich výhody a nevýhody. Jako programovací jazyk pro hru jsem zvolil programovací jazyk C# s .NET Compact Framework 3.5.
Analýza grafických knihoven pro Windows Mobile
2.1
Na trhu existuje celá řada knihoven, které jsou určené pro Windows Mobile. V této části tedy popíšu jen ty nejznámější. Pří výběru jsem také kladl důraz na to, aby splňovaly určité poţadavky na moţnosti kreslení:
Podpora dostupných verzí Windows Mobile (verze 2003 a výše)
Podpora základních funkcí kreslení a vyplňování barvou
Podpora průhlednosti (jako barva, která se pak vynechává z kreslení)
Moţnost určovat výřezy, do kterých se kreslí
Dostupná obalová třída pro C#
Knihovna
GapiDraw
PocketFrog
GDI+
WMGL
GAPI
DirectDraw
Verze
4.2
0.8.1
3.5
1.1.0
1.2
5.2
Licence
Komerční
GPL
Součást Frame worku
Volně pro neplacenou aplikaci
Součást Windows Mobile
Součást Windows Mobile
Podpora základních funkcí kreslení
ano
ano
ano
ano
ano
ano
Podpora průhlednosti
ano
ano
ano
ano
ano
ano
Obalová třída
ano
ano
Přímo v .NET
ano
ne
ne
Hardwarová akcelerace
ano
ne
ne
ano
ne
ne
Minimální verze Windows Mobile
2003
2003
2003
5.0
2003
2003
Dokumentace
dobrá
dobrá
dobrá
dobrá
dobrá
dobrá
KAPITOLA 2. ANALÝZA A NÁVRH ARCHITEKTURY
4
Tabulka 1: Srovnání grafických knihoven
GapiDraw Knihovna GapiDraw [4] patří mezi nejznámější komerční knihovny pro Windows Mobile. Podporuje nejrůznější zařízení s Windows Mobile a podle moţností hardwaru si sama volí, jaký dostupný kreslící systém zvolí a jestli pouţije i dostupnou hardwarovou akceleraci. Knihovna samozřejmě podporuje kreslení základních prvků jako čáry, obdélníky. Nechybí také podpora vyplňování oblastí s vyuţitím podpory hardwaru. Knihovna také umí pracovat s transparencí na úrovni vyplňování oblastí a v obrázcích. K dispozici je také obalová třída pro C#, která ale nepochází od výrobce, takţe neobsahuje všechny dostupné moţnosti této knihovny. Výhody:
Sama si určuje, přes co bude kreslit (DirectDraw, RawBuffer, GAPI)
Běţí na všech platformách Windows Mobile
Vyuţívá hardwarové akcelerace
Podpora průhlednosti
Podpora výřezů
Podpora vyplňování pomocí průhlednosti
Rychlé vykreslování
Dostupná obalová třída
Nevýhody:
Vysoká cena pro komerční pouţití
Obalová třída neobsahuje všechny moţnosti knihovny
PocketFrog Další knihovna PocketFrog [5] staví na grafické knihovně PocketHAL [6], která umoţňuje přímý přístup k hardwaru. Tato knihovna podporuje základní kreslení prvků, podporuje vyplňování oblastí zadanou barvou a průhledností. Pro tuto knihovnu existuje také obalová třída, kterou také nevytvořil přímo autor. Výhody:
Pro kreslení pouţívá DirectDraw
Podporuje průhlednost
Podporuje kreslení základních prvků
Podporuje výřezy
Podpora vyplňování pomocí průhlednosti
Rychlé vykreslování
KAPITOLA 2. ANALÝZA A NÁVRH ARCHITEKTURY
Dostupná obalová třída
Zdarma
Nevýhody:
Obalová třída neuvolňuje nativní prostředky
GDI+ GDI+ [7] je základní součástí instalace .NET Compact Frameworku. Podporuje kreslení základních prvků grafiky a vyplňování oblastí. Podporuje i transparenci, ale jen u obrázků a to ještě tak, ţe se musí určit barva, která se vynechá z vykreslování. Výhody:
Součást .NET Compact Frameworku
Podporuje průhlednost
Podporuje kreslení základních prvků Podporuje výřezy
Kvalitní dokumentace
Nevýhody:
Velmi pomalé vykreslování náročnější grafiky
Chybí podpora vyplňování pomocí průhlednosti
WMGL WMGL knihovna [8] vznikla jako součást projektu Touch Shell pro Windows Mobile. Tato knihovna podporuje kreslení základních prvků, vyplňování oblastí barvou i s vyuţitím hardwarové akcelerace. K dispozici je i obalová třída přímo od autorů knihovny. Výhody:
Podporuje kreslení základních prvků
Pro bezplatné aplikace zdarma
Dostupná obalová třída od autorů
Hardwarové vykreslování
Nevýhody:
Knihovna neumí načíst obrázek z paměti, pouze ze souboru
Funguje pouze na Windows Mobile 5 a novější
5
KAPITOLA 2. ANALÝZA A NÁVRH ARCHITEKTURY
6 GAPI
GAPI knihovna [9] je knihovna přímo od Microsoftu. Poskytuje pouze metodu pro přímý přístup k zobrazovacímu hardwaru a také ke klávesnici. Výhody:
Rychlý přístup k hardwaru
Přímo od výrobce a součást systému
Nevýhody:
Neexistuje kompletní obalová třída
Není jiţ podporována v novějších verzích Windows Mobile
Direct Draw Poslední knihovnou je DirectDraw [10]. Jedná se také o standardní součást systému. Na rozdíl od GDI+ je tato knihovna obsaţená v základní instalaci Windows Mobile. Výhody:
Rychlé vykreslování
Součást systému Podporuje kreslení základních prvků
Podpora průhlednosti
Nevýhody:
Neexistuje obalová třída
Z výše popsaného jsem si zvolil pro implementaci knihovnu PocketFrog a to s tím, ţe musím upravit obalovou třídu tak, aby mohl Garbage Collector uvolnit jiţ nepotřebné nativní prostředky aplikace. Ve výchozí implementaci totiţ autor zapomněl na uvolňování nepotřebných nativních prostředků, se kterými si Garbage Collector nedokáţe poradit.
2.2
Analýza zvukových knihoven
Kaţdá hra pouţívá pro dokreslení atmosféry nejrůznější zvuky a hudbu. Pro Windows Mobile existuje několik knihoven, které umí přehrát zvuky nejrůznějších hudebních formátů. Základním poţadavkem na knihovny je, aby bylo moţné přehrát i několik zvuků naráz. Samozřejmostí je také existence příslušné obalové třídy.
KAPITOLA 2. ANALÝZA A NÁVRH ARCHITEKTURY
7
Knihovna
FMOD
Hekkus Windows Mobile API
Verze
2.6
0.99
5.2
Licence
GPL
GPL
Součást Windows Mobile
Obalová třída
ano
ano
ne
Podporované formáty .wav, .mp3,.mod .wav, .ogg
.wav
Tabulka 2: Srovnání zvukových knihoven
FMOD FMOD [11] je velmi populární zvuková knihovna, která se pouţívá i u klasických počítačových her. Podporuje nejrůznější formáty jako například .wav, .mp3, .ogg, .midi. Samozřejmostí je moţnost přehrávání více zvuků naráz. Nevýhodou je, ţe verze pro Windows Mobile jiţ není delší dobu vyvíjena a zřejmě uţ ani nebude. Existuje také obalová třída, která ale nepochází od výrobce knihovny. Výhody:
Podporuje velké mnoţství hudebních formátů Dostupná obalová třída
Podpora přehrávání více zvuků naráz
Zdarma
Nevýhody:
Pro Windows Mobile se uţ nevyvíjí delší dobu
Obalová třída neobsahuje všechny moţnosti knihovny
Hekkus Sound System Hekkus [12] je další knihovna, která umoţňuje přehrávat zvuky ve formátu .wav a ogg a je určena přímo pro zařízení s Windows Mobile. Podporuje přehrávání více zvuků naráz pomocí metody mixování kanálů. Výhody:
Podpora přehrávání více zvuků naráz
Dostupná obalová třída přímo od autora
Zdarma
Nevýhody:
Podpora pouze dvou formátů ogg a wav
KAPITOLA 2. ANALÝZA A NÁVRH ARCHITEKTURY
8
Windows Mobile Sound API Samotný operační systém Windows Mobile také obsahuje funkce, které dokáţou přehrát základní zvuky a to pouze ve formátu .wav.
Výhody:
Součást systému
Nevýhody:
Neexistuje obalová třída
Nelze přehrávat více zvuků naráz
Přehrává pouze .wav
Nejideálnější by bylo pouţití knihovny FMOD, ale v dnešní době se tato knihovna uţ nějakou dobu nevyvíjí. Proto jsem pro svou implementaci zvolil knihovnu Hekkus Sound System. Z toho tedy vyplývá, ţe hra umoţní přehrávat veškeré zvuky pouze ve formátu wav nebo v zcela otevřeném formátu ogg.
2.3
Návrh architektury aplikace
Při návrhu aplikace jsem se snaţil, abych oddělil od sebe vlastní vykreslování aplikace od samotné logiky hry. Proto výsledná aplikace se skládá ze tří základních součástí: Game API, vlastní aplikace a grafický plugin. Na následujícím obrázku je znázorněna zvolená architektura aplikace:
Obrázek 1: Znázornění hierarchie aplikace
V následujících částech stručně popíšu, co všechno která část aplikace má na starosti.
2.3.1
Game API
Game API je hlavní knihovna, která obsahuje všechny potřebné metody pro základní fungování aplikace a provádění herního světa. Součástí je tedy třída pro realizaci zvuku a základní rozhraní, přes které knihovna komunikuje s grafickým pluginem. Dále v sobě obsahuje metody pro manipulaci s mapou hry a také dostupné
KAPITOLA 2. ANALÝZA A NÁVRH ARCHITEKTURY objekty mapy a také třída, která udrţuje aktuální stav hry. Dále je zde i třída, která udrţuje statistiky jednotlivých hrdinů.
2.3.2
Grafický plugin
Účelem grafického pluginu je realizace samotného grafického výstupu aplikace. Proto se v knihovně nachází pouze implementace metod základního rozhraní, které aplikace následně pouţívá. Díky nezávislosti na vlastní aplikaci lze tento výstup realizovat na kterékoliv jiné grafické knihovně, která splní poţadavky stanovené v analýze.
2.3.3
Aplikace
Samotná aplikace je realizována jako formulář .NET aplikace, do kterého se kreslí. V aplikaci také běţí vlákno, které provádí samotný běh hry. Aplikace také reaguje na vstup uţivatele.
9
10
KAPITOLA 2. ANALÝZA A NÁVRH ARCHITEKTURY
KAPITOLA 3. NÁVRH UŽIVATELSKÉHO ROZHRANÍ
3. Návrh uživatelského rozhraní Samotná hra komunikuje s hráčem pomocí uţivatelského rozhraní. V této části ukáţu návrhy uţivatelského rozhraní pro jednotlivé obrazovky ve hře.
3.1
Úvodní obrazovka
Na úvodní obrazovce se v hlavní nabídce zobrazují základní volby za pomoci, kterých se lze dostat do hry. Jedná se hlavně o novou hru, načtení uloţené hry, nastavení hry a také ukončení hry.
Obrázek 2: Návrh úvodní obrazovky
3.2
Výběr vlastní hry
Hra podporuje přidávání vlastních her. Tato nabídka se zobrazí po zvolení spuštění nové hry. V dialogu se zobrazuje název hry, její logo, popis hry a detaily. Rozloţení vypadá takto:
11
KAPITOLA 3. NÁVRH UŽIVATELSKÉHO ROZHRANÍ
12
Obrázek 3: Návrh obrazovky pro výběr nové hry
Uţivatel si můţe pomocí šipek vybrat hru, kterou chce hrát. Pomocí tlačítek dialogu svou volbu potvrdí nebo se vrátí zpět na vstupní obrazovku.
3.3
Aktuální hra
Jak jsem jiţ psal v úvodu, hra staví na principech dnes jiţ legendární hry Dungeon Master. Proto jsem navrhnul rozloţení rozhraní velmi podobné této hře. Na hlavní obrazovce se nachází panely hrdinů, vlastní prostředí hry, ovládací panely hry a textový výstup pro nejrůznější zprávy ze hry. Rozloţení je tedy následující:
Obrázek 4: Návrh hlavní obrazovky hry
3.4
Inventář hrdiny
Kaţdý hrdina ve hře má svůj vlastní inventář, kde lze ukládat nejrůznější předměty. Jeho základní rozloţení je následující:
KAPITOLA 3. NÁVRH UŽIVATELSKÉHO ROZHRANÍ
Obrázek 5: Návrh hlavní obrazovky inventáře hrdiny
V samotném inventáři se nachází přihrádky pro jednotlivé předměty. Detailnější rozloţení je naznačeno v dalším obrázku:
Obrázek 6: Detailnější návrh inventáře hrdiny
V části hrdiny se nachází jednotlivé přihrádky pro oblečení hrdiny, je zde také opasek a také co hrdina drţí v obou rukách. Nachází se zde také toulec, který můţe nést aţ 6 předmětů a je určen převáţně pro různé zbraně, nejčastěji šípy nebo jiné předměty jako kameny. Část batoh obsahuje 16 přihrádek pro nalezené předměty během hraní.
13
KAPITOLA 3. NÁVRH UŽIVATELSKÉHO ROZHRANÍ
14
V základních statistikách se zobrazuje číselně ţivot hrdiny, energie a magická energie. V části ukazatelů jídla a vody se graficky znázorňují hodnoty těchto dvou ukazatelů. Pokud uţivatel klikne na oko hrdiny, zobrazí se také v této části vypsané další statistiky hrdiny a slovně třídy dovedností hrdiny. V moţnostech hry jsou jen tři ikony, z nichţ první přepne hrdiny do odpočívacího reţimu, druhá slouţí pro vyvolání dialogu moţností hry a poslední je k uzavření inventáře a návrat na předchozí obrazovku.
3.5
Dialog možností hry
Tento dialog je přístupný pouze z inventáře hrdiny a obsahuje volby pro uloţení aktuální hry, načtení aktuální hry, ukončení hry a zrušení dialogu. Zjednodušeně vypadá takto:
Obrázek 7: Návrh dialogu možností hry
KAPITOLA 4. IMPLEMENTACE
4. Implementace V této kapitole popíšu výsledky své implementace celé aplikace.
Cíle implementace
4.1
Cílem implementace je tedy vytvořit funkční hru pro zařízení s Windows Mobile. Hráč si zvolí 4 hrdiny a prochází mezi jednotlivými úrovněmi, kde na něj čekají různé hádanky, unikátní předměty a prostředí a také unikátní nepřátelé. Hra umoţní výběr vlastní nové hry. Ty mohou obsahovat vlastní úrovně s různým prostředím, vlastními předměty a nepřáteli. Součástí archivu jsou také vlastní zvuky.
Použité knihovny
4.2
Zde je seznam pouţitých knihoven v aplikaci s jejich krátkým popisem:
4.3 4.3.1
PocketFrog – jedná se o grafickou knihovnu, která je nadstavba knihovny PocketHAL a realizuje grafický výstup pomocí knihovny DirectDraw. Hekkus Sound System – tato knihovna obstarává přehrávání zvuků. Aplikací budou podporovány jen 2 formáty zvuků a to .wav a .ogg ZipLibrary – jedná se o knihovnu, která umoţňuje pracovat se zip archivy. V aplikaci je pouţita pro streamování dat z hlavního souboru dat a z vlastních her.
Implementace grafického rozhraní IGraphicsInterface
Jak uţ bylo v analýze zmíněno, hra má oddělený grafický výstup. Aby byla moţná komunikace, Game API definuje rozhraní IGraphicsInterface, které obsahuje metody, pomocí kterých spolu aplikace a plugin komunikují. Interface obsahuje hlavně definice metod pro inicializaci pluginu, kreslení čar, obrázků, nastavování výřezů a také vyplňování oblastí. Vybraný grafický plugin musí implementovat všechny metody, aby bylo zajištěno správné vykreslování celého uţivatelského rozhraní aplikace.
4.3.2
Implementace fontů
Aby bylo moţné vypisovat text nezávisle na grafickém pluginu, aplikace pouţívá font implementovaný jako bitmapový. To znamená, ţe v obrázku jsou uloţené tisknutelné znaky abecedy a čísla. Nevýhoda je, ţe pro kaţdou velikost musí existovat kaţdý obrázek a navíc to také komplikuje lokalizaci. To ale zde není na škodu, protoţe
15
16
KAPITOLA 4. IMPLEMENTACE
v podstatě hra pouţívá jen 3 velikosti, přičemţ lze jednoduše vytvořit i více barevných variant. Zároveň s obrázkem je přítomen textový soubor, který obsahuje šířky jednotlivých znaků v obrázku. Na kaţdém řádku je uvedena velikost pro jeden znak. To znamená, ţe v souboru je tolik řádků, kolik znaků je v bitmapě. Po inicializaci aplikace jsou tyto obrázky a fonty automaticky načteny a připraveny ihned k pouţití přes metody pro výpis textu.
4.3.3
Cachování obrázků
Protoţe ve Windows Mobile existuje limit virtuální paměti na jeden proces (popsáno například v [13]), veškerá grafika s aplikací se musí vejít do 32MB operační paměti. Proto musí grafický plugin implementovat metodu cachování obrázků, aby se zabránilo zbytečnému plýtvání pamětí. U mého pluginu je cache obrázků implementovaná jako kolekce Dictionary<string, CacheImage>, kde klíčem je jméno souboru z archivu a hodnotou je třída CacheImage, která obsahuje vlastní data obrázku a stáří poloţky. Stáří poloţky je důleţité, protoţe knihovna implementuje LRU algoritmus [14] pro určení obrázku, který se má vyřadit v případě, ţe dochází virtuální paměť pro hru. Toto vyřazování z cache se tedy děje v metodě pro načtení nového obrázku.
4.4
Implementace zvuku
K implementaci zvuku jsem pouţil knihovnu Hekkus Sound System (hss.dll). Game API obsahuje obalovou třídu pro tuto knihovnu. Aby byl přístup ještě jednodušší, Game API poskytuje svou třídu, která aplikaci poskytuje potřebné metody. Nejdříve je nutné knihovnu inicializovat. To se provádí metodou open u objektu speaker: int ret = speaker.open(44100, 16, true, 1, 16);
Dále třída obsahuje metody pro přehrání zvuku. Jsou to následující:
public void PlaySound(String name, uint volume)
public void PlaySound(String name, uint volume, int delay)
public void PlaySound(String name, int x, int y)- Zde name
parametr obsahuje identifikátor zvuku ze souboru sounds.xml. Parametrem volume se určuje hlasitost (hodnoty v rozmezí 0 - 64). Parametr delay určuje prodlevu, neţ se začne zvuk přehrávat. Poslední metoda přijímá jako parametry x, y pozici na mapě a pak spočítá vzdálenost tohoto bodu od skupiny hrdinů a
KAPITOLA 4. IMPLEMENTACE zvuk přehraje se spočítanou hlasitostí. Takto se vytvoří efekt zvuku ze vzdáleného objektu.
public void PlayAmbientSound(String filename, uint volume) - Tato metoda přehraje zvuk, který se má neustále opakovat. Její vyuţití je
například pro různé efekty počasí (například déšť). Třída také obsahuje metodu pro přehrání hudby:
public void PlayMusic(String filename) - Jediným parametrem je
název souboru v úloţišti. Zde je rozdíl v tom, ţe hra nepodporuje přehrávání hudby z archivu hry ale pouze z adresáře hry. Důvodem je to, ţe při pouţití větších hudebních souborů by se musel celý soubor ukládat v paměti, které uţ tak můţe být nedostatek. Na konci programu je nutné zavolat metodu ShutDown(), která zastaví všechny přehrávané zvuky a odstraní všechny alokované prostředky touto knihovnou.
4.5
Popis nejdůležitějších částí a funkcí aplikace
V této části popíšu všechny důleţité třídy a části aplikace. Nejdříve začnu organizací adresáře hry a adresáře v archivu vlastní hry.
4.5.1
Struktura adresáře hry
Po nainstalování hry v zařízení je výchozí struktura adresářů následující:
Obrázek 8: Struktura adresáře nově nainstalované hry
Kořenový adresář aplikace V tomto adresáři jsou uloţené všechny hlavní knihovny aplikace a také zde aplikace vytvoří po prvním spuštění .xml konfigurační soubor hry.
17
18
KAPITOLA 4. IMPLEMENTACE
Adresář data Tento adresář obsahuje jediný soubor a to gamedata.zip, který obsahuje základní data aplikace. V archivu jsou obsaţeny obrázky uţivatelského rozhraní, základní konfigurace aplikace a také konfigurace a obrázky kouzel. Adresář games V tomto adresáři jsou uloţené vlastní hry jako soubory .gam. Struktura archivu a jeho popis bude následovat dále. Adresář save Tento adresář sice není přítomen hned po instalaci, ale hra si ho vytvoří po prvním spuštění. Do tohoto adresáře se ukládají všechny uloţené hry. Adresář sounds Do tohoto adresáře se ukládají soubory hudby a je zde i soubor .txt, který obsahuje definici hudby. Formát tohoto souboru je: identifikátor mezera jméno souboru.
4.5.2
Struktura vlastní hry
Hra podporuje vlastní hry, které jsou uloţené v archivu souboru .gam. Jde vlastně o zip archiv, který má tuto strukturu:
Obrázek 9: Struktura adresáře v archivu vlastní hry
Kořenový adresář V tomto adresáři se nachází zpravidla jen 2 soubory. První je description.xml, který obsahuje základní informace o hře. Dále je zde obrázek, který symbolizuje hru.
KAPITOLA 4. IMPLEMENTACE Adresář config V tomto adresáři jsou uloţené xml konfigurační soubory hry a datové soubory hrdinů a nepřátel a databáze předmětů. Adresář endgame Tento adresář obsahuje jediný soubor a to endgame.txt, ve kterém je pomocí skriptovacího jazyka napsány závěrečné intro hry. Adresář heroes V tomto adresáři jsou uloţené obrázky hrdinů, které jsou pouţité v zrcadlech na začátku úrovně. Adresář intro Zde je uloţen soubor intro.txt, ve kterém je pomocí skriptovacího jazyka napsáno úvodní intro hry. Adresář items Zde se nachází obrázky jednotlivých předmětů, na které se odkazují xml definice z konfigurace. Adresář maps V tomto adresáři je uloţená celá mapa hry v binárním formátu, která obsahuje rozloţení úrovní. Adresář misc Zde je uloţen xml soubor, který obsahuje lokalizační řetězce a také soubor demo.txt, který obsahuje text, který se zobrazí na konci lite verze hry. Adresář monsters Zde se nachází obrázky nepřátel, na které odkazuje xml definice. Adresář sounds V tomto adresáři se nachází veškeré zvuky hry. Na tyto zvuky je odkazováno z xml definice zvuků. Adresář tutoriál Zde se nachází všechny obrázky, které jsou potřeba k mapě tutoriálu.
19
20
4.5.3
KAPITOLA 4. IMPLEMENTACE
Popis základních XML souborů
V této části popíšu základní XML soubory, pomocí kterých se dá konfigurovat vlastní hra. Zároveň uvedu význam jednotlivých poloţek. U dalších XML jen uvedu, k čemu slouţí a jak vypadá. Detailnější popis s vysvětlivkami bude následovat v popisu objektů mapy. Soubor description.xml Tento soubor obsahuje informace o nové hře a je uloţen v kořenovém adresáři vlastní hry. Údaje se pak zobrazí v dialogu pro výběr nové hry. Jeho definice je následující:
dm.png FTL <description>Original Dungeon Master Levels
V uzlu image je jméno souboru obrázku, který se pak zobrazí v dialogu. V uzlu author se specifikuje autor této hry. V uzlu description je obsaţen popis hry. Soubor Sounds.xml Tento soubor obsahuje XML definice zvuků. Můţe vypadat takto: <sounds> <sound name="door open">door.wav <sound name="use switch">switch.wav
Uzel sound definuje zvuk, který pak dokáţe hra přehrát. V atributu name se zadává unikátní identifikátor zvuku, který se pak předává funkcím pro přehrávání zvuku uvedených výše. Hodnotou je název souboru zvuku v archivu. Hra je hledá v adresáři sounds v archivu hry.
Soubor MonsterSounds.xml Tento soubor má podobnou strukturu jako Sounds.xml a jeho účelem je definovat zvuky pro určité akce nepřátel. Všechny soubory zvuků se hledají v adresáři sounds v archivu hry. XML můţe vypadat takto: <monsters>
KAPITOLA 4. IMPLEMENTACE <monster name="Screamer">
step1.wav spider.wav <monster name="Mummy">
step2.wav mummy.wav
V uzlu monsters jsou uloţeny jednotlivé uzly pro dané nepřátele. V uzlu monster se v parametru name určuje jméno nepřítele. Toto jméno musí souhlasit s definovaným jménem nepřítele, jinak hra nedokáţe tuto definici pouţít. Uzel footstep obsahuje zvuk, který se přehrává při chůzi nepřítele. V uzlu attack je zvuk, který se přehrává při útoku.
4.5.4
Popis základních objektů hry
V této části popíšu všechny základní objekty mapy a jejich hierarchii, jak vypadají a jaký mají účel ve hře. Také u nich uvedu XML definice, pomocí kterých se dá určit, co se ve kterém okamţiku vykreslí ze zdrojového obrázku. Tyto definice jsou nejčastěji uvedené v souboru Wallsets.xml. Pojmenování objektů mapy a tedy i jejich tříd, které je reprezentují, jsem volil podle zjištěných názvů z originální hry Dungeon Master nebo názvy pouţívané v komunitě kolem těchto her. Jako grafiku jsem pouţil volně šiřitelné obrázky z různých klonů například [15] a [16], přičemţ jsem si je musel upravit pro své účely.
4.5.4.1
Formát mapy hry
Nejjednodušší implementace mapy by byla jako trojrozměrné pole objektů mapy. V mé implementaci je samotná úroveň reprezentovaná jako jednorozměrné pole objektů mapy, kde se pro zjištění objektu na pozici x, y pouţívá mapovací funkce. Tyto úrovně jsou uloţeny pak jako poloţky kolekce typu List.
4.5.4.2
MapLoader
Tato třída je navrţená pro samotnou manipulaci s mapou. Součástí této třídy jsou také metody pro uloţení a načtení rozehrané hry. Nejdůleţitější metody jsou tedy:
public void LoadMap(String path, bool loadCustomGame) -
Tato metoda se stará o načtení jak mapy z nové hry tak i z uloţené hry. Jako první parametr se zadává cesta v archivu hry a druhý parametr určuje, zda načítám novou hru (hodnota true) nebo se bude načítat uloţená hra. Tento druhý parametr je důleţitý nastavit správně, protoţe formát souboru nové mapy a uloţené mapy není stejný.
21
22
KAPITOLA 4. IMPLEMENTACE
public void SaveMap(String path) - Po zavolání této metody dojde
k uloţení rozehrané hry do binárního souboru v adresáři save. Jako parametr se tedy předává celá cesta včetně jména souboru.
Další metody slouţí pro automatické uloţení mapy, které můţe autor povolit nebo zakázat v konfiguraci hry:
public void AutoSave() - Metoda uloţí aktuálně načtenou mapu do
souboru autosave.dat v adresáři save.
public void LoadAutoSave() - Metoda načte automaticky uloţenou hru,
pokud existuje. Pro vytvoření nové mapy stačí zavolat metodu:
public void CreateNewMap(int width, int height, int defType) - Tato metoda vytvoří zcela novou mapu o dané velikosti a vyplní
ji specifikovaným objektem. Povolené hodnoty jsou: o 0 – Úroveň se vyplní stěnou o 1 – Úroveň se vyplní podlahou
Další metody slouţí pro manipulaci s objektem v mapě:
public void AddMapObject(int level, int x, int y, MapObject o) - Tato metoda přidává vytvořený objekt do mapy. V prvním
parametru se specifikuje číslo úrovně a pak pozice x a y na mapě. Jako poslední parametr je objekt, který se má vloţit do mapy. Pokud chceme zjistit objekt mapy, na to slouţí metoda:
public MapObject GetMapObject(int level, int x, int y) -
Metoda vrací objekt z úrovně specifikované parametrem level a pozicí x a y.
4.5.4.3
MapObject
Třída MapObject tvoří společného předka všech základních objektů mapy. Tento objekt poskytuje společné metody a proměnné. Jde převáţně o manipulaci s předměty, základní vlastnosti a metody pro kreslení grafiky. Zde ještě zmíním, jak se vlastně vykresluje celé prostředí úrovně. Souvisí to totiţ s parametry kreslící metody této třídy. Ještě předtím, neţ dojde k vlastnímu
KAPITOLA 4. IMPLEMENTACE kreslení, se vytváří dočasné pole, které obsahuje viditelné objekty z pohledu hráče. Pro představu, toto pole vypadá takto:
Obrázek 10: Znázornění pole viditelných objektů z pohledu hráče
Čísla na obrázku jsou ve formátu řádek (row), sloupec (col). Písmenem X je označena aktuální pozice hráče. Pro kreslení se pouţívají tyto metody:
public virtual void DrawPic(int row, int col, int xc, int yc, int buffer) – Zavoláním této metody dojde k vykreslení obrázku na
zadané pozici v parametrech row,col. Parametry xc a yc udávají pozici na obrazovce, od které se začne kreslit. Poslední parametr slouţí jako rezervovaný parametr, který pak mohou vyuţít další metody.
public void DrawContents(int dist, int i, int yc, int buffer) - Účelem této metody je vykreslit obsaţené předměty nebo
nepřátele. Jako první parametr se zadává vzdálenost od skupiny hrdinů. V druhém parametru se předává sloupec a v třetím pozice Y na obrazovce. Poslední parametr slouţí jako rezervovaný parametr, který pak lze vyuţít pro vlastní účely.
public virtual void LoadTextures() - Tato metoda se postará o
načtení definic textur objektu z příslušného XML souboru. Dále třída obsahuje také metody pro manipulaci s předměty, které můţe kaţdý objekt obsahovat a to:
public virtual void AddItem(Item i) - Tato metoda vloţí do
objektu daný předmět v parametru i. Tuto metodu také mohou překrýt další objekty mapy a implementovat tak vlastní funkčnost.
public virtual void RemoveAllItems() - Tato metoda odstraní
všechny předměty z objektu mapy.
public Item PickUpItem(int square) - Funkce PickUpItem nalezne
předmět na dané části podlahy, specifikované v parametru square.
public int GetNumItems() - Tato funkce vrací počet předmětů
v objektu. Další uvedené metody slouţí pro změnu stavu objektu:
23
24
KAPITOLA 4. IMPLEMENTACE
public virtual void Activate() - Pomocí této metody dojde
k aktivování objektu.
public virtual void Deactivate() - Pomocí této metody
lze deaktivovat objekt.
public virtual bool ChangeState() - Touto metodou lze přepínat
stav objektu.
public virtual Rectangle GetImageIndices(int row, int col, int type) - Tato funkce vrací definovanou oblast ze zdrojového obrázku
pro objekt. Tato oblast se pak následně pouţije pro vykreslení na obrazovku. Další metody slouţí pro zpracování události na objektu:
public virtual void TryWallSwitch(int x, int y) public virtual bool TryWallSwitch(int x, int y, Item it) -
Tyto metody zachytávají kliknutí na příslušný objekt. V parametrech x a y přichází pozice stisku na obrazovce. Do druhé metody se navíc posílá i předmět, pomocí kterého byl proveden klik na daném objektu.
public virtual void TryFloorSwitch(int onOff) - Tato metoda
se od předchozí liší v tom, ţe je vyvolána aţ po té, co hráči na daný objekt vstoupí.
public public public public
virtual virtual virtual virtual
void bool void void
TryTeleport() TryTeleport(Item it) TryTeleport(ProjectileData p) TryTeleport(Monster m) - Skupina metod
umoţňuje teleportování určitých objektů po mapě. Jedná se hlavně o předměty, projektily a nepřátele. Na závěr ještě uvedu důleţité proměnné objektu:
public char MapChar - Tato proměnná obsahuje jednoznačný
identifikátor objektu. Podle něj lze odlišit bezpečně jednotlivé objekty mapy.
public String Layout - V této proměnné je uloţen identifikační řetězec,
který odpovídá jménu v definici příslušného XML souboru.
public bool IsPassable - Tato proměnná určuje, zda je objekt průchozí
hráčem.
public bool CanHoldItems - Proměnná určuje, zda v objektu mohou být
předměty.
public bool HasParty - Tato proměnná určuje, zda na objektu stojí
skupina hráčů.
KAPITOLA 4. IMPLEMENTACE
public bool HasMons - Tato proměnná určuje, zda na objektu stojí
nepřítel.
public bool HasItems - Tato proměnná indikuje, zda jsou v objektu
nějaké předměty.
public List
- MapItems - V této proměnné jsou uloţeny veškeré
předměty v objektu.
4.5.4.4
Alcove
Objekt Alcove reprezentuje výklenek, do kterého lze ukládat předměty. Konkrétně tento výklenek je po všech čtyřech stranách objektu. Příslušná definice XML vypadá takto: <wallset name="Alcove" path="dm/"> alcove.png <wall11>320,0,120,267 <wall21>358,267,150,170 <wall31>152,437,170,122 <wall12>0,0,320,267 <wall22>0,267,208,170 <wall32>0,437,152,122
Kde name obsahuje identifikátor, který se přiřadí do proměnné Layout. Atribut path obsahuje cestu v archivu hry. Jednotlivé uzly wall* obsahují regiony ze zdrojového obrázku z uzlu image. Přičemţ „*“ odpovídá řádku a sloupci z metody DrawPic. Zdrojový obrázek pak vypadá takto:
25
26
KAPITOLA 4. IMPLEMENTACE
Obrázek 11: Zdrojový obrázek objektu One Alcove a Alcove
4.5.4.5
OneAlcove
Objekt OneAlcove v podstatě odpovídá předchozímu objektu, ale s tím rozdílem, ţe výklenek je pouze na jedné straně. Sice se pouţívá stejný obrázek, ale pro kreslení z boku se pouţívá rozdílný obrázek. Proto je také tato třída potomkem objektu SidedWall na rozdíl od objektu Alcove. XML definice s menší úpravou: <wallset name="OneAlcove" path="dm/"> alcove.png 320,0,120,267 208,267,150,170 508,267,154,170 322,437,170,122 492,437,170,122 0,0,320,267 0,267,208,170 0,437,152,122
Zde uzly facingside* odpovídají řádku a sloupci v mapě. Navíc je zde definice uzlu col1pic*. Tato definice odpovídá při pohledu hráče bočním stěnám. 4.5.4.6
Altar
Objekt Altar ve hře reprezentuje oltář, který dokáţe přivést k ţivotu mrtvého hrdinu. Oţivení hrdiny se provede vloţením jeho kostry do oltáře.
KAPITOLA 4. IMPLEMENTACE
Obrázek 12: Zdrojový obrázek objektu Altar
Jelikoţ je Altar potomkem objektu OneAlcove, XML definice je tedy úplně stejná. 4.5.4.7
Decoration Objekt Decoration reprezentuje ve hře různé dekorace na stěnách.
XML definice: <decoration name="Wallring" path="dm/"> wallring.png 0,0,49,46 0,46,32,30 0,76,22,21 0,97,9,31 0,128,6,22 0,150,4,14 <xyadjust0>134,82 <xyadjust1>87,53 <xyadjust2>64,38 <xyadjust3>97,81 <xyadjust4>136,51 <xyadjust5>160,39 <xyadjust6>14,81 <xyadjust7>8,51 <xyadjust8>6,39
Zde uzly facingside* odpovídají dekoraci, kterou vidíme přímo před sebou. Uzly col1pic* odpovídají pohledu na dekoraci ze stran. V uzlech xyadjust* jsou uloţeny pozice x a y na obrazovce pro příslušný pohled.
27
28
KAPITOLA 4. IMPLEMENTACE
Zdrojový obrázek objektu:
Obrázek 13: Zdrojový obrázek objektu Decoration
4.5.4.8
Door
Objekt Door reprezentuje ve hře dveře. Dveří jsou 3 druhy. Otevřené, zamčené na klíč nebo zamčené, kdy je můţe otevřít jiný objekt jako například tlačítko na zdi. XML definice je následující: <door name="Steel door" path="dm/"> steeldoor.png <doorpic1>0,0,203,213 <doorpic2>0,213,134,141 <doorpic3>0,354,100,106 Opened Door <doortrack>doortrack.png
Zdrojové obrázky:
KAPITOLA 4. IMPLEMENTACE
Obrázek 14: Zdrojové obrázky objektu Door. Vlevo se nachází obrázek rámů dveří, uprostřed jsou vlastní dveře a vpravo se nachází obrázek, kdy hráč stojí ve dveřích a kouká se na rám z boku.
Zde uzly doorpic* reprezentují vlastní obrázek dveří. Uzel openpiclayout obsahuje jméno definice otevřených dvěří. Poslední uzel doortrack obsahuje obrázek, který se zobrazí, kdyţ hráč stojí ve dveřích a kouká se na rám z boku. 4.5.4.9
Wall
Objekt Wall ve hře reprezentuje všechny stěny. Také je předkem objektů, které mají mít vlastnosti stěny. XML definice je následující: <wallset name="Stone" path="dm/"> wall.png <wall01>0,267,64,326 <wall11>64,267,120,266 <wall21>184,267,150,168 <wall31>334,267,170,122 <wall30>504,267,32,122 <wall12>0,0,320,267 <wall22>320,0,208,170 <wall32>528,0,152,122 0,860,64,326
29
30
KAPITOLA 4. IMPLEMENTACE
64,860,120,266 184,860,150,168 334,860,170,122 504,267,32,122 0,593,320,267 320,593,208,170 528,593,152,122 back.png
Zde uzly wall* a altwall* odpovídají daným řádkům a sloupcům v kreslící metodě. Uzel back obsahuje obrázek, který se kreslí pozadí prostředí. Pokud se do proměnné Layout přiřadí nějaký identifikátor stěny, hra pak dokáţe vykreslit stěnu s jinou texturou, neţ je ta výchozí pro celou úroveň.
Obrázek 15: Zdrojový obrázek objektu Wall
KAPITOLA 4. IMPLEMENTACE 4.5.4.10 SidedWall Objekt SidedWall je přímým potomkem objektu Wall. Jeho účelem je umoţnit určit, jakým je směrem daný objekt otočen. Toho pak vyuţívají další objekty jako například OneAlcove, Altar, kdy jsou vidět jen z určitého pohledu. 4.5.4.11 DungeonWall Objekt DungeonWall ve hře reprezentuje výchozí stěnu v dané úrovni. Jediný rozdíl oproti objektu Wall je ten, ţe tento objekt ve hře existuje jen jednou (je implementován jako singleton). Důvodem je, aby se ušetřilo zbytečné načítání stále stejných objektů. Ve chvíli, kdy se skládá dočasné pole pro vykreslení, je tato instance třídy přiřazena do tohoto pole místo objektu Wall a následně se vykreslí s výchozí texturou úrovně. 4.5.4.12 FakeWall FakeWall je v podstatě to samé jako Wall, ale s tím rozdílem, ţe lze skrz tuto stěnu projít. Definice XML pro tento objekt neexistuje, protoţe se při kreslení pouţívá DungeonWall singleton. 4.5.4.13 Floor Objekt Floor reprezentuje ve hře podlahu. Tento objekt nemá ţádné textury. Pouze drţí v sobě předměty nebo se smí po něm pohybovat hráč nebo nepřátelé. 4.5.4.14 FloorDecoration FloorDecoration je objekt, který umoţňuje definovat různé dekorace na zemi. Příslušná XML definice vypadá takto: floorgrate.png 0,0,26,36 0,36,131,40 0,112,85,22 0,134,91,22 0,178,68,12 0,190,65,12 <xyadjust0>0,227 <xyadjust1>161,189 <xyadjust2>422,167 <xyadjust3>0,0 <xyadjust4>181,0 <xyadjust5>363,0 <xyadjust6>51,0 <xyadjust7>194,0 <xyadjust8>330,0
31
32
KAPITOLA 4. IMPLEMENTACE
Uzly pic* značí příslušný řádek a sloupec, který přijde jako parametr metody DrawPic. Uzly xyadjust* obsahují x a y pozice na obrazovce pro příslušné řádky a sloupce. Zdrojový obrázek můţe vypadat takto:
Obrázek 16: Příklad zdrojového obrázku objektu FloorDecoration
4.5.4.15 FloorSwitch FloorSwitch je objekt, který reprezentuje nášlapnou plošinu ve hře. Po jejím stisknutí lze provést definovanou akci. Dá se také určit, zda má reagovat na sešlápnutí hráče nebo na sešlápnutí od nepřítele popřípadě na poloţení předmětu (proměnná Type). XML definice vypadá následovně: floorswitch.png 0,0,120,267 0,267,320,267 0,534,150,170 0,704,208,170 0,874,170,122 0,996,152,122
Opět uzly pic* odpovídají řádku a sloupci v parametrech metody DrawPic. Zdrojový obrázek vypadá následovně:
KAPITOLA 4. IMPLEMENTACE
Obrázek 17: Příklad zdrojového obrázku objektu FloorSwitch
4.5.4.16 FluxCage FluxCage je speciální objekt, který se chová při kreslení stejně jako DungeonWall. Jeho jediným účelem je mezi sebe sevřít finálního nepřítele, který se snaţí uniknout pomocí teleportování po úrovni. XML definice je následující: fluxcage.png 0,326,64,326 0,0,448,326 64,326,64,326 128,326,120,267 448,0,320,267 248,326,120,267 368,326,150,170 768,0,208,170 518,326,150,170 668,326,170,122 976,0,150,122 838,326,170,122
Zde fluxcage* reprezentuje řádek a sloupec z parametrů metody DrawPic. Zdrojový obrázek vypadá takto:
33
34
KAPITOLA 4. IMPLEMENTACE
Obrázek 18: Zdrojový obrázek objektu FluxCage
4.5.4.17 Fountain Objekt Fountain reprezentuje ve hře fontánu s vodou. Jeho účelem je, ţe si hráč můţe do flašky nebo do předmětu Waterskin nabrat vodu. XML definice je následující: fountain.png 0,0,320,267 0,267,150,170 0,437,208,170 0,607,170,122 0,729,152,122 0,851,129,267 0,1118,156,170 0,1288,174,122
Zde je navíc atribut sidepic, který určuje, jaká textura se zobrazí, pokud hráč stojí vedle objektu. Zdrojový obrázek:
KAPITOLA 4. IMPLEMENTACE
Obrázek 19: Zdrojový obrázek objektu Fountain
4.5.4.18 Generator Objekt Generator je potomkem objektu Floor. Jeho hlavním účelem je moţnost vkládat do úrovně další nepřátele. Lze nastavit, kolik nepřátel se má najednou vygenerovat (maximum je 4), jestli se mají generovat neustále popřípadě jen kolikrát, neţ se generátor vypne. XML definice: generator.png 0,0,28,38 0,38,121,44 0,82,83,22 0,104,77,22 0,126,58,14 0,140,56,14
Zdrojový obrázek:
35
36
KAPITOLA 4. IMPLEMENTACE
Obrázek 20: Zdrojový obrázek objektu Generator
4.5.4.19 Launcher Objekt Launcher ve hře poskytuje mechanismus, kdy lze ze stěn vystřelovat projektily. Nejčastěji se pouţívá pro vystřelování například projektilu Fireball nebo předmětu jako jsou dýky. XML definice: launcher.png 0,0,205,25 0,25,129,17 0,42,86,12 0,54,36,26 0,80,21,18 0,98,15,13 <xyadjust0>58,86 <xyadjust1>40,55 <xyadjust2>34,41 <xyadjust3>79,82 <xyadjust4>127,52 <xyadjust5>154,38 <xyadjust6>2,82 <xyadjust7>2,52 <xyadjust8>1,38
Zdrojový obrázek:
Obrázek 21: Zdrojový obrázek objektu Launcher
4.5.4.20 Mirror Tento objekt má jeden hlavní cíl. Umoţnit uţivateli výběr hrdinů, se kterými následně prochází celou hrou. Kliknutím na zrcadlo se zobrazí klasický inventář hrdiny, aby si hráč mohl prohlédnout jeho aktuální statistiky a tak se rozhodnout, zda si hrdinu
KAPITOLA 4. IMPLEMENTACE vybere. V tomto inventáři se také zobrazí dvě moţné volby a to, zda si hráče vzít nebo si vzít hráče s tím, ţe se mu zruší jeho statistiky. XML definice: <mirror name="Mirror" path="dm/"> mirror.png 0,0,100,93 0,93,60,58 0,151,42,41 0,192,36,79 0,271,22,47 0,318,16,31 <xyadjust0>109,55 <xyadjust1>76,36 <xyadjust2>57,26 <xyadjust3>80,58 <xyadjust4>127,38 <xyadjust5>154,29 <xyadjust6>4,58 <xyadjust7>1,38 <xyadjust8>0,29
Zdrojový obrázek:
Obrázek 22: Zdrojový obrázek objektu Mirrror
4.5.4.21 Pillar Objekt Pillar přidává do hry sloupy. Jedná se jen o pouhou dekoraci, která má jen dokreslit atmosféru hry. Tento objekt nemá ţádné speciální nastavení. XML definice:
37
38
KAPITOLA 4. IMPLEMENTACE
pillara.png 0,0,142,250 0,250,90,161 0,411,64,113
Zdrojový obrázek:
Obrázek 23: Zdrojový obrázek objektu Pillar
4.5.4.22 Pit Objekt Pit reprezentuje ve hře díru. Pokud hráč vstoupí na tento objekt, propadne se o jednu úroveň níţe (pokud v ní není další díra). Samozřejmě všichni hráči utrpí poškození při pádu. Objekt také má různé nastavení, kdy například se v určitém časovém intervalu otvírá a zavírá. XML definice: pit.png 0,0,29,30 0,30,349,30 0,60,102,58 0,118,275,58 0,176,140,30 0,206,176,30 0,236,157,19 0,254,129,19 cpit.png 0,0,29,12 0,12,347,12 0,24,102,23 0,47,273,23 0,70,140,12 0,82,173,12
KAPITOLA 4. IMPLEMENTACE V této definici se objevuje uzel cimage a cpic*. Je to proto, aby bylo moţné nadefinovat i obrázky neviditelné díry. Zdrojový obrázek:
Obrázek 24: Zdrojový obrázek objektu Pit
4.5.4.23 PowerGem Objekt PowerGem je důleţitým prvkem hry. Umoţňuje totiţ sestavení finální zbraně, se kterou lze porazit finálního nepřítele. Samozřejmě pro její transformaci je potřeba na tento objekt pouţít speciální předmět. XML definice: <powergem name="Powergem" path="dm/"> powergem.png <powergem1>0,0,96,171 <powergem2>0,171,62,111 <powergem3>0,282,43,77 <powergem-u1>0,359,96,171 <powergem-u2>0,530,62,111 <powergem-u3>0,641,43,77
Zdrojový obrázek:
39
40
KAPITOLA 4. IMPLEMENTACE
Obrázek 25: Zdrojový obrázek objektu PowerGem
4.5.4.24 Sconce Objekt Sconce ve hře nejčastěji v sobě drţí předmět louč. Tento objekt má pouze dva stavy. Předmět je obsaţen nebo ne. XML definice pro obrázky bez předmětu: <sconce name="Sconce" path="dm/"> sconce.png 0,0,42,94 0,94,27,61 0,155,19,43 0,198,16,74 0,272,11,50 0,322,8,36 <xyadjust0>138,81 <xyadjust1>90,50 <xyadjust2>66,37 <xyadjust3>94,77 <xyadjust4>134,50 <xyadjust5>159,38 <xyadjust6>10,77 <xyadjust7>5,50 <xyadjust8>3,38
XML definice pro obrázek je stejný jako výše, akorát jméno definice musí být jiné. Zdrojové obrázky:
KAPITOLA 4. IMPLEMENTACE
Obrázek 26: Zdrojový obrázek objektu Sconce
4.5.4.25 SidedWall Objekt SidedWall je potomkem objektu Wall. Jeho význam je, ţe umoţňuje definovat, kam směruje objekt. Tím se umoţní vykreslovat různé obrázky jen na určité části stěny. Potomky této třídy lze v XML definicích poznat tak, ţe se v nich vyskytují uzly facingside* a col1pic*. 4.5.4.26 Stairs Objekt Stairs umoţňuje hráči cestovat mezi úrovněmi. Jedná se o schody, které vedou nahoru nebo dolů. V mé implementaci tyto schody pouţívají pouze hráči. XML definice: <stairs name="Stairs (Up)" path="dm/"> stairsup.png 0,0,448,111 0,111,64,267 0,378,320,267 0,645,150,170 0,815,208,170 0,985,170,122 0,1107,152,122 211,618,64,326 211,944,120,267 211,1211,150,170
41
42
KAPITOLA 4. IMPLEMENTACE
Zdrojový obrázek:
Obrázek 27: Zdrojový obrázek objektu Stairs
4.5.4.27 Stormbringer Strombringer je další důleţitý objekt ve hře. Obsahuje v sobě předmět, který se jmenuje stejně. Objekt neobsahuje ţádné speciální nastavení, pouze kliknutím na něj dojde k sebrání tohoto předmětu. Samozřejmě i kliknutím na objekt s tím předmětem se zase vrátí zpět. XML definice: <stormbringer name="Stormbringer" path="dm/"> stormbringer.png <stormbringer1>0,0,79,203 <stormbringer2>0,203,47,122 <stormbringer3>0,325,36,91 <stormbringer-u1>0,416,79,203 <stormbringer-u2>0,619,47,122 <stormbringer-u3>0,741,36,91
KAPITOLA 4. IMPLEMENTACE Zde uzly stormbringer-u* značí obrázky, které se zobrazí po sebrání předmětu z tohoto objektu. Zdrojový obrázek:
Obrázek 28: Zdrojový obrázek objektu Stormbringer
4.5.4.28 Teleport Objekt Teleport má za úkol poskytnout ve hře moţnost přenosu objektů po aktuální úrovni nebo do jiné úrovně. Objekt se od předchozích liší v tom, ţe je jeho vykreslování animované. XML definice: teleport.png 0,0,32,163 0,163,224,163 0,489,60,133 0,622,160,133 0,889,75,85 0,974,104,85 0,1144,16,61 0,1205,85,61 0,1266,76,61
Zdrojový obrázek:
43
44
KAPITOLA 4. IMPLEMENTACE
Obrázek 29: Zdrojový obrázek objektu Teleport
4.5.4.29 WallSwitch Objekt WallSwitch ve hře poskytuje mechanismus různých tlačítek na zdi. Objekt můţe mít tři funkce. První je, ţe se chová jako obyčejné tlačítko. V druhém případě se chová jako zámek pro klíč. V třetím případě se jedná o slot pro mince. Ve všech případech tento objekt volá základní funkce pro změnu stavu objektu MapObject. XML definice pro tlačítko: <wallswitch name="Lever Up" path="dm/" type="0"> leverup.png 0,0,15,69 0,69,10,46 0,115,7,32 0,147,35,56 0,203,18,33 0,236,11,22 <xyadjust0>151,61 <xyadjust1>98,39 <xyadjust2>71,28 <xyadjust3>100,62 <xyadjust4>139,43 <xyadjust5>162,33 <xyadjust6>-17,62 <xyadjust7>-8,43 <xyadjust8>-3,33 leverdown.png
KAPITOLA 4. IMPLEMENTACE
XML definice se od ostatních dvou moţností liší v tom, ţe je zde uzel pushedimages, který obsahuje jméno definice, která se pouţije po stisku tlačítka. Atribut type je zde proto, aby se odlišilo, kterého objektu se definice týká. To znamená, ţe type = 0 odpovídá tlačítku, type = 1 odpovídá zámku pro klíč a type = 3 odpovídá slotu pro mince. Zdrojový obrázek objektu:
Obrázek 30: Příklady zdrojového obrázku objektu WallSwitch. Vlevo se nachází obrázek pro nestisknuté tlačítko. Pravý obrázek je již stisknuté tlačítko.
XML definice zámku pro klíč: <wallswitch name="RaKey Keyhole" path="dm/" type="1"> rakeyhole.png 0,0,109,109 0,109,65,65 0,174,44,44 0,218,29,86 0,304,17,51 0,355,12,34 <xyadjust0>105,43 <xyadjust1>70,31 <xyadjust2>53,24 <xyadjust3>86,49 <xyadjust4>130,34 <xyadjust5>156,27 <xyadjust6>5,49 <xyadjust7>3,34 <xyadjust8>2,27
Zdrojový obrázek:
45
46
KAPITOLA 4. IMPLEMENTACE
Obrázek 31: Příklad zdrojového obrázku zámku pro objekt WallSwitch
XML definice pro slot na mince je stejný, jako předchozí. Pouze se liší v atributu type, který má hodnotu 2. Zdrojový obrázek:
Obrázek 32: Příklad zdrojového obrázku slotu pro mince objektu WallSwitch
4.5.4.30 Writing Objekt Writing umoţňuje tvůrci hry přidat jakýkoliv text, který se pak zobrazí na stěně. Nejčastěji se pouţívá jako menší návod na řešení hádanky. Hra obsahuje pro to speciální font, kterým se daný text vypíše. Objekt Writing je potomkem Wall, takţe se při kreslení pouţije výchozí stěna a na něm se zobrazí příslušný nápis. XML definice: <writing name="Writing" path="dm/" sidepic="Stone"> writing.png wrfont1.png
Zde uzel image obsahuje obrázky, které se zobrazí při pohledu ze strany. Uzel font definuje obrázek fontu textu, který se nakreslí v příslušných vzdálenostech (proměnná row u DrawPic metody).
KAPITOLA 4. IMPLEMENTACE Ukázka obrázku fontu, který obsahuje velikosti pro dané tři vzdálenosti:
Obrázek 33: Příklad použitého fontu textu na objektu Writing
4.5.4.31 Item Objekt Item reprezentuje ve hře předměty. Je také předkem speciálních předmětů jako bedna, svitek apod. Jednotlivé předměty mohou mít různé vlastnosti a dělí se do těchto základních skupin:
Zbraně
Štíty
Helmy
Náhrdelníky
Oblečení na tělo Oblečení na nohy
Boty
Jídlo
Klíče
Peníze
Ostatní předměty
Toto rozdělení zde proto, aby se dalo odlišit v inventáři hrdiny, kam který předmět patří. Níţe uvedu některé základní proměnné a metody, které objekt poskytuje:
public int Type - V této proměnné je uloţená hodnota, která odpovídá
příslušnému typu předmětu.
public int Size - Velikost předmětu určuje, kolik místa má zabírat
v inventáři. Této hodnoty se vyuţívá například při definici obouručních zbraní.
public float Weight - V této proměnné je uloţená hmotnost předmětu.
public int Number - V této proměnné je uloţené číslo předmětu. Lze ho
pak pouţít při testech, zda pracujeme s konkrétním předmětem.
public String Name - Zde je uloţeno jméno předmětu, které se pak
zobrazuje v uţivatelském rozhraní.
public string Image - V této proměnné je uloţen obrázek předmětu. Hra
opět pouţívá pro všechny akce jeden obrázek. Tyto akce lze samozřejmě konfigurovat pomocí XML, které vypadá takto: - Fury_212.png 0,0,32,32
47
48
KAPITOLA 4. IMPLEMENTACE <equipped>0,32,32,32 0,64,32,32 0,96,159,30 0,126,32,56 0,182,29,58 0,240,160,81
Zde uzel image obsahuje jméno obrázku.
public Rectangle Pic – Zde je uloţen region z uzlu inventory, který se
pouţívá při kreslení v inventáři hrdinů. public Rectangle DPic – Zde je uloţen region z uzlu floor, který se pouţívá při kreslení ve chvíli, kdy předmět je poloţen na podlahu. public Rectangle EPic – Zde je uloţen region z uzlu equipped a pouţívá se při kreslení ve chvíli, kdy má předmět hrdina v ruce. public Rectangle UPic – Zde je uloţen region z uzlu outofcharge a je pouţit při kreslení v inventáři v situaci, kdy je předmět vybitý. public Rectangle[] ThrowPic – V tomto poli jsou uloţeny regiony, které se pouţívají při manipulaci s předmětem v úrovni. Jsou zde uloţeny regiony z uzlů
flyingaway, flyingtoward, flyingleft. Definice odpovídají pohledům zezadu, zepředu a ze strany. Dále předmět obsahuje metody, které jsou důleţité pro zbraně a magické předměty. Jedná se moţnosti útoků zbraněmi nebo magické schopnosti předmětu. Pro to jsou určeny tyto metody: public String[][] Function - V tomto poli je uloţeno v prvním rozměru jméno funkce a v druhém rozměru pole je uloţen řetězec, který určuje, jakou dovednost hrdiny poţaduje. public int[] Power – Toto pole určuje, jaká síla je pouţita pro dané funkce. public int[] Speed - V tomto poli jsou uloţeny rychlosti daných funkcí. Například u zbraní určuje, za jakou dobu lze funkci opět zavolat.
public int[] Level - V proměnné Level je uloţen minimální poţadavek
na zkušenost hráče. To znamená, ţe pokud ji hráč nesplňuje, tak se tato funkce nezobrazí. Předměty mohou mít také různé efekty. Jedná se například o dočasné zvýšení statistik hrdiny nebo jeho dovedností. Efekt se určuje v proměnné:
public String[] Effect - V tomto poli jsou uloţené řetězce, které
specifikují dané efekty. Řetězce jsou ve formátu:
KAPITOLA 4. IMPLEMENTACE ”funkce,hodnota”, kde funkce můţe odpovídat názvu dovednosti nebo poloţce statistiky hrdiny. Příklad: Máme řetezec “health,50“. Pokud tento předmět hrdina pouţije, jeho ţivot se zvýší o hodnotu 50. Následující proměnné určují pozici předmětu v úrovni. Jedná se o: public int Subsquare - V této proměnné je uloţena pozice předmětu na čtverci podlahy.
public int YOffset public int XOffset - V proměnných XOffset a YOffset je uloţeno
posunutí předmětu na podlaze. Význam je ten, ţe se takto dají předměty posouvat po podlaze a tím ukázat, ţe na zemi leţí více předmětů a to i stejných. Základní metody pro práci s předmětem:
public void AddToLevel(int x, int y, int level, int subsquare) – Tato metoda slouţí k přidání předmětu do úrovně. Pozice
v mape je specifikovaná parametrem x a y, proměnná level určuje číslo úrovně. Parametr subsquare určuje pozici na daném čtverci v úrovni. public void AddToMonster(Monster m) – Tato metoda vloţí předmět do nepřítele v parametru m.
Následující funkce slouţí na reakci předmětu na manipulaci v inventáři:
public void EquipEffect(HeroData h) – Metoda slouţí k aplikování efektu zbraně na hrdinovi. Například magické předměty mohou hrdinovi zvyšovat
jeho statistiky nebo zkušenosti.
public void UnEquipEffect(HeroData h) – Tato metoda zruší efekt,
který vytvořila předchozí metoda.
public void FoodEffect(HeroData h) – Tato metoda slouţí pro zvednutí ukazatele jídla u hrdiny.
4.5.4.32 Scroll Objekt Scroll reprezentuje svitek. Pouţívá se nejčastěji pro sdělení informace hráčovi. Například se můţe jednat o dokreslení příběhu nebo upozornění na nějakou hádanku případně můţe obsahovat definice kouzla. Tento předmět nemá ţádné speciální nastavení, co se týká XML. Tedy definice vypadá takto: - Scroll_4.png 0,0,32,32 0,32,68,17
49
50
KAPITOLA 4. IMPLEMENTACE
<equipped>0,49,32,32
Zdrojový obrázek:
Obrázek 34: Příklad zdrojového obrázku objektu Scroll
4.5.4.33 Chest Posledním speciálním objektem ve hře je Chest (neboli bedna). Jediný účel tohoto objektu je poskytnout hrdinovi moţnost nést více předmětů, neţ má místo v inventáři. Objekt také nemá ţádné speciální nastavení. XML definice vypadá takto: - Chest_5.png 0,0,32,32 0,32,92,66
A příslušný obrázek:
Obrázek 35: Příklad zdrojového obrázku předmětu Chest
Pokud se předmět vloţí hrdinovi do ruky, zobrazí se obsah bedny. V inventáři hrdiny se zobrazí takto:
Obrázek 36: Zdrojový obrázek objektu Chest pro použití v inventáři hrdiny
KAPITOLA 4. IMPLEMENTACE V jednotlivých přihrádkách se vykreslí předměty, které jsou vloţené v této bedně. 4.5.4.34 ProjectileData Třída ProjectileData poskytuje ve hře mechanismus pro projektily. Existují pouze dva druhy. Jsou to kouzla nebo předměty. Třída funguje tak, ţe se při vyvolání akce vytvoří instance této třídy, kde se určí v parametrech zdrojové souřadnice, pozice na podlaze a typ. O vlastní vykreslení se pak postará MapObject. Kouzla se vyvolávají pomocí panelu v uţivatelském rozhraní a při pouţití se vytvoří daná instance. V případě předmětů se instance vytvoří v případě, kdy hráč hodí s předmětem nebo při pouţití u speciálních objektů jako je například Launcher. Pokud chceme vytvořit projektil, zavoláme nějaký z moţných konstruktorů, kde se předává nejčastěji pozice projektilů v úrovni, směr. Jedním z parametrů je také síla, ale ta je například u kouzel vypočítaná z atributů hrdiny. 4.5.4.35 HeroData Tato třída je určená pro udrţování aktuálních statistik jednotlivých hrdinů. Jsou zde uloţeny veškeré statistiky hrdiny a jeho dovednosti. Konkrétně to jsou:
Ţivot, energie, magická energie
Síla, obratnost, moudrost, vitalita, obrana, odolnost proti magii Nosnost
Dále jsou zde také čtyři třídy dovedností:
Bojovník
Ninja
Alchymista
Kouzelník
Tyto dovednosti se zvyšují v průběhu hraní. Dovednost bojovníka se zvyšuje při pouţívání zbraní v boji. Dovednost ninja se zvyšuje například při házení s předměty. Dovednost alchymisty se zvyšuje při kouzlení různých lektvarů. Dovednost kouzelníka se zvyšuje pouţíváním různých kouzel, nejčastěji útočných. Třída HeroData má tyto základní metody a proměnné:
public String Name – V této proměnné je uloţeno jméno hrdiny.
public String LastName – V této proměnné je uloţeno přijmení hrdiny.
V následující tabulce je přehled základních statistik hrdinů a také proměnné, ve kterých jsou uloţené aktuální a maximální hodnoty.
51
52
KAPITOLA 4. IMPLEMENTACE
Název statistiky Ţivot Energie Magická energie Síla Obratnost Inteligence Moudrost Vitalita Obrana Odolnost proti magii
Definice proměnné Aktuální hodnota Maximální hodnota public int Health
public int MaxHealth
public int Stamina
public int MaxStamina
public int Mana
public int MaxMana
public int Strength public int Dexterity public int Intelligence public int Wisdom public int Vitality public int Defense public int MagicResist
Tabulka 3: Přehled proměnných, které obsahují statistiky hrdiny
V těchto proměnných jsou uloţeny třídy dovedností hrdiny:
public int FighterLevel
public int NinjaLevel
public int PriestLevel public int WizardLevel
Povolené hodnoty jsou od 0 do 15. Jednotlivé úrovně dovedností jsou také reprezentovány i názvy: Hodnota úrovně Název 0 1 Neophyte 2 Novice 3 Apprentice 4 Journeyman 5 Craftsman 6 Artisan 7 Adept 8 Expert 9 LO Master 10 UM Master 11 ON Master 12 EE Master 13 PAL Master 14 MON Master 15 Archmaster
KAPITOLA 4. IMPLEMENTACE Tabulka 4: Přehled slovních názvů úrovní dovedností
Další proměnné obsahují předměty uloţené v inventáři hrdiny: public Item Weapon – V této proměnné je uloţen předmět, který je vloţen v inventáři hrdiny na místě pro zbraň. public Item Head – V této proměnné je uloţen předmět, který je vloţen v inventáři na místě hlavy. public Item Torso – V této proměnné je uloţen předmět, který je vloţen v inventáři na místě pro tělo. public Item Legs – V této proměnné je uloţen předmět, který je vloţen v inventáři na místě stehen hrdiny. public Item Feet – V této proměnné je uloţen předmět, který je vloţen v inventáři na místě nohou hrdiny. public Item Hand – Zde je uloţen předmět, který je vloţen v levé ruce.
public Item Neck – Zde je uloţen předmět, který je vloţen na místě krku
v inventáři.
public Item Pouch1 – Zde je uloţen předmět, který je vloţen do první
přihrádky opasku v inventáři hrdiny. public Item Pouch2 – Zde je uloţen předmět, který je vloţen v druhé přihrádce opasku v inventáři.
public Item[] Pack – V tomto poli jsou uloţené předměty, které má
hrdinqa vloţen v batohu v inventáři.
public Item[] Quiver – V tomto poli jsou uloţené předměty, která má
hrdina vloţené v toulci. 4.5.4.36 Lokalizace Hra podporuje lokalizaci textových řetězců hry. Veškerou práci s lokalizací zajišťuje třída Localization. Tato třída načítá při startu aplikace z XML souboru v hlavním souboru gamedata.zip řetězce pro nastavený jazyk aplikace. Třída zároveň umoţňuje definovat i lokalizace pro vlastní hru. Vlastní načtení se pak provádí při načítání nové vlastní hry. Třída obsahuje pouze tři metody:
public void LoadFromGameData() - Tato metoda načte lokalizační
řetězce z XML, který je v gamedata.zip a obsahuje nejdůleţitější poloţky rozhraní.
public void LoadFromCustomGame() - Tato metoda načte lokalizační
řetězce z vlastní hry. XML musí být uloţené v adresáři misc v archivu hry.
public string GetLocalizationString(string name) - Tato
metoda vrací hodnotu řetězce, jehoţ identifikátor je zadán v parametru name.
53
54
KAPITOLA 4. IMPLEMENTACE Hodnota parametru name musí souhlasit se jménem uzlu v příslušném lokalizačním XML souboru.
4.6
Popis základní umělé inteligence
Jeden z důleţitých aspektů hry je také umělá inteligence nepřátel. Ve hře se nachází rozličné druhy nepřátel, kteří se vyznačují svým specifickým chováním a také speciálními druhy útoků. Někteří nepřátelé jsou odolní proti specifickým kouzlům. V této části stručně popíšu implementované základní chování nepřátel.
4.6.1
Základní chování nepřátel
Umělá inteligence nepřátel není nijak komplikovaná. Většina základních nepřátel si zjišťuje, kde se nachází skupina hrdinů a snaţí se k nim přiblíţit a poté zaútočit. Od toho se pak odvíjí následující chování. V kaţdém chování probíhá testování pozic x a y, aby se určil směr, kterým se nepřítel musí vydat a pokud můţe, tak poté zaútočí na skupinu. 4.6.1.1
Výchozí útok
Výchozí útok pouţívá většina nepřátel ve hře. Při tomto chování se nepřítel přibliţuje ke skupině hrdinů, dokud se nezastaví před ní. Po té zahájí útok. Při útoku lze pouţívat různé zbraně nebo házet předměty. Lze také pouţívat i různá kouzla nebo léčit samo sebe. 4.6.1.2
Pohyb dopředu
Pokud nepřítel zjistí, ţe se poblíţ nachází skupina hrdinů, pouţije tuto metodu, aby se k ní následně dostal. Při pohybu se musí testovat, jaké objekty se nachází poblíţ a zda jde jimi projít. Tato metoda se částečně kryje s předchozí. 4.6.1.3
Útěk od skupiny hrdinů
Při tomto chování dochází k útěku nepřítele od skupiny hrdinů. Toto chování lze vyuţít u nepřátel, kteří například ukradnou hrdinovi předmět z ruky a dají se následně na útěk. Další vyuţití je, kdyţ je nepřítel blízko smrti a nedokáţe se jiţ sám uzdravit, dá se také na útěk. 4.6.1.4
Útok na dálku
Pokud nepřítel zjistí, ţe se před ním nachází skupina hrdinů a má moţnost pouţití kouzel, zaútočí na ni z dálky. Tento útok se od normálního liší v tom, ţe si nepřítel drţí odstup od skupiny. Metodu nejčastěji pouţívají například kouzelníci. Podmínkou je tedy, ţe nepřítel musí mít definovaná pouţitelná kouzla nebo předměty, jinak nelze tento útok provést.
KAPITOLA 4. IMPLEMENTACE 4.6.1.5
Náhodný útok
Tento druh útoku je jen náhodný výběr mezi výchozím útokem a pohybem směrem ke skupině hrdinů. 4.6.1.6
Přátelské chování
Při pouţití této metody dochází pouze k náhodnému pohybu nepřítele po úrovni a přitom se nesnaţí útočit na skupinu hrdinů.
4.6.2
Třída Monster
Třída Monster reprezentuje ve hře nepřátele. Obsahuje několik vlastností, které ovlivňují chování nepřítele a pak také metody pro pohyb a útoky. XML definice je následující: <monster name="Mummy"> mummy.png 0,0,114,218 0,218,114,218 0,436,114,218 0,654,114,218
Ukázka obrázku nepřítele, jehoţ XML definice je ve výše uvedeném:
Obrázek 37: Příklad zdrojového obrázku nepřítele Mummy. První obrázek ukazuje stav, kdy nepřítel stojí před hráčem. Druhý obrázek ukazuje stav, kdy nepřítel utíká od skupiny. Třetí obrázek ukazuje pohled z boku na nepřítele. Poslední obrázek se vykreslí v případě útoku na skupinu.
55
56
KAPITOLA 4. IMPLEMENTACE
Nejdůleţitější proměnné třídy:
public List- Carrying - V této proměnné jsou uloţeny předměty,
které nepřítel nese. Tyto předměty zůstanou na místě po zabití nepřítele nebo je můţe pouţít pro útok. Následující proměnné specifikují regiony, pomocí kterých se ze zdrojového obrázku vykreslí správný obrázek pohledu na nepřítele.
public Rectangle TowardsPic – Tato proměnná odpovídá pohledu, kdy
nepřítel příchází ke skupině hrdinů.
public Rectangle AwayPic – Tato proměnná odpovídá pohledu, kdy
nepřítel utíká od hráče.
public Rectangle LeftPic – Tato proměnná odpovídá pohledu,kdy se na
nepřítele koukáme zleva.
public Rectangle AttackPic – Tato proměnná odpovídá pohledu, kdy
nepřítel útočí na skupinu.
public Rectangle CastPic – Tato proměnná odpovídá pohledu, kdy
nepřítel útočí na hráče pomocí kouzel.
public string Image - V této proměnné je uloţený zdrojový obrázek
nepřítele z archivu vlastní hry.
public bool HasMagic – Tato proměnná určuje, ţe nepřítel smí pouţívat
kouzla.
public bool HasHeal – Tato proměnná zase určuje, ţe nepřítel se smí sám
léčit pomocí kouzel například.
public bool IsImmaterial - Pokud je tato proměnná nastavena na true,
nepřítel můţe procházet zdmi a neplatí na něj klasická útočná kouzla, ale kouzla pouze pro duchy.
public bool IsFlying - Tato proměnná určuje, zda se nepřítel vznáší nad
podlahou. Pokud nepřítel má nastaveno tuto proměnnou na true, pak nemůţe například propadnout dírou do další úrovně.
public bool CanTeleport - Pokud je nastavena tato proměnná na true,
nepřítel se můţe teleportovat po úrovni. Většinou se lze teleportovat 5 políček kolem sebe. V následujících proměnných je uloţena pozice nepřítele v úrovni:
public public public public
int int int int
Level Y X Subsquare
V těchto proměnných jsou uloţené právě prováděné akce nepřítelem:
KAPITOLA 4. IMPLEMENTACE
public bool IsAttacking – Proměnná má hodnotu true, kdyţ nepřítel
právě útočí na hrdiny.
public bool IsCasting – Proměnná má hodnotu true, kdyţ nepřítel právě
kouzlí.
public bool IsDying – Tato proměnná má hodnotu true, kdy nepřítel
právě umírá.
public int Number – V této proměnné je uloţeno unikátní číslo nepřítele.
public String Name – V této proměnné je uloţeno jméno nepřítele.
V následujících proměnných jsou uloţeny základní statistiky nepřítele:
public int Mana – V této proměnné je uloţena aktuální hodnota magické
energie.
public int MaxMana – V této proměnné je uloţena maximální hodnota
magické energie nepřítele.
public int Health – V této proměnné je uloţen aktuální ţivot nepřítele.
Pokud hodnota klesne pod 20% většinou se dává nepřítel na útěk. public int MaxHealth – V této proměnné je uloţen maximální ţivot nepřítele.
V následujících proměnných jsou uloţeny další atributy, které ovlivňují chování nepřítele:
public int Power - V této proměnné je uloţena síla nepřítele. Hodnota je
pak pouţita při výpočtu poškození, které utrpí hrdina.
public int Defense - V této proměnné je uloţena obrana nepřítele. Pokud
je hodnota vyšší, hrdina při útoku má niţší šance, ţe nepřítele zasáhne.
public int MagicResist - V této proměnné je uloţena odolnost nepřítele
proti kouzlům.
public int Speed - Zde je uloţena základní rychlost nepřítele.
public int MoveSpeed - V této proměnné je uloţena rychlost pohybu
nepřítele po úrovni.
public int AttackSpeed - Zde je uloţena rychlost útoku nepřítele na
hrdiny. V následujících proměnných je uloţena hodnota, která odpovídá některému z výše popsaných chování nepřátel:
57
58
KAPITOLA 4. IMPLEMENTACE
public int CurrentAI – Zde je uloţena aktuální hodnota chování
nepřítele. Tato hodnota se můţe lišit od nastaveného výchozího chování nepřítele. public int DefaultAI – V této proměnné je uloţeno výchozí chování nepřítele. Moţné hodnoty jsou: o RANDOM – Tato hodnota odpovídá náhodnému útoku popsaného v části 4.6.1.5 o GOTOWARDS – Tato hodnota odpovídá pohybu dopředu popsaného v části 4.6.1.2 o STAYBACK – Tato hodnota odpovídá útoku na dálku popsaného v části 4.6.1.4 o RUN – Tato hodnota odpovídá útěku od nepřítele popsaného v části 4.6.1.3 o GUARD – Tato hodnota odpovídá výchozímu chování popsaného v části 4.6.1.1 o FRIENDLYMOVE – Tato hodnota odpovídá přátelskému chování popsaného v části 4.6.1.6
Nejdůleţitější metody:
public bool CanDoProj(int d) – Tato metoda testuje, zda lze vykouzlit
projektil daným směrem v parametru d.
public bool CanMove(int d) – Tato metoda slouţí pro test, zda se
nepřítel můţe posunout daným směrem.
public int Damage(int hit, int type) - Metoda slouţí pro určení
poškození hrdiny nepřítelem. V prvním parametru hit se předává poškození hrdinovi a v parametru type se předává typ poškození.
public void DoAI() - Tato metoda provádí vlastní chování nepřítele ve
hře.
public void DoAttack() - Zavoláním této metody se provede útok
nepřítele na hráče.
public void DoProjAttack(int dir) - Tato metoda provede útok
pomocí projektilu. Projektily mohou být předměty nebo kouzla.
public void MonMove(int d) - Tato metoda zajišťuje pohyb nepřítele
po úrovni. Součástí je také detekce objektů kolem sebe.
public bool Teleport() - Zavoláním této metody dojde k teleportování
nepřítele po úrovni. Nejčastěji se teleportuje 5 políček okolo své původní pozice, přičemţ se testuje, zda se na cílové pozici nenachází zeď nebo jiný neprůchodný objekt.
KAPITOLA 4. IMPLEMENTACE
public void UseHealMagic() - Pokud má nepřítel méně neţ 20% ţivota
a má povoleno samoléčení, tato metoda mu vrátí zpět část ţivota.
4.7
Implementace uživatelského rozhraní aplikace
Celé grafické rozhraní aplikace je obsaţenou pouze v hlavní aplikaci. Hlavním prvkem aplikace je pak formulář System.Windows.Form. Formulář neobsahuje ţádné další komponenty .NET Frameworku a je nastaven na celou obrazovku. Aby bylo uţivatelské rozhraní nezávislé na rozlišení, jednotlivé prvky uţivatelského rozhraní se kreslí do bitmapy, která je uloţená v paměti. Po vykreslení všech prvků rozhraní se grafická knihovna postará o vykreslení této bitmapy do formuláře aplikace podle rozlišení obrazovky.
4.7.1
Implementace úvodní obrazovky
Na úvodní obrazovce se podle návrhu nachází tlačítka pro vstup do hry, načtení uloţené hry, nastavení aplikace, o aplikaci a ukončení aplikace. Výsledná obrazovka ze hry vypadá takto:
Obrázek 38: Úvodní obrazovka hry
4.7.2
Implementace výběru vlastní hry
Dialog pro výběr hry slouţí k výběru dostupných her. Tyto hry můţou být vytvářeny komunitou hráčů. Na následujícím obrázku je ukázka výběru výchozí úrovně, která je dostupná u ukázkové verze:
59
60
KAPITOLA 4. IMPLEMENTACE
Obrázek 39: Dialog výběru nové hry
4.7.3
Implementace rozhraní ve hře
Jak uţ bylo napsáno v návrhu, na hlavní obrazovce se nachází panely hrdinů, rozmístění hrdinů, zobrazení úrovně. Dále jsou zde panely pro kouzla, zbraně a pohyb. Na spodní části obrazovky je textový výstup hry.
Obrázek 40: Ukázka celého rozhraní aplikace
4.7.4
Implementace inventáře
Pokud hráč klikne na tři ukazatele v panelu hrdinů, zobrazí se inventář příslušného hrdiny. Vypadá to takto:
KAPITOLA 4. IMPLEMENTACE
Obrázek 41: Inventář hrdiny
Pokud hráč klikne na oko hrdiny, zobrazí se příslušné statistiky hrdiny:
Obrázek 42: Ukázka statistik hrdiny v inventáři
4.7.5
Implementace dialogu možnosti hry
Pokud hráč klikne v inventáři hrdiny na disketu, která se nachází v rozloţení vpravo nahoře, zobrazí se dialog moţností hry. V tomto dialogu lze hru uloţit, načíst. Dále lze aplikaci ukončit nebo se vrátit zpět do hry. Na následujícím obrázku je, jak tento dialog vypadá:
61
62
KAPITOLA 4. IMPLEMENTACE
Obrázek 43: Dialog možností hry
4.8
Přehled základních tříd aplikace Přehled jednotlivých celků aplikace ukazuje následující zjednodušený diagram:
Obrázek 44: Přehled tříd aplikace
KAPITOLA 4. IMPLEMENTACE Diagram zobrazuje skupiny tříd v jednotlivých blocích. V kaţdém bloku je napsáno, jaké třídy sem patří. Znak „*“ zastupuje libovolnou skupinu znaků. Pokud blok obsahuje jmenný prostor tříd, je to označeno jako „namespace“. Celá aplikace je tedy tvořena třemi základními částmi. V první části ve jmenném prostoru „CdmGame“ jsou obsaţeny třídy, které reprezentují v aplikaci různé dialogy hry. Ve jmenném prostoru „Components“ jsou uloţeny jednotlivé komponenty grafického rozhraní. V druhé části ve jmenném prostoru „MapObjects“ jsou uloţeny popsané objekty mapy. V „GraphicsInterface“ je uloţeno rozhraní, které musí implementovat grafický plugin. Jmenný prostor „IOGameFile“ obsahuje třídy pro práci se souborem mapy. Jsou zde třídy, které rozšiřují standardní binání ukládání do souboru o vlastní metody. Ve jmenném prostoru „Kernel“ je uloţeno hlavní jádro knihovny a také třída pro obsluhu zvuku a načítání definic z XML. Ve jmenném prostoru „GameApi“ jsou uloţeny třídy, které jsou pouţity pro udrţování stavu aplikace (třída GameStats) nebo je zde hlavní třída GApi, která obsahuje metody, které můţou vyuţívat aplikace kolem. Ve jmenném prostoru „Localization“ je uloţena třída pro práci s lokalizací aplikace. V posledním jmenném postoru „LayoutLoader“ jsou uloţeny třídy, které se starají o načítání definic obrázků pro předměty, nepřátele a kouzla. V poslední části je pouze jeden jmenný prostor a to „GameGraphics“, kde je uloţena třída, která realizuje vlastní grafický výstup. Tento přehled tříd je jen zjednodušená verze kompletního diagramu, který se nachází mezi fyzickými přílohami práce. V kompletním diagramu jsou znázorněny hierarchie objektů. Rovněţ v něm nejsou uvedeny metody a proměnné, protoţe jich je velmi mnoho.
63
64
KAPITOLA 4. IMPLEMENTACE
KAPITOLA 5. TESTOVÁNÍ
5. Testování 5.1
Základní testy
Aplikaci jsem testoval jiţ v průběhu vývoje hry, protoţe následné testování jiţ tak rozsáhlého programu ke konci vývoje není uţ jednoduché. K nacházení chyb mi velmi pomáhal debugger, který je součástí vývojového prostředí Visual Studio 2008. Testoval jsem nejen grafické prostředí hlavní aplikace, ale i funkci grafického pluginu. Dále jsem testoval různé manipulace s mapou (přidávání, odebírání, nahrazování objektů mapy) a základní chování umělé inteligence při různém nastavení. U grafického pluginu jsem ještě testoval, zda dokáţe vykreslit správně veškerou grafiku podle zadaných parametrů. Kvůli jiţ zmíněnému paměťovému omezení na jeden proces jsem musel otestovat chování grafického pluginu v případě nedostatku paměti. Na závěr testu jsem také vyzkoušel projít celou ukázkovou hrou a pozoroval výsledné vyuţití paměti. Výslednou aplikaci jsem také testoval na stabilitu a funkčnost na reálném mobilním zařízení HP iPAQ 214 s Windows Mobile 6.5, 128MB RAM a 4“ dotykový display s VGA rozlišením. Na závěr jsem také provedl test v emulátorech, které jsou dodávány v SDK pro .NET Compact Framework. V emulátorech s různým rozlišením jsem testoval, zda se grafika vykresluje nezávisle na rozlišení obrazovky a také, zda správně funguje vstup z obrazovky.
5.2
Usability test
Testování pouţitelnosti je experimentální metoda, která slouţí k testování různých softwarových produktů, uţivatelských rozhraní. Její podstatou je, ţe účastníci testu, kteří reprezentují typického uţivatele, mají stanovený seznam úkolů, které musí s testovaným rozhraním vykonat a jsou při tom sledování dalšími osobami. U testu můţe být přítomen i moderátor, jehoţ úkolem je pomoci účastníkovi testu v nesnázích, kdy není schopen ani po delší době splnit zadaný úkol. Schéma laboratoře můţe vypadat takto:
65
KAPITOLA 5. TESTOVÁNÍ
66
Obrázek 45: Ukázka usability laboratoře
5.2.1
Cílová skupina
Cílová skupina, pro kterou je můj produkt určen, se pohybuje ve věkovém rozmezí 13-50 let. U této skupiny se předpokládá, ţe vlastní telefon nebo chytré zařízení s operačním systémem Windows Mobile. Jelikoţ hra podporuje i lokalizaci, mohou si uţivatelé nastavit pro prostředí svůj nativní jazyk (v případě, ţe je dostupný). Aby bylo moţné test uskutečnit, musel jsem tedy oslovit uţivatele v daném věkovém rozmezí. Základním předpokladem je, ţe daní uţivatelé alespoň trochu znají tuto mobilní platformu a dokáţou ji ovládat. Tento poţadavek je důleţitý v tom, aby se rozlišily skutečné problémy ovládání uţivatelského rozhraní aplikace od problémů s ovládáním samotného zařízení.
5.2.2
Sada testů
Pro vlastní testování jsem připravil následující sadu úloh:
Test 1: Umí uţivatel spustit aplikaci?
Test 2: Umí uţivatel spustit novou hru?
Test 3: Orientuje se uţivatel v rozhraní ve vlastní hře?
Test 4: Umí uţivatel sebrat vybraného hrdinu ze zrcadla?
Test 5: Umí uţivatel sebrat předmět z úrovně a pouţít ho? Test 6: Dokáţe uţivatel pouţít kouzlo?
Test 7: Dokáţe uţivatel bojovat s nepřítelem?
Test 8: Dokáţe uţivatel změnit rozmístění druţiny v úrovni?
KAPITOLA 5. TESTOVÁNÍ
5.2.3
Test 9: Zvládne uţivatel uloţit rozehranou hru nebo ji ukončit?
Výsledky testů
Veškeré výsledky testů a zjištěné poznatky jsou uvedeny v 9 bodech. Dodávám, ţe hru testovali pouze dva uţivatelé. K testu jsem zapůjčil své zařízení.
Test 1. Oba dva uţivatelé aplikaci spustili bez problému na zařízení. Test 2. První uţivatel zvládl spustit novou hru po delším váhání. Druhý uţivatel spustil novou hru bez problémů, akorát se pozastavil nad nic neříkajícími šipkami v dialogu.
Test 3. První uţivatel se v rozhraní zorientoval po delší době. Druhý uţivatel se zorientoval rychle.
Test 4. První uţivatel zvládl sebrat hrdinu ze zrcadla po delší době bloudění úrovní. Druhý uţivatel dokázal sebrat hrdinu ze zrcadla bez problémů. Test 5. První uţivatel chvíli váhal a po té ho napadlo kliknout na předmět na zemi a pak ho vloţit do ruky hrdinovi. Druhý uţivatel bez problémů sebral předmět a dokázal ho po chvíli vloţit hrdinovi do ruky.
Test 6. Prvnímu uţivateli vadily malé symboly na panelu. Po vysvětlení funkcí symbolů a ukázání tabulky kouzel nakonec kouzlo dokázal vykouzlit. Druhý uţivatel vykouzlil kouzlo bez problémů pomocí ukázané tabulky kouzel. Test 7. První uţivatel zvládl boj s nepřítelem bez větších problémů. Také druhý uţivatel si poradil s bojem bez problémů.
Test 8. Po delším váhání a následném vysvětlení ovládání panelu uţivatel zvládl změnit rozloţení skupiny. Druhý uţivatel po chvíli dokázal sám změnit rozloţení skupiny.
Test 9. První uţivatel se dokázal dostat po chvíli do dialogu moţností, ale zde byl mírně zmaten u volby Zrušit a popisku dialogu. Druhý uţivatel chvíli tápal, jak se dostat k dialogu, nakonec se k němu dostal a dokázal hru uloţit a ukončit.
67
KAPITOLA 5. TESTOVÁNÍ
68
5.2.4
Závěry na základě testů
Z testu mi vyplynula jedna velmi důleţitá věc, ţe u tohoto typu her je důleţité uţivateli vysvětlit její ovládání. Uţivatelé se dobře zorientovali v jednoduchých dialozích pro spuštění hry, uloţení atd., ale problémy jim uţ dělalo samotné uţivatelské rozhraní ve hře. Některé obrázky totiţ nejsou úplně intuitivní, jak se při návrhu zdálo. Z tohoto testu jsem došel k závěru, ţe je nutné uţivatelům předem sdělit, jak se daná hra ovládá. Nejlepší moţností je průvodce přímo na začátku hry, kdy budou názorně vysvětleny základní prvky ovládání v interaktivním průvodci. Dále je nutné zvětšit symboly kouzel, protoţe nejspíše na zařízeních s menší obrazovkou můţe dělat volba kouzel problémy. Respektive nebude snadné se trefit na daný symbol. Poslední úprava se týká popisku tlačítka herního dialogu, kdy je vhodné změnit popisek tlačítka „Zrušit“ například za „Zpět“.
KAPITOLA 6. ZÁVĚR
6. Závěr Zhodnocení
6.1
V práci jsem se zabýval návrhem a implementace hry, která čerpá z motivů legendární hry Dungeon Master. V analýze jsem provedl srovnání dostupných grafických knihoven a knihoven pro zvuk. Na základě těchto výsledků jsem určil některé cíle práce:
Hra je nezávislá s výchozími knihovnami na rozlišení cílového zařízení
Hra běţí na všech zařízeních s Windows Mobile 2003 a novější
Ve hře lze pouţít zvuky a hudbu
Hra má nezávislé rozhraní pro vykreslování
Lze vytvářet vlastní hry s vlastní grafikou nepřátel, předmětů a prvků úrovně
Celý program jsem měl moţnost zkoušet na svém mobilním zařízení s Windows Mobile, kde jsem si ověřil správnou funkčnost aplikace. Po té jsem také hru otestoval v emulátorech s různým rozlišením, abych si ověřil nezávislost na rozlišení. Díky částečné přenositelnosti Frameworku lze tuto hru také spouštět také jako klasickou desktopovou aplikaci, přičemţ nejsou nutné ţádné rozsáhlé modifikace kódu. Jen se musí vyhýbat specifickým třídám, které jsou vypuštěny z mobilního frameworku z důvodů různých optimalizací běhu. Pravidla hry jsou velmi podobná principům hry Dungeon Master. Proto hru ocení skalní příznivci této hry a mohou tak vytvářet vlastní úrovně i se sloţitými hádankami nebo se pokusit předělat úrovně původní hry Dungeon Master 1 a 2. Na většinu grafiky hry jsem pouţil volně dostupné obrázky, které jsou určené pro vylepšení vzhledu původního rozhraní nebo úrovní z různých klonů této legendární hry. Aplikace také obsahuje i moje vlastní dokreslené obrázky. Myslím, ţe se mi implementace hry povedla, proto počítám v budoucnu v podpoře hry, co se týká opravy dalších dosud nenalezených chyb nebo implementaci nových vlastností. K aplikaci je také přiloţen program, který dokáţe stáhnout a nainstalovat nové aktualizace hry ze serveru a tím zefektivnit případnou distribuci nové verze. V budoucnu také zvaţují přepsání do jazyku Java, aby byla hra moţná hrát i na mobilních zařízeních s operačním systémem Android. K tomu lze také vyuţít znalostí z absolvovaných předmětů, hlavně ohledně OpenGL. Přičemţ obě aplikace zůstanou nadále volně šiřitelné. Lze také znovupouţít většinu kódu pro novou platformu Windows Phone 7, která pro vývoj aplikací pouţívá C# a XNA Framework.
69
KAPITOLA 6. ZÁVĚR
70
6.2
Další možnosti vylepšení
Hra poskytuje hodně moţností, jak lze vytvářet vlastní hry. Přesto v této chvíli mě napadají ještě další moţnosti vylepšení, která ale uţ přesahují rámec této práce: Jedním ze zajímavých prvků by byla implementace jemnějšího pohybu po úrovni. Jedna moţnost je, ţe si po provedení pohybu ještě před vlastním vykreslení uloţím do paměti výslednou vykreslenou scénu a tu vykreslím 2x. V prvním kroku nakreslím výřez, který bude mít hranici například v polovině stěny a v druhém kroku výsledný obraz. Ve hře také neexistuje ţádná interakce s jinými postavami ve hře. Jedním z moţných rozšíření je implementace tzv. NPC postav. Pak můţe tvůrce nové hry pouţívat různé dialogy pro konverzaci mezi postavami napříč hrou. Původní hra Dungeon Master 2 obsahuje jedno vylepšení oproti prvnímu dílu, ţe lze útok na nepřítele provádět za pouţití zbraní z obou rukou. Toto vylepšení ale vyţaduje změnu uţivatelského rozhraní hlavní obrazovky, protoţe na nové prvky jiţ zde není místo. Dalším moţným vylepšením je podpora animovaných obrázků v inventáři. Například by takto šlo signalizovat úroveň nabití jednotlivých zbraní nebo efekty různých lektvarů. Pokud bude v aplikaci podpora pro animace, další moţné vylepšení je přidání animací do různých objektů úrovně a také pro různé efekty nepřátel. V této hře dokáţou nepřátelé utíkat z boje. Jedno z moţných vylepšení je, ţe by nepřítel mohl pouţít i schody pro útěk z úrovně.
KAPITOLA 7. LITERATURA
7. Literatura [1]
Role-playing game – Wikipedia http://en.wikipedia.org/wiki/Role-playing_game
[2]
Dungeon Master – Wikipedia http://en.wikipedia.org/wiki/Dungeon_master
[3]
Definice D&D – Wikipedia http://en.wikipedia.org/wiki/D%26D
[4]
Domovská stránka knihovny GapiDraw http://www.gapidraw.com/
[5]
Oficiální stránka knihovny PocketFrog http://pocketfrog.sourceforge.net/
[6]
Domovská stránka knihovny PocketHAL http://www.droneship.com/wiki/index/
[7]
Domovská stránka GDI+ http://msdn.microsoft.com/en-us/library/aa984108(v=VS.71).aspx
[8]
Domovská stránka knihovny WMGL http://www.mobilityflow.com/products/wmgl/
[9]
Oficiální stránky knihovny GAPI http://msdn.microsoft.com/en-us/library/aa145791.aspx
[10]
Oficiální stránky knihovny DirectDraw pro Windows Mobile http://msdn.microsoft.com/en-us/library/ms879875.aspx
[11]
Oficiální stránka knihovny FMOD http://www.fmod.org/
[12]
Oficiální stránka knihovny Hekkus Sound System http://www.shlzero.com/modules.php?name=Content&pa=showpage&pid=1
[13]
Effective Memory, Storage, and Power Management in Windows Mobile 5.0 http://msdn.microsoft.com/en-us/library/aa454885.aspx
[14]
Algoritmus LRU http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used
[15]
Dungeon Master Java projekt
71
72
KAPITOLA 7. LITERATURA http://homepage.mac.com/aberfield/dmj/download.html
[16]
Germanja.de Dungeon Master Java NewGFX-Project http://germanja.de/mirror/index.php?fchk=1
[17]
Dungeon Master Encyclopaedia http://dmweb.free.fr/
[18]
Dungeon Master Community Forum http://www.dungeon-master.com/forum/
[19]
Amadeo M. 1001 tipů a triků pro C#. Computer Press s. r. o., Brno, 2008
[20]
Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson, Morgan Skinner. C# 2008 Programujeme profesionálně. Computer Press s. r. o., Brno, 2009
PŘÍLOHA A – UŽIVATELSKÁ PŘÍRUČKA
73
Příloha A – Uživatelská příručka Uţivatelská příručka popisuje dostupné funkce a ovládání celé hry.
Instalace hry Hra je distribuovaná jako standardní instalační .cab archiv. Proto stačí tentou soubor spustit. Při instalaci si lze zvolit, zda se hra nainstaluje do úloţiště nebo na externí kartu. Hra samozřejmě podporuje i spouštění z externí karty.
Spuštění hry Po spuštění hry se objeví hlavní menu, které obsahuje poloţky na následujícím obrázku.
Obrázek 46: Vstupní obrazovka hry
Zahájení nové hry Po stisknutí tlačítka Vstoupit se otevře dialog, kde je na výběr dostupné hry. Šipkami do stran se lze přepínat mezi dostupnými hrami. Stisknutím tlačítka OK se spustí načítání zvolené hry.
74
PŘÍLOHA A – UŽIVATELSKÁ PŘÍRUČKA
Obrázek 47: Dialog výběru hry
Pohyb ve hře Pohyb ve hře se realizuje kliknutím na příslušné šipky v panelu pro pohyb. Šipky symbolizují, jakým směrem se daný pohyb provede.
Obrázek 48: Panel pro pohyb v úrovni
Výběr hrdiny V základní hře se nachází hrdinové na začátku první úrovně v zrcadlech. Pro výběr hrdiny je nutné dojít před zrcadlo a kliknout na něj. Po kliknutí se zobrazí inventář, kde si lze prohlédnout vše, co hrdina má u sebe za věci. Také si kliknutím na oko lze prohlédnout statistiky hrdiny. Pokud chceme si hrdinu vzít, klikneme na obrázek s nápisem Resurrect. Kliknutím na Reincarnate se nastaví všechny dovednosti na první úroveň. Kliknutím na Cancel dojde k návratu do úrovně.
PŘÍLOHA A – UŽIVATELSKÁ PŘÍRUČKA
75
Obrázek 49: Ukázka inventáře hrdiny
Použití kouzel Všichni hrdinové mají moţnost pouţití kouzel. Jejich úspěšnost závisí na dovednostech kaţdého hrdiny a také na dostupné magické energii. Samotné kouzlení se provádí pomocí panelu kouzlení.
Obrázek 50: Panel kouzel
V horní části panelu se přepíná mezi hráči, kteří mají kouzlit. Vlastní kouzlení se provede výběrem symbolů z panelu. První řada symbolů značí sílu kouzla, druhá řada symbolů značí tzv. elementální vliv, třetí řada symbolů značí formu a poslední řada značí třídu. Hra podporuje základní kouzla původní hry Dungeon Master, jejichţ seznam je například v [17]. Kliknutím na sestavený seznam symbolů dojde k vykouzlení, v případě, ţe kouzlo dává smysl. V opačném případě se zobrazí hlášení o nesmyslném kouzle. Zelenou šipkou zpět se zruší poslední pouţitý symbol.
Boj s nepřáteli Vlastní souboj s nepřáteli se provádí pomocí panelu zbraní.
PŘÍLOHA A – UŽIVATELSKÁ PŘÍRUČKA
76
Obrázek 51: Panel pro boj s nepřáteli
V tomto panelu se zobrazí ikony zbraní, které drţí hrdinové v ruce. Kliknutím na ikonu zbraně se určí, který hrdina bude útočit. Pod těmito ikonami je zobrazen seznam funkcí a druhů útoků, které zbraň podporuje. Kliknutím na některou poloţku seznamu se provede daný útok.
Panel hrdinů Panel hrdinů slouţí k rychlé výměně předmětů v rukou hrdiny. Také se zde zobrazují základní statistiky hrdiny. Zeleně je signalizován aktuální ţivot, ţlutě energie a modře magická energie. Kliknutí na tyto ukazatele dojde k otevření inventáře daného hrdiny.
Obrázek 52: Panel hrdiny
Změna rozmístění hrdinů ve skupině Rozloţení hrdinů ve skupině je signalizování panelem rozmístění hrdinů, který se nachází v pravém horním rohu hlavní obrazovky.
Obrázek 53: Rozmístění hrdinů v úrovni
Jednotlivé barvy odpovídají barvám rámečků před jménem v panelu hrdinů, aby se dalo přesně rozlišit, která ikona hrdiny patří ke komu.
Inventář hrdiny Do inventáře hrdiny lze umisťovat předměty, které hráč nalezne během procházení hry. V levé části inventáře jsou přihrádky, do kterých lze umisťovat speciální předměty.
PŘÍLOHA A – UŽIVATELSKÁ PŘÍRUČKA
77
Nejčastěji to jsou různé kusy oblečení. Zde lze také do rukou vkládat předměty, stejně jako v panelu hrdiny.
Obrázek 54: Inventář hrdiny
V levé dolní části se nachází číselné vyjádření základních statistik. V horní části se nachází oko, kdy po kliknutí a drţení se zobrazí podrobnější statistiky hrdiny. V pravé části se nachází samotný inventář s přihrádkami pro 16 předmětů. V dolní části se nachází aktuální hodnota zatíţení hrdiny a jeho maximální nosnost, která se spočítá ze všech předmětů, které aktuálně nese. V případě přetíţení dojde ke zpomalení pohybu celé skupiny hrdinů.
Obrázek 55: Statistiky hrdiny v inventáři
V horní pravé části inventáře se nachází modrá ikona, která uvede skupinu hrdinů do reţimu odpočinku. Ikona diskety pak vyvolá dialog moţností hry a kliknutím na poslední ikonu dojde k zavření inventáře a návratu do úrovně.
78
PŘÍLOHA A – UŽIVATELSKÁ PŘÍRUČKA
Dialog možnosti hry V dialogu moţností hry se nachází volby pro uloţení a načtení hry. Je zde také tlačítko pro ukončení aplikace a tlačítko pro návrat zpět do aktuálně rozehrané hry.
Obrázek 56: Dialog pro volbu možností hry
PŘÍLOHA B – OBSAH PŘILOŽENÉHO CD
Příloha B – Obsah přiloženého CD Obsah CD:
Application – adresář s aplikací o Bin – obsahuje instalační .cab pro Windows Mobile se všemi potřebnými knihovnami o Src – obsahuje zdrojové kódy aplikace o Sdk – obsahuje zdrojová data ukázkové hry o Lib – obsahuje instalaci .NET Compact Frameworku pro Windows Mobile
Text o Pdf – elektronická podoba diplomové práce ve formátu pdf o Doc – elektronická podoba diplomové práce v podobě .docx pro Microsoft Office Word o Src – materiály, které jsou součástí diplomové práce, převáţně obrázky UML – obsahuje UML z diplomové práce
79
80
PŘÍLOHA B – OBSAH PŘILOŽENÉHO CD
PŘÍLOHA C – FYZICKÉ PŘÍLOHY DIPLOMOVÉ PRÁCE
Příloha C – Fyzické přílohy diplomové práce o CD disk s aplikací, zdrojovými kódy a textem diplomové práce o Listy s UML diagramy tříd aplikace
81