merge
[AntiTD.git] / report / report.tex
blob8531bf28f2a163eaa2e08069387a4a3bba81d7de
1 \documentclass[titlepage, a4paper, 12pt]{article}
2 \usepackage[swedish]{babel}
3 \usepackage[utf8]{inputenc}
4 \usepackage{verbatim}
5 \usepackage{fancyhdr}
6 \usepackage{graphicx}
7 \usepackage{parskip}
9 % SourceCode
10 \usepackage{listings}
11 \usepackage{color}
14 % Include pdf with multiple pages ex \includepdf[pages=-, nup=2x2]{filename.pdf}
15 \usepackage[final]{pdfpages}
16 % Place figures where they should be
17 \usepackage{float}
19 % SourceCode
20 \definecolor{keywordcolor}{rgb}{0.5,0,0.75}
21 \lstset{
22 inputencoding=utf8,
23 language=Java,
24 extendedchars=true,
25 basicstyle=\scriptsize\ttfamily,
26 stringstyle=\color{blue},
27 commentstyle=\color{red},
28 numbers=left,
29 firstnumber=auto,
30 numberblanklines=true,
31 stepnumber=1,
32 showstringspaces=false,
33 keywordstyle=\color{keywordcolor}
34 % identifierstyle=\color{identifiercolor}
37 % Float for text
38 \floatstyle{ruled}
39 \newfloat{kod}{H}{lop}
40 \floatname{kod}{Kodsnutt}
42 % vars
43 \def\title{AntiTD}
44 \def\preTitle{Laboration 4}
45 \def\kurs{Applikationsprogrammering i Java, HT-08}
47 \def\namn{Andreas Jakobsson}
48 \def\mail{dit06ajs@cs.umu.se}
49 \def\namnTva{Anton Johansson}
50 \def\mailTva{dit06ajn@cs.umu.se}
52 \def\pathtocode{$\sim$dit06ajn/edu/apjava/lab4}
54 \def\handledareEtt{Johan Eliasson, johane@cs.umu.se}
55 \def\handledareTva{Tor Sterner-Johansson, tors@cs.umu.se}
56 \def\handledareTre{Daniel Henriksson, danielh@cs.umu.se}
57 \def\handledareFyra{Johan Granberg, johang@cs.umu.se}
59 \def\inst{datavetenskap}
60 \def\dokumentTyp{Laborationsrapport}
62 \begin{document}
63 \begin{titlepage}
64 \thispagestyle{empty}
65 \begin{small}
66 \begin{tabular}{@{}p{\textwidth}@{}}
67 UMEÅ UNIVERSITET \hfill \today \\
68 Institutionen för \inst \\
69 \dokumentTyp \\
70 \end{tabular}
71 \end{small}
72 \vspace{10mm}
73 \begin{center}
74 \LARGE{\preTitle} \\
75 \huge{\textbf{\kurs}} \\
76 \vspace{10mm}
77 \LARGE{\title} \\
78 \vspace{15mm}
79 \begin{large}
80 \namn, \mail \\
81 \namnTva, \mailTva\\
82 \texttt{\pathtocode}
83 \end{large}
84 \vfill
85 \large{\textbf{Handledare}}\\
86 \mbox{\large{\handledareTre}}
87 \mbox{\large{\handledareTva}}
88 \mbox{\large{\handledareEtt}}
89 \mbox{\large{\handledareFyra}}
90 \end{center}
91 \end{titlepage}
93 \newpage
94 \mbox{}
95 \vspace{70mm}
96 \begin{center}
97 % Dedication goes here
98 \end{center}
99 \thispagestyle{empty}
100 \newpage
102 \pagestyle{fancy}
103 \rhead{\today}
104 \lhead{\footnotesize{\namn, \mail\\\namnTva, \mailTva}}
105 \chead{}
106 \lfoot{}
107 \cfoot{}
108 \rfoot{}
110 \cleardoublepage
111 \newpage
112 \tableofcontents
113 \cleardoublepage
115 \fancyfoot[LE,RO]{\thepage}
116 \pagenumbering{arabic}
118 \section{Problemspecifikation}\label{Problemspecifikation}
119 % Beskriv med egna ord vad uppgiften gick ut på. Är det någonting som
120 % varit oklart och ni gjort egna tolkningar så beskriv dessa.
121 Uppgiften för denna laboration är att implementera spelet \textit{Anti-Tower Defence} i Java. Kortfattat går ett typiskt sådant spel ut på släppa ut enheter med olika egenskaper på en bana på ett sådant sätt att de överlever till ett mål på banan. När ett antal enheter kommit i mål vinner man banan.
123 Kraven från specifikationen är uppdelade i tre nivåer där den första nivån är grundnivån. Här ska spelet implementeras med en uppdateringsfrekvens oberoende av datorns hastighet. Två stycken enheter med olika egenskaper ska finnas. En bana innehåller zoner där datorn kan placera ut torn och zoner där enheter kan röra sig. Vid vinst eller förlust ska användaren ha möjlighet att spela igen eller att avsluta applikationen. Alla renderingar ska ske med dubbelbuffring för att undvika flimmer.
125 I nivå två tillkommer ytterligare krav utöver de i grundnivån. Flera banor ska finnas och laddas från fil \textit{''levels.xml''}. Denna fil ska valideras mot en egen specifierad standard. Varje bana ska ha egna regler för hur många trupper i mål som krävs för att klara banan. Banor ska kunna ha flera alternativa vägar till mål. Slutligen ska highscores sparas och visas i applikationen med hjälp av servicen från laboration 3
127 I den sista nivån ska banan utökas med ''växlar'' där användaren kan påverka vilket håll trupperna rör sig i svängar. Dessutom ska enheter kunna påverkas av zoner de går över genom att zoner implementerar ett gränssnitt med en metod med t.ex. namnet \textit{landOn()}. En truppmedlem ska implementeras med egenskapen att den kan lägga ut teleporterplattor som andra enheter sedan kan landa på och förflyttas mellan. Till sist ska projektet finnas i JAR-filen \textit{AnitTD.jar} och gå att köra genom kommandot:
128 \begin{footnotesize}
129 \verb!> java -jar AntiTD.jar!
130 \end{footnotesize}
132 Problemspecifikation finns i original på sidan:\\
133 \begin{footnotesize}
134 \verb!http://www.cs.umu.se/kurser/5DV085/HT08/labbar/lab4.html/! (kontrollerad 090112) % DONE check
135 \end{footnotesize}
137 \subsection{Antaganden om problemspecifikationen}
138 I samtliga nivåer nämns i originalspecifikationen hur menyradens funktionalitet ska utvecklas. Specifika riktlinjer ges om hur menyalternativ ska byta namn beroende på applikationens tillstånd. Eftersom lösningen som presenteras i denna rapport hanterar namnbyten för de menyalternativ som för författarna känns relevant, görs antagandet att detta räcker för att visa att tekniken behärskas.
140 Vidare nämns ett gränssnitt som innehåller metod \textit{landOn()}. I denna lösning antas denna metod få förändras enligt tycke, t.ex. genom att låta metoden ta paramterar.
142 \section{Användarhandledning}\label{Anvandarhandledning}
143 % Förklara var programmet och källkoden ligger samt hur man kompilerar,
144 % startar och använder det. Förklara även översiktligt vad som händer
145 % när man använder de olika kommandona. Det räcker alltså inte att
146 % skriva "man skriver 'ant' för att kompilera", utan det måste även ingå
147 % en liten förklaring om vad som egentligen händer när man kör ant och
148 % varför det fungerar. Använd Internet eller litteratur för att själva
149 % ta reda på den information ni tycker känns relevant, dels för
150 % rapportens skull och dels för er egen. Kom ihåg att skriva tydliga
151 % (vetenskapliga) referenser!
153 Programmet ligger i katalogen:\\
154 \texttt{\pathtocode}
156 Källkoden ligger i underkatalogen \verb!src!.
158 Följande kommandon förutsätter att programmet \textit{Apache
159 Ant}\footnote{http://ant.apache.org/} är installerat. Verktyget
160 \textit{Ant} är ett byggverktyg som använder sig av specifikationen
161 lagrad i en XML-fil, oftast \textit{build.xml}, för att automatisera alla
162 nödvändiga operationen vid kompilering av ett projekt. Detta kan
163 innefatta all typ av filhantering, det vill säga kopiering,
164 borttagning och flyttning, men även själva kompileringen av
165 projektet. Verktyget kan ses som ett specialanpassat skript för att
166 kompilera hela projekt.
168 Programmet kompileras med kommandot:\\
169 \begin{footnotesize}
170 \verb!salt:~/edu/apjava/lab3> ant!
171 \end{footnotesize}
173 % TODO fix
174 % Det som händer vid anrop av kommandot ovan är att \textit{Ant} läser
175 % av filen \textit{build.xml} och letar efter standardkommandona att
176 % köra. I det här fallet är det operationerna som är definierade i
177 % XML-elementet \verb!<target />! med attributet \verb!name="dist"!. Se
178 % bildaga~\ref{app:build.xml} för mer information om vad som händer. Oftast
179 % har taggarna i \textit{build.xml} relativt självförklarande namn, de
180 % motsvarar i många fall direkta kommandon som går att köra i en
181 % terminal.
183 \section{Systembeskrivning}\label{Systembeskrivning}
184 % Beskriv översiktligt hur programmet är uppbyggt och hur det löser
185 % problemet.
187 \begin{figure}[H]
188 \begin{center}
189 \includegraphics[width=110mm]{images/Paintables.pdf}
190 \caption{UML klassdiagram}
191 \label{fig:image/Paintable}
192 \end{center}
193 \end{figure}
195 \subsection{Resurser}
196 Resurser som används av programmet men som inte är Java-filer ligger i
197 katalogen \verb!src/resources!. Nedan avsnitt beskriver de filer och
198 mappar som ligger i denna katalog.
200 \subsubsection{Filen levels.xml}\label{sec:levels.xml}
201 Filen \textit{levels.xml} innehåller standarduppsättningen av banor
202 spelet använder. Filen följer schemat \textit{levels.xsd} och kan
203 exempelvis vara utformad enligt kodsnutt \ref{kod:levels.xml}.
205 \begin{kod}
206 \begin{footnotesize}
207 \begin{verbatim}
208 <level name="MegaMap" unitsToWin="5">
209 <towers>
210 <tower type="BasicTower" />
211 <tower type="BasicTower" />
212 </towers>
213 <row>
214 <square type="BlockedSquare" />
215 <square type="StartSquare direction="RIGHT" />
216 <square type="PathSquare" />
217 <square type="BlockedSquare" />
218 </row>
219 <row>
220 <square type="BlockedSquare" />
221 <square type="BlockedSquare" />
222 <square type="GoalSquare" />
223 <square type="BlockedSquare" />
224 </row>
225 </level>
226 \end{verbatim}
227 \end{footnotesize}
228 \caption{Exempel XML}\label{kod:levels.xml}
229 \end{kod}
231 \subsubsection{Filen levels.xsd}\label{sec:levels.xsd}
232 Filer \textit{levels.xsd} innehåller ett XML-Schema
233 \footnote{http://www.w3.org/XML/Schema} som definierar hur giltiga
234 XML-dokument till spelet ska vara utformade. Se kodsnutt
235 \ref{kod:levels.xml} för exempel på ett giltigt dokument.
237 \subsubsection{Katalogen sounds}\label{sec:sounds}
238 Katalogen \textit{sounds} innehåller ljud som spelas upp i spelet.
240 \subsubsection{Katalogen map-images}\label{sec:map-images}
241 Katalogen \textit{map-images} innehåller bilder som används av klasser av
242 typen \textit{MapSquare} (se avsnitt \ref{sec:MapSquare}).
244 \subsubsection{Katalogen tower-images}\label{sec:tower-images}
245 Katalogen \textit{tower-images} innehåller bilder som används av klasser
246 av typen \textit{Tower} (se avsnitt \ref{sec:Tower}).
248 \subsubsection{Katalogen unit-images}\label{sec:unit-images}
249 Katalogen \textit{unit-images} innehåller bilder som används av klasser av typen \textit{Unit} (se avsnitt \ref{sec:Unit}).
251 \subsection{Paketet se.umu.cs.dit06ajnajs}
252 Paketet \textit{se.umu.cs.dit06ajnajs} är huvudpaket som används i
253 programmet. I detta paket ligger de klasser som startar och
254 kontrollerar körningen av hela programmet.
256 \subsubsection{AntiTD}\label{sec:AntiTD}
257 Klassen \textit{AntiTD} används för att en användare ska kunna starta
258 programmet. Här kan ett argument skickas med vid start som ska hänvisa
259 till en XML-fil som innehåller information om banorna som ska spelas i
260 spelet. Om inget argument anges kommer en förinställd fil att
261 användas, se \textit{levels.xml} sida
262 \pageref{sec:levels.xml}. XML-filerna ska följa schemat
263 \textit{levels.xsd}, se sida \pageref{sec:levels.xsd}.
265 \subsubsection{ATDController}\label{sec:ATDController}
266 Klassen \textit{ATDController} är programmets huvudklass. Enligt
267 design-mönstret \textit{Model-View-Controller} motsvarar denna klass
268 \textit{Controllern}, alltså den klass som kontrollerar hela
269 programmets exekvering. Från denna klass konstruktor skapas
270 motsvarande \textit{Model} och \textit{View}.
272 Det startas två viktiga trådar när denna klass skapas,
273 \textit{AnimationThread} och \textit{CreditThread}.
274 % TODO alogbeskr
276 \subsubsection{ATDModel}\label{sec:ATDModel}
277 Klassen \textit{ATDModel} hanterar informationen som behövs för varje
278 spel. Här finns en spelare (\textit{Player}), en lista med banor
279 (\textit{Level}), en lista med alla enheter (\textit{Unit})som är ute
280 på den aktiva banan, och så vidare. Denna information använder och
281 ändrar \textit{ATDController} och \textit{ATDView} läser
282 informationen.
284 \subsubsection{ATDView}\label{sec:ATDView}
285 Klassen \textit{ATDView} är spelets grafiska gränssnitt. Här ritas en
286 komponent ut som innehåller själva spelplanen och ett antal
287 komponenter för att styra spelets flöde finns. Metoder för att fästa
288 lyssnare på specifika komponenter finns för att \textit{ATDController}
289 ska kunna fästa lyssnare på dem.
291 \subsubsection{NoActiveStartSquareException}\label{sec:NoActiveStartSquareException}
292 \subsubsection{Paintable}\label{sec:Paintable}
293 \subsubsection{Player}\label{sec:Player}
295 \subsection{Paketet se.umu.cs.dit06ajnajs.agent}
296 \subsubsection{Agent}\label{sec:Agent}
297 Gränssnittet \textit{Agent}, implementeras av alla klasser som ska
298 agera under spelets gång, detta gäller för närvarande instanser av
299 underklasser till \textit{Unit} och \textit{Tower}. Gränssnittet
300 utökar gränssnitten \textit{Paintable}, \textit{Clickable} och
301 \textit{Cloneable}.
303 \subsubsection{AgentPrototypeFactory}\label{sec:AgentPrototypeFactory}
304 Klassen \textit{AgentPrototypeFactory} används för att skapa instanser
305 av underklasser till de abstrakta klasserna \textit{Tower} och
306 \textit{Unit}. Klassen är implementerad enligt designmönstret
307 \textit{Singleton}, det vill säga det får enbart finnas en instans av
308 denna klass under programmets körning. För att få tag på denna instans
309 används den statiska metoden \textit{getInstance()}.
311 I konstruktorn instansieras och sätts variabler som definierar de
312 olika enheterna, se beskrivning av \textit{Unit}, sida
313 \pageref{sec:Unit}, och \textit{Tower}, sida \pageref{sec:Tower}, för
314 vilka variabler som finns och vad de gör. Detta innebär att det inte
315 behöver skapas en ny klass för varje ny typ av enhet eller torn som
316 ska skapas, det går dock alltid att skapa unika beteenden genom att
317 göra en ny klass som utökar klassen \textit{Unit} och överlagrar någon
318 av dess metoder, till exempel \textit{act()}.
320 \subsubsection{Tower}\label{sec:Tower}
324 \subsubsection{BasicTower}\label{sec:BasicTower}
325 Klassen \textit{BasicTower} utökar den abstrakta klassen
326 \textit{Tower} och representerar det enklast möjliga tornet som finns
327 implementerat i detta spel. Klassen innehåller inga egna
328 implementationer utan ärver metoderna i \textit{Tower} rakt av.
330 \subsubsection{Unit}\label{sec:Unit}
331 Den abstrakta klassen \textit{Unit} ska utökas av underklasser för att
332 skapa representationer av enheter som ska kunna agera i ett
333 spel. En enhet består av ett flertal attribut som kommer att definiera
334 stora delar av dess utseende och beteende. Exempelvis finns en tabell
335 som innehåller olika bilder för varje rikting enheter har, en annan
336 tabell innehåller ljud för olika tillfällen.
338 Metoder med logik för att flytta enheten finns implementerade, bland
339 dessa är \textit{act()} och \textit{collision()} viktiga.
340 % TODO algobeskrivning nånstans här?
342 \subsubsection{FootmanUnit}\label{sec:FootmanUnit}
343 Klassen \textit{FootmanUnit} utökar den abstrakta klassen
344 \textit{Unit} och representerar den enklast möjliga enheten som finns
345 implementerat i detta spel. Klassen innehåller inga egna
346 implementationer utan ärver metoderna i \textit{Unit} rakt av.
348 \subsubsection{Direction}\label{sec:Direction}
349 Uppräkningen (''Enumeration'') \textit{Direction} innehåller olika
350 riktningar som är giltiga i spelet. Giltiga värden är \textit{UP,
351 DOWN, LEFT, RIGHT, NONE}. Riktningen \textit{NONE} finns med för att
352 hantera skapande av rutor i banredigeraren som ännu inte har någon
353 riktning.
355 \subsection{Paketet se.umu.cs.dit06ajnajs.map}
356 Paketet \textit{level} innehåller en samling klasser som har en koppling till en bana i spelet. En bana är uppbyggd utav rutor av olika karaktär.
358 \subsubsection{Clickable}\label{sec:Clickable}
359 Gränssnittet \textit{Clickable}, är ett gränssnitt med metod \textit{click()}. Instanser av \textit{Clickable} reagerar på metodanropet på olika sätt beroende på implementation.
361 \subsubsection{Traversable}\label{sec:Traversable}
362 Gränssnittet \textit{Traversable}, är ett gränssnitt med metod \textit{landOn()} vilket tar emot en \textit{Unit} som parameter och manipulerar denna beroende av tillståndet av instansen av \textit{Traversible}.
364 \subsubsection{Level}\label{sec:Level}
365 Klassen \textit{Level}, motsvarar en bana tänkt att användas i ett rutbaserat spel. Klassen implementerar gränsnitten \textit{Paintable, Cloneable, Clickable}. Banan kan alltså bland annat representeras grafiskt genom \textit{Paintable} och kan reagera på musklick genom \textit{Clickable}. Klassen innehåller en två-dimensionell lista vilket innehåller instanser av typen \textit{MapSquare}. Listor finns även med pekare till de rutor som representerar start- och målrutor.
367 \subsubsection{MapSquare}\label{sec:MapSquare}
368 Klassen \textit{Level}, är en abstrakt klass som motsvarar en ruta tänkt att användas för att kombineras till en bana i ett rutbaserat spel. Gränsnitten \textit{Paintable, Cloneable, Clickable} implementeras. Rutan kan alltså bland annat representeras grafiskt genom \textit{Paintable} och kan reagera på musklick genom \textit{Clickable}. Dessutom ärver klassen från \textit{Observable} för att kunna registrera lyssnare som sedan notifieras när en enhet går på rutan. Ett objekt av typen \textit{MapSquare} kan vara av typen \textit{PathSquare, TurnSquare, BlockedSquare, TowerSquare, BlockedSquare, StartSquare} och \textit{GoalSquare}. Typernas egenskaper beskrivs nedan.
370 \subsubsection{MapSquareFactory}\label{sec:MapSquareFactory}
371 Klassen \textit{MapSquareFactory}, används för att skapa nya instanser av olika implementationer av \textit{MapSquareFactory} från en sträng. Detta för att underlätta skapandet av nya sorters rutor. Designmönstret \textit{Singelton} implementeras för att säkerställa att en och endast en instans finns tillgänglig.
373 \subsubsection{PathSquare}\label{sec:PathSquare}
374 Klassen \textit{PathSquare}, representerar en vägruta och implementerar därför gränssnittet \textit{Traversible}. Enheter kan alltså befinna sig och färdas framåt på en ruta av denna typ. Klassen implementerar designmönstret \textit{Observer/Observable} tillsammans med klassen \textit{Tower} ur paketet \textit{agent}. När en enhet anropar en rutas \textit{landOn()}-metod notifieras kringliggande torn och pekaren till den anropande enheten skickas vidare till tornen (se \pageref{Tower})
376 \subsubsection{TurnSquare}\label{sec:TurnSquare}
377 Klassen \textit{PathSquare}, representerar en sväng och ärver från \textit{PathSquare}. Klassen innehåller en lista med giltiga riktningar samt ett attribut för den nuvarande vald riktning. När en enhet anropar metoden \textit{landOn()} som kontrollerar om enheten har passerat mittlinjen av rutan relativt enhetens riktning. Om det är sant tilldelas enheten rutans nuvarande valda riktning. Metoden \textit{click()} byter den nuvarande valda riktningen till nästa giltiga riktning samt roterar bilden till den nya riktningen.
379 \subsubsection{BlockedSquare}\label{sec:BlockedSquare}
380 Klassen \textit{PathSquare}, representerar en blockerad ruta. I nuvarande version innehåller klassen inga implementationer och fungerar enbart som en utfyllnad.
382 \subsubsection{TowerSquare}\label{sec:TowerSquare}
383 Klassen \textit{PathSquare}, representerar en ruta där torn kan placeras ut. Rutan kan innehålla en referens till ett torn och markeras då som upptagen.
385 \subsubsection{StartSquare}\label{sec:StartSquare}
386 Klassen \textit{PathSquare}, representerar en startruta som enheter kan släppas ut på. Den innehåller en kö där enheter lagras och släpper ut en efter en då detta inte skapar kollisioner mellan enheter. En startruta kan markeras med metoden \textit{click()} och detta sätter boolean \textit{active} till sann och i den grafiska representationen läggs en grön ram till runt rutan.
388 \subsubsection{GoalSquare}\label{sec:GoalSquare}
389 Klassen \textit{PathSquare}, representerar en målruta där enheter samlas in
394 % \subsubsection{MapSquarePrototypeFactory}\label{sec:MapSquarePrototypeFactory}
396 \subsection{Paketet se.umu.cs.dit06ajnajs.util}
397 Paketet \textit{se.umu.cs.dit06ajnajs.util} innerhåller främst klasser
398 för att hantera läsning och skrivning av XML, från och till filerna
399 där banor sparas. De flesta av dessa klasser är deklarerade som
400 \textit{final} och innehåller enbart statiska metoder.
402 \subsubsection{SoundPlayer}\label{sec:SoundPlayer}
403 Klassen \textit{SoundPlayer} används för att spela upp allt ljud som
404 finns i spelet. En variabel håller reda på om ljuden ska spelas eller
405 inte, det vill säga om användaren vill höra ljud till spelet eller om
406 spelet ska vara helt tyst.
408 \subsubsection{LevelEditor}\label{sec:LevelEditor}
409 Klassen \textit{LevelEditor} är ett litet program i sig. Klassen har
410 en \textit{main(String[]~args)-metod} vilket innebär att den kan
411 startas. Startas \textit{LevelEditor} kommer ett gränssnitt att visas
412 där användaren kan välja bland de olika typer av kartrutor (av typen
413 \textit{MapSquare}) och sedan klicka på en component för att ''rita''
414 ut och skapa en ny bana. Det finns en knapp \textit{Save map} för att
415 spara kartan som är gjord. Denna karta sparas till katalogen
416 \textit{resources} i root-katalogen från vilken programmet körs och
417 kommer att heta \textit{temp-levels.xml}. För att denna karta ska gå
418 att använda i spelet måste det läggas till information om vilken
419 riktning startrutor ska släppa ut nya enheter, hur många enheter som
420 behövs för vinst och vilka torn som ska finnas vid start.
422 \subsubsection{LevelsXMLOutputter}\label{sec:LevelsXMLOutputter}
423 Klassen \textit{LevelsXMLOutputter} är deklarerad som \textit{final}
424 och har en statisk metod för att skriva och konvertera en
425 \textit{Level} (\ref{sec:Level}) till en \textit{java.io.Writer}. I
426 den nuvarande implementationen sparas inte all nödvändig information
427 undan, enbart informationen som \textit{LevelEditorn} kan skapa
428 sparas.
430 \subsubsection{LevelsXMLParser}\label{sec:LevelsXMLParser}
431 Klassen \textit{LevelsXMLParser} har två metoder för att tolka XML-dokument som följer XML-schemat i avsnitt \ref{sec:levels.xsd} och bygga upp kompletta ban-instanser \textit{Level} (\ref{sec:Level}).
433 \subsubsection{XMLUtil}\label{sec:XMLUtil}
434 Klassen \textit{XMLUtil} har metoder för att ladda en fil, via \textit{java.net.URL} eller \textit{java.io.File}, och returnera ett dokument, \textit{org.jdom.Document}.
436 \section{Begränsningar}\label{Begransningar}
437 % Vilka problem och begränsningar har din lösning av uppgiften? Hur
438 % skulle de kunna rättas till?
440 % NOTE Antingen skriver vi bara om buggar här och låter icke-uppfyllda specpunkter ligga i diskussion eller så skiver vi båda och låter diskussion ta upp saker vi skulle vilja göra
442 \section{Reflektioner}\label{Reflektioner}
443 % Reflektioner - Var det något som var speciellt krångligt? Vilka
444 % problem uppstod och hur löste ni dem? Vilka verktyg använde ni? Hur
445 % upplevde ni de verktygen? + Allmänna synpunkter. Om ni har upplevt
446 % problem på grund av olika miljöer (i termer av operativsystem och
447 % liknande) så kan det även vara intressant att nämna det, samt motivera
448 % ert val av miljö.
450 \section{Testkörningar}\label{Testkorningar}
451 % Noggranna testkörningar där man ser att programmet fungerar som det
452 % ska.
453 I denna sektion presenteras några skärmdumpar från körningar av applikationen.
455 \begin{figure}[H]
456 \begin{center}
457 \includegraphics[width=110mm]{images/ingame1.png}
458 \caption{Skärmdump av applikationen}
459 \label{fig:ingame1}
460 \end{center}
461 \end{figure}
463 \begin{figure}[H]
464 \begin{center}
465 \includegraphics[width=110mm]{images/ingame2.png}
466 \caption{Skärmdump av applikationen}
467 \label{fig:ingame2}
468 \end{center}
469 \end{figure}
471 Figur \ref{fig:ingame1} och figur \ref{fig:ingame2} visar hela applikationen under ett pågående spel.
473 \begin{figure}[H]
474 \begin{center}
475 \includegraphics[width=110mm]{images/promptWinIngame.png}
476 \caption{Skärmdump av dialogruta ''Level completed''}
477 \label{fig:win}
478 \end{center}
479 \end{figure}
481 \begin{figure}[H]
482 \begin{center}
483 \includegraphics[width=110mm]{images/promptLose.png}
484 \caption{Skärmdump av dialogruta ''Level lost''}
485 \label{fig:lose}
486 \end{center}
487 \end{figure}
489 Efter att användaren vunnit eller förlorat en bana låses användargränssnittet och användaren får upp alternativ för fortsatt spel i dialogrutor så som figur \ref{fig:win} och figur \ref{fig:lose} visar. Enheter som fortfarande är ute på banan fortsätter att gå runt och kan dö eller gå i mål. Dock slutar poängräkningen.
491 \begin{figure}[H]
492 \begin{center}
493 \includegraphics[width=110mm]{images/promptHighscore.png}
494 \caption{Skärmdump av dialogruta ''Input highscore''}
495 \label{fig:highscore}
496 \end{center}
497 \end{figure}
499 När inga fler banor finns att spela får användaren möjlighet att skicka in sin ihoptjänade poäng till en highscore lista. Denna funktionalitet drivs av en webservice som ingick i den laboration som gjordes innan denna laboration.
501 \begin{figure}[H]
502 \begin{center}
503 \includegraphics[width=110mm]{images/menu_AntiTD.png}
504 \caption{Skärmdump av meny ''AntiTD''}
505 \label{fig:menu_antitd}
506 \end{center}
507 \end{figure}
509 \begin{figure}[H]
510 \begin{center}
511 \includegraphics[width=110mm]{images/menu_Help.png}
512 \caption{Skärmdump av meny ''Help''}
513 \label{fig:menu_help}
514 \end{center}
515 \end{figure}
517 Figur \ref{fig:menu_antitd} och figur \ref{fig:menu_help} visar de alternativ som döljer sig i menyraden. I figur \ref{fig:menu_antitd} syns det tredje alternativet \textit{Resume} vilket vid start heter \textit{Paus} men är nu i ett annat tillstånd eftersom applikationen vid detta tillfälle var pausat. Detsamma gäller för fjärde alternativet \textit{unMute} vilket börjar som \textit{Mute}. Figur \ref{fig:menu_help} visar menyalternativen \textit{Help} och \textit{About}. Dessa innehåller en kort beskrivning av spelets regler och mål respektive en kort beskrivning om vilka som skapat applikationen.
519 \begin{figure}[H]
520 \begin{center}
521 \includegraphics[width=110mm]{images/leveleditor1.png}
522 \caption{Skärmdump ''LevelEditor'', applikationen har just startat}
523 \label{fig:editor1}
524 \end{center}
525 \end{figure}
527 \begin{figure}[H]
528 \begin{center}
529 \includegraphics[width=110mm]{images/leveleditor2.png}
530 \caption{Skärmdump ''LevelEditor'', ''MapSquares'' av typen ''BlockedSquare''}
531 \label{fig:editor2}
532 \end{center}
533 \end{figure}
535 \begin{figure}[H]
536 \begin{center}
537 \includegraphics[width=110mm]{images/leveleditor3.png}
538 \caption{Skärmdump ''LevelEditor'', ''Mapsquares'' av typen ''PathSquare'', ''StartSquare'' och ''GoalSquare''}
539 \label{fig:editor3}
540 \end{center}
541 \end{figure}
543 \begin{figure}[H]
544 \begin{center}
545 \includegraphics[width=110mm]{images/leveleditor4.png}
546 \caption{Skärmdump ''LevelEditor'', ''Mapsquares'' av typen ''TurnSquare''}
547 \label{fig:editor4}
548 \end{center}
549 \end{figure}
551 I figur \ref{fig:editor1} till figur \ref{fig:editor4} visas skärmdumpar av testapplikationen för att skapa banor. En hel bana har skapats genom att klicka ut rutor av olika typ.
553 \section{Diskussion}\label{Diskussion}
554 % Diskutera om laborationen samt allmänt kring Web services och om hur
555 % och när det är användbart (och inte användbart). Saker som kan vara
556 % trevliga att ta upp är interoperabilitet, lite om prestanda, koncepten
557 % lös koppling och så vidare. Den här sektionen ska vara en betydande
558 % del av rapporten. Det är upp till er själva att ta reda på den
559 % information ni behöver, även om föreläsningsmaterialet kan vara
560 % väldigt användbart. Kom även här ihåg att referera till era källor
561 % (även om det är från föreläsningsmaterialet).
562 Projektet är implementerat enligt design-mönstret \textit{Model-View-Controller}. Resultatet diskuteras under rubriken \textit{Model-View-Controller}. I detta stadie finns en bra grund för att lägga till funktionalitet så som nya enheter och nya banrutor med speciella egenskaper samt att utveckla användargränssnittet. I nedanstående avsnitt \textit{Vidareutveckling} diskuteras olika möjligheter till vidareutveckling av spelet.
564 \subsection{Model-View-Controller}
565 % TODO Fill this section
566 Detta projekt har från inledning
568 \subsection{Vidareutveckling}
569 Nedan följer förslag på förändringar för att vidareutveckla spelet.
571 \subsubsection{Klass Item}
572 I inledningar av projektet planerades en abstrakt klass \textit{Item} som skulle representera en pryl vilken skulle kunna lagras i ett attribut i en MapSquare. Objekt av typen \textit{Item} skulle t.ex. kunna vara \textit{HealtItem, SpeedItem, CreditItem} som kan representera prylar som ger mer hälsa, ökad fart respektive ett antal crediter att handla med. Dessa prylar skulle användas genom att slumpmässigt läggas till i objekt av typen \textit{PathSquare} och alltså representeras grafiskt genom att rutan ritar ut prylen ovanpå sig. En ruta med en pryl på skulle sedan skicka vidare en inkommande enhets referens till prylen som i sin tur skulle manipulera enhetens attribut. En pryl med teleporterbeteende diskuteras under rubrik \textit{Unit av typen TeleportUnit} (se \pageref{TeleportUnit}).
574 \subsubsection{Unit av typen TeleportUnit}\label{TeleportUnit}
575 För att uppfylla nivå tre av denna laborations kravspecifikation krävs en enhet med möjlighet att placera ut så kallade teleport-plattor. Detta kan uppnås i detta projekt genom att skapa subklasser av \textit{Item} kallad t.ex. \textit{TeleportStartItem} och \textit{TeleportEndItem}. Prylen \textit{TeleportStartItem} skulle kunna bäras av en \textit{Unit} av typen \textit{TeleporterUnit} och kunna läggas ut på nuvarande ruta genom t.ex. musklick på enheten. Attribut som behövs i \textit{TeleportStartItem} är x- och y-koordinater till den tillhörande prylen \textit{TeleportEndItem} vilket i sin tur innehåller attribut för aktuell riktning som utsläppta enheter ska ha samt en kö där uppsamlade enheter läggs till för att sedan släppas ut en efter en då positionen är ledig. Algoritm för kollisionsdetektering skulle fungera på samma sätt som algoritmen som används när enheter släpps ut ur startrutor (se \pageref{StartSquare});
577 \subsubsection{Gränssnitt}
578 I nuläget startas första banan direkt när applikationen startar. Att få se en så kallad splash-screen (introduktionsbild) kan vara önskvärt och åtgärdas enkelt genom att i konstruktor för \textit{ATDController} lägga till ett metodanrop till metod i \textit{ATDView} som visar något och väntar på att användaren ska välja ett nytt spel.
580 I kontrollpanelen finns stora möjligheter till vidareutveckling då den nuvarande just täcker den funktionalitet som behövs för att köra spelet. Till en början skulle listan med tillgängliga units kunna bytas ut mot ikoner som visar enhetens grafiska representation. För att lättare kunna få en översikt över en enhets egenskaper skulle hälsa och hastighet kunna förmedlas med staplar istället för med text. Om listan byts mot ikoner finns även möjligheten att ta bort knappen \textit{Release Units} och låta användaren skicka ut önskad enhet genom att direkt klicka på enhetens ikon.
583 \bibliographystyle{alpha}
584 \bibliography{books.bib}
586 \newpage
587 \appendix
588 \pagenumbering{arabic}
589 \section{Källkod}\label{sec:kallkod}
590 % Källkoden ska finnas tillgänglig i er hemkatalog
591 % ~/edu/apjava/lab1/. Bifoga även utskriven källkod.
592 Härefter följer utskrifter från källkoden och andra filer som hör till
593 denna laboration.
595 \newpage
596 \subsection{AntiTD.java}\label{AntiTD.java}
597 \lstinputlisting{../src/se/umu/cs/dit06ajnajs/AntiTD.java}
599 \end{document}