%% PAVEL PROCHAZKA - bakalarska prace %%
\documentclass[12pt]{article}
\usepackage[tables,figures]{updiplom}
\usepackage[utf8]{inputenc}

\title{Hra Worms}

\author{Pavel Procházka}
\year{2011}
\date{DATE - TODO}

\docinfo{Pavel Prochazka}{Hra Worms}

\annotation{%
Z her, které ovlivnily svět, patří Worms k těm nejvýznamnějším. I díky tomu se stali námětem pro moji práci. Zejména je to implementace z roku 1995, která se objevila pro platformu DOS a využívala výkon tehdejších počítačů na maximum. Dnes jsou počítače mnohem rychlejší, a přesto je nutné se zabývat efektivitou programu. Z tohoto důvodu jsem se rozhodl implementovat Worms v jazyce C spolu s knihovnami z rodiny SDL a knihovnou MGEAN, která vzniká jako podpůrná vrstva. Výsledná hra podporuje všechny UNIXy a Windows. Moje implementace obsahuje základní principy v podobě hry týmů, používání různých zbraní a v destrukci prostředí. Hlavní výhodou mého řešení oproti originálu je svobodná licence, snadná rozšiřitelnost a také výrazně pokročilejší kvalita obrazu.}

\begin{document}
\newpage

\maketitle

\section{Úvod}
[TODO]
Worms je hra, která sice probíhá v tazích, avšak vykreslování světa probíhá čistě realtimově. To znamená, že cokoli může v daný okamžik reagovat s prostředím na základě fyziky. Vše, co se vykresluje musí být vykresleno v lidskému oku nepostřehnutelném čase.
\subsection{Původ hry Worms}

\subsection{Prostředí}
Prostředí je sestaveno z pozadí (background), země (landscape), moře a dalších dodatečných objektů jako jsou například mraky.
\subsection{Pravidla}
Samotná hra je postavena na přítomnosti různých týmů červů, jejichž primárním cílem, je zneškodnit ostatní týmy. Ten kdo zůstane jako poslední naživu vyhrál.
Týmy se střídají buď po výstřelu nebo po uplynutí časového limitu. Navíc probíhá střídání uvnitř týmů ve smyslu kruhového střídání.
\subsection{Zbraně}
 K destrukci nepřátel je možné využít arzenálu zbraní, nejzákladnější je bazooka. Bazooka po výstřelu, na základě směru, síly natažení a větru vystřelí náboj, který letí po trajektorii známou jako vrh šikmý. Po nárazu na zeminu exploduje a způsobí poškození červům v okolí, ale také zničí část prostředí. Ničení prostředí může být dobrá strategie na zničení nepřítele. 
[TODO more guns]
\subsection{Uživatelské rozhraní}
[TODO menu]

\section{Materiály a metody}
Pro účely napsání programu jsem použil jazyk C, který splňuje veškeré předpoklady pro napsání hry. Vykreslování nízkoúrovnňové grafiky zajišuje knihovna SDL, SDL\_image používám na načítání obrázků, SDL\_ttf na vykreslování písem. SDL\_mixer je přítomna pouze z důvodu možného rožíření o zvukové efekty.

\subsection{Architektura projektu}
Projekt je rozdělen do dvou nezávislých celků, které také odděleně vznikají. Podstatnou část prací na tomto projektu představuje knihovna MGEAN, která představuje poměrně obecný základ pro psaní dvojrozměrných her. MGEAN zajišťuje optimalizované vykreslování grafiky v reálném čase, obsahuje podporu pro klávesnici a myš. Samotná hra se pro účely projektu nazývaná Bazooworms, využívá MGEAN jako vrstvu, která odděluje programátora od nízkoúrovňových nesnází s knihovnou SDL.

\subsection{MGEAN - Micro Graphics Engine for All uNixes}
[Podrobná dokumentace bude doplnena]
MGEAN je knihovna, kterou jsem vyvinul nejen pro účely Worms, ale jako obecnou knihovnu umožňující napsání běžné 2D hry strategiemi počínaje a adventurami konče. Podstatnou myšlenkou, která provází celou knihovnu je jednoduché API s minimálním počtem exportovaných funkcí, které však mají zajišťovat co možná nejsilnější funkcionalitu. Knihovna operuje se stěžejním datovým typem, kterým je typ SPRITE. Tento pojem je dobře znám v počítačové a zejména herní branži již dlouhá léta. Představuje jakousi entitu, která může být vykreslena do herního světa, může se různě animovat, pohybovat, případně interagovat s prostředím. Cokoliv je pomocí knihovny vykresleno musí být SPRITE, navíc knihovna MGEAN vyžaduje aby byl zařazen na některém vykreslovacím zásobníku, má-li být zobrazen. Sprite je z pohledu jazyka C struktura (struct), která má povětšinou \"neviditelné\" proměnné. Jediná proměnná, která může být uživatelsky čtena je dest, představující cílovou vykreslovací oblast. Další proměnná type může být i uživatelsky přepsána. Zbylé proměnné jsou čistě záležitostí knihovny a uživatel do nich nesmí nijak zasahovat. Každému spriteu mohou být zasílány zprávy, které jsou vykonány jen pokud je k nim nainstalován callback. Každý sprite, může být také rozšířen o uživatelské sloty, do kterých lze ukládat libovolný pointer. Jak již bylo naznačeno výše, pro zařazení spriteu do vykreslování je nutné umístit jej na určitý zásobník, který představuje vrstvu. Vrstev může být neomezeně mnoho.
\\
Pro incializaci MGEANu je zapotřebí zavolat nejprve funkci MG\_init\_video() s parametry uvedenými v dokumentaci. Tato funkce zabaluje typický inicializační proces SDL. Od této chvíle již lze vytvářet libovolné spritey například pomocí MG\_make\_sprite(), která je nejpřímější jak vytvořit sprite a současně jej zařadit na implicitní vrstvu. Dále uživatelská aplikace musí implmentovat hlavní smyčku, ve které může v zásadě pouze volat MG\_draw\_stack() a kontrolovat splnění podmínky ukončení aplikace. Ve smyčce by však aplikace neměla nijak zasahovat do stavu knihovny. Za ní je nutné uvést funkci MG\_quit() pro korektní uvolnění zabraných prostředků knihovnou.
\\
Spritey se ovládají nikoli v hlavní smyčce ale pomocí callbacků. MGEAN zasílá několik málo zpráv v určitých situacích. Nejběžnější je zpráva \"on\_iter\". Tato zpráva je poslána spriteu, při každém překreslení scény (tzn. při zavolání MG\_draw\_stack()). Další jsou rozepsány podrobněji v dokumentaci.
\\
Knihovna je opatřená také implementací jedné ze základních datových struktur - seznamu. V MGEANu je implementován klasický spojový seznam, na němž je vystavěn párovaný seznam. Tyto datové struktury jsou široce používány nejen v knihovně MGEAN, ale jdou použít také u uživatelské aplikace. 
\\
Při práci s pixelovou grafikou se často využívá datového typu obdélník, v našem případě se jedná o SDL\_Rect. MGEAN implementuje důležité funkce pro práci s obdélníky. Jmenovitě jde o operaci průnik bodu s obdélníkém a průnik obdélníku s obdélníkem.
\\
V současné době MGEAN používá vysoce efektivní optimalizační techniku. Řeč je o tzv. dirty rects optimalizaci. Princip této techniky spočívá v líném vykreslování objektů. To v praxi znamená, že se překreslí jenom to, co bylo změněno. Například při pohybu spriteu se aktualizuje pouze oblast, kde objekt původně spočíval a nová oblast, kam se sprite pohnul. Tato technika bývá také široce používaná u GUI knihoven. Pro uživatelské překreslení oblasti lze použít uživatelskou funkci MG\_invalidate\_rect(). Navíc je možné použít doublebuffering, což je technika na odstranění nepříjemného prokládání obrazu při překreslování oblastí v grafické paměti.

\subsection{API wormsů}

\subsection{Algoritmy}

\subsection{Licence}



\end{document}

