Jarrrsss
[AntiTD.git] / report / report.tex
blob2615ed008f049ef5ebc21e092cf4dffadd67576a
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 Det som händer vid anrop av kommandot ovan är att \textit{Ant} läser
174 av filen \textit{build.xml} och letar efter standardkommandona att
175 köra. I det här fallet är det operationerna som är definierade i
176 XML-elementet \verb!<target />! med attributet
177 \verb!name="compile"!. Oftast har taggarna i \textit{build.xml}
178 relativt självförklarande namn, de motsvarar i många fall direkta
179 kommandon som går att köra i en terminal.
181 \subsubsection{Att använda det grafiska gränssnittet}
182 Ett spel startas automatiskt vid start men när som helst kan ett helt nytt spel startas genom att i menyraden välja \textit{AntiTD} och därefter \textit{New Game}. I menyn \textit{AntiTD} finns också andra självförklarande funktioner som \textit{Restart Level, Paus/Resume, Mute/unMute} och \textit{Quit}, se skärmdumpar från avsnitt \ref{Testkorningar}, sida \pageref{Testkorningar}. Till höger om spelplanen tillhandahålls en kontrollpanel där enheter markeras genom att klicka på dem i listan. Därefter, kontrollera att en lämplig startruta är markerad. En markerad startruta visas genom att ett grönt sträck ritas ut under startrutans bild. Tryck på knappen \textit{Release Unit} för att nu släppa ut enheten på banan. Manipulera enhetens frammarsch på banan genom att snurra på riktningspilarna i kurvor och korsningar. Detta görs genom att klicka på pilarna och dessa snurrar då runt till nästa giltiga riktning.
184 \section{Systembeskrivning}\label{Systembeskrivning}
185 % Beskriv översiktligt hur programmet är uppbyggt och hur det löser
186 % problemet.
188 Följande avsnitt beskriver de olika delarna av programmet uppdelat
189 paketvis med beskrivningar över vad de olika klasserna har för
190 funktion. Även en kort beskrivning över resurserna programmet använder
191 när det gäller filer som inte är Java-kod.
193 \subsection{Resurser}
194 Resurser som används av programmet men som inte är Java-filer ligger i
195 katalogen \verb!src/resources!. Nedan avsnitt beskriver de filer och
196 mappar som ligger i denna katalog.
198 \subsubsection{Filen levels.xml}\label{sec:levels.xml}
199 Filen \textit{levels.xml} innehåller standarduppsättningen av banor
200 spelet använder. Filen följer schemat \textit{levels.xsd} och kan
201 exempelvis vara utformad enligt kodsnutt \ref{kod:levels.xml}.
203 \begin{kod}
204 \begin{footnotesize}
205 \begin{verbatim}
206 <level name="MegaMap" unitsToWin="5">
207 <towers>
208 <tower type="BasicTower" />
209 <tower type="BasicTower" />
210 </towers>
211 <row>
212 <square type="BlockedSquare" />
213 <square type="StartSquare direction="RIGHT" />
214 <square type="PathSquare" />
215 <square type="BlockedSquare" />
216 </row>
217 <row>
218 <square type="BlockedSquare" />
219 <square type="BlockedSquare" />
220 <square type="GoalSquare" />
221 <square type="BlockedSquare" />
222 </row>
223 </level>
224 \end{verbatim}
225 \end{footnotesize}
226 \caption{Exempel XML}\label{kod:levels.xml}
227 \end{kod}
229 \subsubsection{Filen levels.xsd}\label{sec:levels.xsd}
230 Filer \textit{levels.xsd} innehåller ett XML-Schema
231 \footnote{http://www.w3.org/XML/Schema} som definierar hur giltiga
232 XML-dokument till spelet ska vara utformade. Se kodsnutt
233 \ref{kod:levels.xml} för exempel på ett giltigt dokument.
235 \subsubsection{Katalogen sounds}\label{sec:sounds}
236 Katalogen \textit{sounds} innehåller ljud som spelas upp i spelet.
238 \subsubsection{Katalogen map-images}\label{sec:map-images}
239 Katalogen \textit{map-images} innehåller bilder som används av klasser av
240 typen \textit{MapSquare} (se avsnitt \ref{sec:MapSquare}).
242 \subsubsection{Katalogen tower-images}\label{sec:tower-images}
243 Katalogen \textit{tower-images} innehåller bilder som används av klasser
244 av typen \textit{Tower} (se avsnitt \ref{sec:Tower}).
246 \subsubsection{Katalogen unit-images}\label{sec:unit-images}
247 Katalogen \textit{unit-images} innehåller bilder som används av
248 klasser av typen \textit{Unit} (se avsnitt \ref{sec:Unit}).
250 \subsection{Paketet se.umu.cs.dit06ajnajs}
251 Paketet \textit{se.umu.cs.dit06ajnajs} är huvudpaket som används i
252 programmet. I detta paket ligger de klasser som startar och
253 kontrollerar körningen av hela programmet. Se diagram i figur
254 \ref{fig:dit06ajnajs-uml} för en översiktlig beskrivning över hur
255 klasserna använder varandra.
257 \begin{figure}[H]
258 \begin{center}
259 \includegraphics[width=110mm]{images/mvc.pdf}
260 \caption{}
261 \label{fig:dit06ajnajs-uml}
262 \end{center}
263 \end{figure}
265 \subsubsection{AntiTD}\label{sec:AntiTD}
266 Klassen \textit{AntiTD} används för att en användare ska kunna starta
267 programmet. Här kan ett argument skickas med vid start som ska hänvisa
268 till en XML-fil som innehåller information om banorna som ska spelas i
269 spelet. Om inget argument anges kommer en förinställd fil att
270 användas, se \textit{levels.xml} sida
271 \pageref{sec:levels.xml}. XML-filerna ska följa schemat
272 \textit{levels.xsd}, se sida \pageref{sec:levels.xsd}.
274 \subsubsection{ATDController}\label{sec:ATDController}
275 Klassen \textit{ATDController} är programmets huvudklass. Enligt
276 design-mönstret \textit{Model-View-Controller} motsvarar denna klass
277 \textit{Controllern}, alltså den klass som kontrollerar hela
278 programmets exekvering. Från denna klass konstruktor skapas
279 motsvarande \textit{Model} och \textit{View}.
281 Det startas två viktiga trådar när denna klass skapas,
282 \textit{AnimationThread} och \textit{CreditThread}, se
283 algoritmbeskrivning på sida \pageref{sec:Algoritmbeskrivning}.
285 \subsubsection{ATDModel}\label{sec:ATDModel}
286 Klassen \textit{ATDModel} hanterar informationen som behövs för varje
287 spel. Här finns en spelare (\textit{Player}), en lista med banor
288 (\textit{Level}), en lista med alla enheter (\textit{Unit})som är ute
289 på den aktiva banan, och så vidare. Denna information använder och
290 ändrar \textit{ATDController} och \textit{ATDView} läser
291 informationen.
293 Denna klass agerar som ett mellansteg för informationen som finns
294 sparade i många av de klasser som finns i de paketen
295 \textit{se.umu.cs.dit06ajnajs.agent} och
296 \textit{se.umu.cs.dit06ajnajs.level}. Bland annat finns det metoder
297 för att lägga till torn och enheter i spelet.
299 \subsubsection{ATDView}\label{sec:ATDView}
300 Klassen \textit{ATDView} är spelets grafiska gränssnitt. Här ritas en
301 komponent ut som innehåller själva spelplanen och ett antal
302 komponenter för att styra spelets flöde finns. Metoder för att fästa
303 lyssnare på specifika komponenter finns för att \textit{ATDController}
304 ska kunna fästa lyssnare på dem.
306 Metoder för att rita om spelplanen finns tillgängliga för att
307 \textit{ATDController} ska kunna uppdatera gränssnittet efter varje
308 uppdatering av speldatan.
310 \subsubsection{Paintable}\label{sec:Paintable}
311 Gränssnittet \textit{Paintable} ska implementeras av allt som ska
312 kunna ritas upp på spelplanen. Detta görs då med metoden
313 \textit{paint(Graphics g)}.
315 \subsubsection{Clickable}\label{sec:Clickable}
316 Gränssnittet \textit{Clickable}, är ett gränssnitt med metod
317 \textit{click()}. Instanser av \textit{Clickable} reagerar på
318 metodanropet på olika sätt beroende på implementation.
320 \subsubsection{Player}\label{sec:Player}
321 Klassen \textit{Player} representerar en spelare av spelate. Här
322 sparas poäng, krediter och vilken nivån användaren spelar.
324 \subsection{Paketet se.umu.cs.dit06ajnajs.agent}
325 \subsubsection{Agent}\label{sec:Agent}
326 Gränssnittet \textit{Agent}, implementeras av alla klasser som ska
327 agera under spelets gång, detta gäller för närvarande instanser av
328 underklasser till \textit{Unit} och \textit{Tower}. Gränssnittet
329 utökar gränssnitten \textit{Paintable}, \textit{Clickable} och
330 \textit{Cloneable}.
332 \subsubsection{AgentPrototypeFactory}\label{sec:AgentPrototypeFactory}
333 Klassen \textit{AgentPrototypeFactory} används för att skapa instanser
334 av underklasser till de abstrakta klasserna \textit{Tower} och
335 \textit{Unit}. Klassen är implementerad enligt designmönstret
336 \textit{Singleton}, det vill säga det får enbart finnas en instans av
337 denna klass under programmets körning. För att få tag på denna instans
338 används den statiska metoden \textit{getInstance()}.
340 I konstruktorn instansieras och sätts variabler som definierar de
341 olika enheterna, se beskrivning av \textit{Unit}, sida
342 \pageref{sec:Unit}, och \textit{Tower}, sida \pageref{sec:Tower}, för
343 vilka variabler som finns och vad de gör. Detta innebär att det inte
344 behöver skapas en ny klass för varje ny typ av enhet eller torn som
345 ska skapas, det går dock alltid att skapa unika beteenden genom att
346 göra en ny klass som utökar klassen \textit{Unit} och överlagrar någon
347 av dess metoder, till exempel \textit{act()}.
349 En positiv effekt som fås genom kloning av enheter är att många av
350 dess resurser delas för varje enhet. Varje enhet som finns i spelet
351 har gemensamma referenser till bilder och ljud de ritar upp och
352 spelar.
354 \subsubsection{Tower}\label{sec:Tower}
355 Den abstrakta klassen \textit{Tower} ska utökas av underklasser för
356 att skapa representationer av torn som ska kunna agera i ett spel. Ett
357 torn består av ett flertal attribut som kommer att definiera stora
358 delar av dess utseende och beteende.
360 Klassen implementerar gränssnitten \textit{Agent}, \textit{Observer},
361 \textit{Cloneable}. Torn observerar de rutor av typen
362 \textit{PathSquare}, som är inom dess räckvid, för att få information
363 om det kommer enheter (av typen \textit{Unit}) att möjligtvis skjuta
364 på. % TODO: Algobeskr
366 Metoder med logik för att flytta enheten finns implementerade, bland
367 dessa är \textit{act()} och \textit{collision()} viktiga.
369 \subsubsection{BasicTower}\label{sec:BasicTower}
370 Klassen \textit{BasicTower} utökar den abstrakta klassen
371 \textit{Tower} och representerar det enklast möjliga tornet som finns
372 implementerat i detta spel. Klassen innehåller inga egna
373 implementationer utan ärver metoderna i \textit{Tower} rakt av.
375 \subsubsection{Unit}\label{sec:Unit}
376 Den abstrakta klassen \textit{Unit} ska utökas av underklasser för att
377 skapa representationer av enheter som ska kunna agera i ett
378 spel. En enhet består av ett flertal attribut som kommer att definiera
379 stora delar av dess utseende och beteende. Exempelvis finns en tabell
380 som innehåller olika bilder för varje rikting enheter har, en annan
381 tabell innehåller ljud för olika tillfällen.
383 Metoder med logik för att flytta enheten finns implementerade, bland
384 dessa är \textit{act()} och \textit{collision()} viktiga.
385 % TODO algobeskrivning nånstans här?
387 \subsubsection{FootmanUnit}\label{sec:FootmanUnit}
388 Klassen \textit{FootmanUnit} utökar den abstrakta klassen
389 \textit{Unit} och representerar den enklast möjliga enheten som finns
390 implementerat i detta spel. Klassen innehåller inga egna
391 implementationer utan ärver metoderna i \textit{Unit} rakt av.
393 \subsubsection{Direction}\label{sec:Direction}
394 Uppräkningen (''Enumeration'') \textit{Direction} innehåller olika
395 riktningar som är giltiga i spelet. Giltiga värden är \textit{UP,
396 DOWN, LEFT, RIGHT, NONE}. Riktningen \textit{NONE} finns med för att
397 hantera skapande av rutor i banredigeraren som ännu inte har någon
398 riktning.
400 \subsection{Paketet se.umu.cs.dit06ajnajs.level}
401 Paketet \textit{level} innehåller en samling klasser som har en
402 koppling till en bana i spelet. En bana är uppbyggd utav rutor av
403 olika karaktär. Se klassdiagram över de olika kartrutorna i figur
404 \ref{fig:kartrutor-uml}.
406 \begin{figure}[H]
407 \begin{center}
408 \includegraphics[width=110mm]{images/level.pdf}
409 \caption{Klassdiagram över kartrutor}
410 \label{fig:kartrutor-uml}
411 \end{center}
412 \end{figure}
414 \subsubsection{Traversable}\label{sec:Traversable}
415 Gränssnittet \textit{Traversable}, är ett gränssnitt med metod
416 \textit{landOn()} vilket tar emot en \textit{Unit} som parameter och
417 manipulerar denna beroende av tillståndet av instansen av
418 \textit{Traversible}.
420 \subsubsection{Level}\label{sec:Level}
421 Klassen \textit{Level}, motsvarar en bana tänkt att användas i ett
422 rutbaserat spel. Klassen implementerar gränsnitten \textit{Paintable,
423 Cloneable, Clickable}. Banan kan alltså bland annat representeras
424 grafiskt genom \textit{Paintable} och kan reagera på musklick genom
425 \textit{Clickable}. Klassen innehåller en två-dimensionell lista
426 vilket innehåller instanser av typen \textit{MapSquare}. Listor finns
427 även med pekare till de rutor som representerar start- och målrutor.
429 \subsubsection{MapSquare}\label{sec:MapSquare}
430 Klassen \textit{Level}, är en abstrakt klass som motsvarar en ruta
431 tänkt att användas för att kombineras till en bana i ett rutbaserat
432 spel. Gränsnitten \textit{Paintable, Cloneable, Clickable}
433 implementeras. Rutan kan alltså bland annat representeras grafiskt
434 genom \textit{Paintable} och kan reagera på musklick genom
435 \textit{Clickable}. Dessutom ärver klassen från \textit{Observable}
436 för att kunna registrera lyssnare som sedan notifieras när en enhet
437 går på rutan. Ett objekt av typen \textit{MapSquare} kan vara av typen
438 \textit{PathSquare, TurnSquare, BlockedSquare, TowerSquare,
439 BlockedSquare, StartSquare} och \textit{GoalSquare}. Typernas
440 egenskaper beskrivs nedan.
442 \subsubsection{MapSquareFactory}\label{sec:MapSquareFactory}
443 Klassen \textit{MapSquareFactory}, används för att skapa nya instanser
444 av olika implementationer av \textit{MapSquareFactory} från en
445 sträng. Detta för att underlätta skapandet av nya sorters
446 rutor. Designmönstret \textit{Singelton} implementeras för att
447 säkerställa att en och endast en instans finns tillgänglig.
449 \subsubsection{PathSquare}\label{sec:PathSquare}
450 Klassen \textit{PathSquare}, representerar en vägruta och
451 implementerar därför gräns\-snittet \textit{Traversible}. Enheter kan
452 alltså befinna sig och färdas framåt på en ruta av denna typ. Klassen
453 implementerar designmönstret \textit{Observer/Observable} tillsammans
454 med klassen \textit{Tower} ur paketet \textit{agent}. När en enhet
455 anropar en rutas \textit{landOn()}-metod notifieras kringliggande torn
456 och pekaren till den anropande enheten skickas vidare till tornen (se
457 \pageref{sec:Tower}).
459 \subsubsection{TurnSquare}\label{sec:TurnSquare}
460 Klassen \textit{PathSquare}, representerar en sväng och ärver från
461 \textit{PathSquare}. Klassen innehåller en lista med giltiga
462 riktningar samt ett attribut för den nuvarande vald riktning. När en
463 enhet anropar metoden \textit{landOn()} som kontrollerar om enheten
464 har passerat mittlinjen av rutan relativt enhetens riktning. Om det är
465 sant tilldelas enheten rutans nuvarande valda riktning. Metoden
466 \textit{click()} byter den nuvarande valda riktningen till nästa
467 giltiga riktning samt roterar bilden till den nya riktningen.
469 \subsubsection{BlockedSquare}\label{sec:BlockedSquare}
470 Klassen \textit{PathSquare}, representerar en blockerad ruta. I
471 nuvarande version innehåller klassen inga implementationer och
472 fungerar enbart som en utfyllnad.
474 \subsubsection{TowerSquare}\label{sec:TowerSquare}
475 Klassen \textit{PathSquare}, representerar en ruta där torn kan
476 placeras ut. Rutan kan innehålla en referens till ett torn och
477 markeras då som upptagen.
479 \subsubsection{StartSquare}\label{sec:StartSquare}
480 Klassen \textit{PathSquare}, representerar en startruta som enheter
481 kan släppas ut på. Den innehåller en kö där enheter lagras och släpper
482 ut en efter en då detta inte skapar kollisioner mellan enheter. En
483 startruta kan markeras med metoden \textit{click()} och detta sätter
484 boolean \textit{active} till sann och i den grafiska representationen
485 läggs en grön ram till runt rutan.
487 \subsubsection{GoalSquare}\label{sec:GoalSquare}
488 Klassen \textit{PathSquare}, representerar en målruta där enheter
489 samlas in % TODO is something lost here?
491 \subsubsection{NoActiveStartSquareException}\label{sec:NoActiveStartSquareException}
492 Klassen \textit{NoActiveStartSquareException} är ett undantag som
493 utökar \textit{RuntimeException}. Detta undantag kan kastas om det
494 skulle vara så att ingen aktiv startruta är aktiv när en användare
495 försöker sätta ut en ny enhet.
497 % \subsubsection{MapSquarePrototypeFactory}\label{sec:MapSquarePrototypeFactory}
499 \subsection{Paketet se.umu.cs.dit06ajnajs.util}
500 Paketet \textit{se.umu.cs.dit06ajnajs.util} innerhåller främst klasser
501 för att hantera läsning och skrivning av XML, från och till filerna
502 där banor sparas. De flesta av dessa klasser är deklarerade som
503 \textit{final} och innehåller enbart statiska metoder.
505 \subsubsection{SoundPlayer}\label{sec:SoundPlayer}
506 Klassen \textit{SoundPlayer} används för att spela upp allt ljud som
507 finns i spelet. En variabel håller reda på om ljuden ska spelas eller
508 inte, det vill säga om användaren vill höra ljud till spelet eller om
509 spelet ska vara helt tyst.
511 \subsubsection{LevelEditor}\label{sec:LevelEditor}
512 Klassen \textit{LevelEditor} är ett litet program i sig. Klassen har
513 en \textit{main(String[]~args)-metod} vilket innebär att den kan
514 startas. Startas \textit{LevelEditor} kommer ett gränssnitt att visas
515 där användaren kan välja bland de olika typer av kartrutor (av typen
516 \textit{MapSquare}) och sedan klicka på en component för att ''rita''
517 ut och skapa en ny bana. Det finns en knapp \textit{Save map} för att
518 spara kartan som är gjord. Denna karta sparas till katalogen
519 \textit{resources} i root-katalogen från vilken programmet körs och
520 kommer att heta \textit{temp-levels.xml}. För att denna karta ska gå
521 att använda i spelet måste det läggas till information om vilken
522 riktning startrutor ska släppa ut nya enheter, hur många enheter som
523 behövs för vinst och vilka torn som ska finnas vid start.
525 \subsubsection{LevelsXMLOutputter}\label{sec:LevelsXMLOutputter}
526 Klassen \textit{LevelsXMLOutputter} är deklarerad som \textit{final}
527 och har en statisk metod för att skriva och konvertera en
528 \textit{Level} (\ref{sec:Level}) till en \textit{java.io.Writer}. I
529 den nuvarande implementationen sparas inte all nödvändig information
530 undan, enbart informationen som \textit{LevelEditorn} kan skapa
531 sparas.
533 \subsubsection{LevelsXMLParser}\label{sec:LevelsXMLParser}
534 Klassen \textit{LevelsXMLParser} har två metoder för att tolka
535 XML-dokument som följer XML-schemat i avsnitt \ref{sec:levels.xsd} och
536 bygga upp kompletta ban-instanser \textit{Level} (\ref{sec:Level}).
538 \subsubsection{XMLUtil}\label{sec:XMLUtil}
539 Klassen \textit{XMLUtil} har metoder för att ladda en fil, via
540 \textit{java.net.URL} eller \textit{java.io.File}, och returnera ett
541 validerat dokument, \textit{org.jdom.Document}.
543 \subsection{Algoritmbeskrivning}\label{sec:Algoritmbeskrivning}
544 Följande avsnitt förklarar några av algoritmerna som finns
545 implementerade i spelet i mer detalj.
547 \subsubsection{Tråden AnimationThread}
549 \subsubsection{Tråden CreditThread}
550 Tråden \textit{CreditThread} är aktiv under hela applikationens livstid. Följande steg genomförs för varje iteration.
552 \begin{itemize}
553 \item Är spelet pausat?
554 \begin{itemize}
555 \item Om ja, gå till en inre oändlig loop som fortsätter snurra tills dess att spelet går ur pausläget.
556 \item Om nej, gå till nästa steg.
557 \end{itemize}
558 \item Beräkna antalet tjänade krediter genom att kontrollera hur många enheter som finns ute på spelplanen. Lägg dessa till spelaren (\textit{Player}).
559 \item Är målet för banan uppnått?
560 \begin{itemize}
561 \item Om ja, sluta räkna poäng och meddela \textit{ATDController} att banan är avklarad.
562 \item Om nej, gå till nästa steg.
563 \end{itemize}
564 \item Är banan förlorad?
565 \begin{itemize}
566 \item Om ja, meddela \textit{ATDControllern} att banan är avklarad.
567 \item Om nej, gå till nästa steg.
568 \end{itemize}
569 \item Sov ett förinställt intervall och börja sedan om.
570 \end{itemize}
572 \subsubsection{Kollisionshantering}
573 För att inte enheter ska gå över varandra är kollisionshantering
574 implementerat. Innan varje enhet rör sig kollas enhetens framtida
575 position med alla andra enheters nuvarande position för att se om det
576 kommer att bli någon kollision.
578 Om det inträffar en kollision och enheterna har motsatt riktning, det
579 vill säga ena enheten rör sig med riktning \textit{UP} och andra
580 \textit{DOWN} eller \textit{LEFT} mot \textit{RIGHT}, sätts båda
581 enheternas riktning till den motsatta de för närvarande färdas i och
582 första enheten flyttar sig. Om det inträffa kollision där enheterna
583 inte har motsatt riktning får enheten som kollen gjordes för inte
584 förflytta sig denna omgång.
586 % TODO ALgoritm besk vis
587 \subsubsection{Krediträkning}
589 \subsubsection{Tornens act()}
591 \subsubsection{Enheternas act()}
593 \subsubsection{Svängar}
595 \subsubsection{Utritning av spelet}
596 Spelplanen ritas ut på en komponent i \textit{ATDView}. Denna
597 komponent är en inre klass som utökar Javas \textit{JComponent} och är
598 döpt till \textit{GameComponent}. När denna komponent skapas hämtas en
599 bild från \textit{ATDModel} och sparas undan i ett attribut.
601 Metoden \textit{paintComponent(Graphics g)} överlagras för att rita ut
602 spelet i gräns\-snittet. Vid varje uppdatering av spelplanen körs denna
603 metod enligt kodsnutt \ref{kod:paintComponent}.
605 \begin{kod}
606 \begin{footnotesize}
607 \begin{verbatim}
608 public void paintComponent(Graphics g) {
609 logger.fine("paintComponent: " + Thread.currentThread().toString());
611 // Draw backgroundImage
612 g.drawImage(backgroundImage, 0, 0, null);
614 // Draw gameImage which should contain updated information from
615 // Controller
616 g.drawImage(gameImage, 0, 0, null);
618 // Clear gameImage image with a big transparent rectangle.
619 Color transparent = new Color(0, 0, 0, 0);
620 gameGraphics.setColor(transparent);
621 gameGraphics.setComposite(AlphaComposite.Src);
622 gameGraphics.fill(new Rectangle2D.Double(0, 0, width, height));
624 \end{verbatim}
625 \end{footnotesize}
626 \caption{Metoden paintComponent(Graphics g)}\label{kod:paintComponent}
627 \end{kod}
629 För att få en uppdaterad bild där alla enheter ritar ut sig själv
630 sparas tillhörande \textit{Graphics}-objekt som ett attribut i
631 \textit{ATDView} som sedan kan hämtas av animationstråden för att låta
632 varje aktuell instans av \textit{Paintable} (se avsnitt
633 \ref{sec:Paintable} på sida \pageref{sec:Paintable}) rita ut sig själv
634 på bilden, se kodsnutt \ref{kod:paint}. Nedersta raden,
635 \verb!view.repaintGame();!, ritar om hela spelkomponenten, se kodsnutt
636 \ref{kod:paintComponent};
638 \begin{kod}
639 \begin{footnotesize}
640 \begin{verbatim}
641 // Repaint all agents
642 Graphics g = view.getGameGraphics();
643 for (Unit unit : units) {
644 unit.paint(g);
646 for (Tower tower : towers) {
647 tower.paint(g);
650 // Refresh the game view
651 view.repaintGame();
652 \end{verbatim}
653 \end{footnotesize}
654 \caption{Utsnitt ur AnimationThread i ATDController}\label{kod:paint}
655 \end{kod}
657 \section{Begränsningar}\label{Begransningar}
658 % Vilka problem och begränsningar har din lösning av uppgiften? Hur
659 % skulle de kunna rättas till?
661 % 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
663 \section{Reflektioner}\label{Reflektioner}
664 % Reflektioner - Var det något som var speciellt krångligt? Vilka
665 % problem uppstod och hur löste ni dem? Vilka verktyg använde ni? Hur
666 % upplevde ni de verktygen? + Allmänna synpunkter. Om ni har upplevt
667 % problem på grund av olika miljöer (i termer av operativsystem och
668 % liknande) så kan det även vara intressant att nämna det, samt motivera
669 % ert val av miljö.
671 \section{Testkörningar}\label{Testkorningar}
672 % Noggranna testkörningar där man ser att programmet fungerar som det
673 % ska.
674 I denna sektion presenteras några skärmdumpar från körningar av applikationen.
676 \begin{figure}[H]
677 \begin{center}
678 \includegraphics[width=110mm]{images/ingame1.png}
679 \caption{Skärmdump av applikationen}
680 \label{fig:ingame1}
681 \end{center}
682 \end{figure}
684 \begin{figure}[H]
685 \begin{center}
686 \includegraphics[width=110mm]{images/ingame2.png}
687 \caption{Skärmdump av applikationen}
688 \label{fig:ingame2}
689 \end{center}
690 \end{figure}
692 Figur \ref{fig:ingame1} och figur \ref{fig:ingame2} visar hela applikationen under ett pågående spel.
694 \begin{figure}[H]
695 \begin{center}
696 \includegraphics[width=110mm]{images/promptWinIngame.png}
697 \caption{Skärmdump av dialogruta ''Level completed''}
698 \label{fig:win}
699 \end{center}
700 \end{figure}
702 \begin{figure}[H]
703 \begin{center}
704 \includegraphics[width=110mm]{images/promptLose.png}
705 \caption{Skärmdump av dialogruta ''Level lost''}
706 \label{fig:lose}
707 \end{center}
708 \end{figure}
710 Efter att användaren vunnit eller förlorat en bana låses
711 användargränssnittet och användaren får upp alternativ för fortsatt
712 spel i dialogrutor så som figur \ref{fig:win} och figur
713 \ref{fig:lose} visar. Enheter som fortfarande är ute på banan
714 fortsätter att gå runt och kan dö eller gå i mål. Dock slutar
715 poängräkningen.
717 \begin{figure}[H]
718 \begin{center}
719 \includegraphics[width=110mm]{images/promptHighscore.png}
720 \caption{Skärmdump av dialogruta ''Input highscore''}
721 \label{fig:highscore}
722 \end{center}
723 \end{figure}
725 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.
727 \begin{figure}[H]
728 \begin{center}
729 \includegraphics[width=110mm]{images/menu_AntiTD.png}
730 \caption{Skärmdump av meny ''AntiTD''}
731 \label{fig:menu_antitd}
732 \end{center}
733 \end{figure}
735 \begin{figure}[H]
736 \begin{center}
737 \includegraphics[width=110mm]{images/menu_Help.png}
738 \caption{Skärmdump av meny ''Help''}
739 \label{fig:menu_help}
740 \end{center}
741 \end{figure}
743 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.
745 \begin{figure}[H]
746 \begin{center}
747 \includegraphics[width=110mm]{images/leveleditor1.png}
748 \caption{Skärmdump ''LevelEditor'', applikationen har just startat}
749 \label{fig:editor1}
750 \end{center}
751 \end{figure}
753 \begin{figure}[H]
754 \begin{center}
755 \includegraphics[width=110mm]{images/leveleditor2.png}
756 \caption{Skärmdump ''LevelEditor'', ''MapSquares'' av typen ''BlockedSquare''}
757 \label{fig:editor2}
758 \end{center}
759 \end{figure}
761 \begin{figure}[H]
762 \begin{center}
763 \includegraphics[width=110mm]{images/leveleditor3.png}
764 \caption{Skärmdump ''LevelEditor'', ''Mapsquares'' av typen ''PathSquare'', ''StartSquare'' och ''GoalSquare''}
765 \label{fig:editor3}
766 \end{center}
767 \end{figure}
769 \begin{figure}[H]
770 \begin{center}
771 \includegraphics[width=110mm]{images/leveleditor4.png}
772 \caption{Skärmdump ''LevelEditor'', ''Mapsquares'' av typen ''TurnSquare''}
773 \label{fig:editor4}
774 \end{center}
775 \end{figure}
777 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.
779 \section{Diskussion}\label{Diskussion}
780 % Diskutera om laborationen samt allmänt kring Web services och om hur
781 % och när det är användbart (och inte användbart). Saker som kan vara
782 % trevliga att ta upp är interoperabilitet, lite om prestanda, koncepten
783 % lös koppling och så vidare. Den här sektionen ska vara en betydande
784 % del av rapporten. Det är upp till er själva att ta reda på den
785 % information ni behöver, även om föreläsningsmaterialet kan vara
786 % väldigt användbart. Kom även här ihåg att referera till era källor
787 % (även om det är från föreläsningsmaterialet).
788 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.
790 \subsection{Model-View-Controller}
791 % TODO Fill this section
792 Detta projekt har från inledning
794 \subsection{Vidareutveckling}
795 Nedan följer förslag på förändringar för att vidareutveckla spelet.
797 \subsubsection{Klass Item}
798 I inledningar av projektet planerades en abstrakt klass \textit{Item}
799 som skulle representera en pryl vilken skulle kunna lagras i ett
800 attribut i en MapSquare. Objekt av typen \textit{Item} skulle
801 t.ex. kunna vara \textit{HealtItem, SpeedItem, CreditItem} som kan
802 representera prylar som ger mer hälsa, ökad fart respektive ett antal
803 crediter att handla med. Dessa prylar skulle användas genom att
804 slumpmässigt läggas till i objekt av typen \textit{PathSquare} och
805 alltså representeras grafiskt genom att rutan ritar ut prylen ovanpå
806 sig. En ruta med en pryl på skulle sedan skicka vidare en inkommande
807 enhets referens till prylen som i sin tur skulle manipulera enhetens
808 attribut. En pryl med teleporterbeteende diskuteras under rubrik
809 \textit{Unit av typen TeleportUnit} (se \pageref{TeleportUnit}).
811 \subsubsection{Unit av typen TeleportUnit}\label{TeleportUnit}
812 För att uppfylla nivå tre av denna laborations kravspecifikation krävs
813 en enhet med möjlighet att placera ut så kallade
814 teleport-plattor. Detta kan uppnås i detta projekt genom att skapa
815 subklasser av \textit{Item} kallad t.ex. \textit{TeleportStartItem}
816 och \textit{TeleportEndItem}. Prylen \textit{TeleportStartItem} skulle
817 kunna bäras av en \textit{Unit} av typen \textit{TeleporterUnit} och
818 kunna läggas ut på nuvarande ruta genom t.ex. musklick på
819 enheten. Attribut som behövs i \textit{TeleportStartItem} är x- och
820 y-koordinater till den tillhörande prylen \textit{TeleportEndItem}
821 vilket i sin tur innehåller attribut för aktuell riktning som
822 utsläppta enheter ska ha samt en kö där uppsamlade enheter läggs till
823 för att sedan släppas ut en efter en då positionen är ledig. Algoritm
824 för kollisionsdetektering skulle fungera på samma sätt som algoritmen
825 som används när enheter släpps ut ur startrutor (se
826 \pageref{sec:StartSquare});
828 \subsubsection{Gränssnitt}
829 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.
831 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.
833 \subsubsection{Observer–Obervable}
834 Eftersom Javas \textit{Observalbe} är en klass som måste utökas för att användas kan inte \textit{MapSquares} klonas utan att alla får en gemensam lista med \textit{Observers}. En egen implementation av \textit{Observer–Observalbe} skulle behövas för att kunna klona kartrutor på ett användbart sätt. Med en sådan implementation hade det varit lättare i ett senare skede läsa in alla konfigurationsdetaljer för att skapa både kartrutor och enheter utifrån XML-dokument.
836 \subsubsection{LevelEditor}
837 Klassen \textit{LevelEditor} hade behövt vidareutvecklas för att kunna användas för att skapa kompletta banor och redigera tillgängliga banor. Några punkter som hade behövts:
838 \begin{itemize}
839 \item Möjlighet att sätta riktning på en \textit{StartSquare}
840 \item Möjlighet att skapa flera banor och spara dem i en gemensam XML-fil.
841 \item Möjlighet att välja bilder som ska användas för rutorna.
842 \item Möjlighet att sätta antal enheter som krävs i mål för att vinna en bana.
843 \item Möjlighet att sätta ut torn.
844 \end{itemize}
846 \bibliographystyle{alpha}
847 \bibliography{books.bib}
849 \newpage
850 \appendix
851 \pagenumbering{arabic}
852 \section{Källkod}\label{sec:kallkod}
853 % Källkoden ska finnas tillgänglig i er hemkatalog
854 % ~/edu/apjava/lab1/. Bifoga även utskriven källkod.
855 Härefter följer utskrifter från källkoden och andra filer som hör till
856 denna laboration.
858 \newpage
859 \subsection{AntiTD.java}\label{AntiTD.java}
860 \lstinputlisting{../src/se/umu/cs/dit06ajnajs/AntiTD.java}
861 % \begin{footnotesize}
862 % \verbatiminput{../src/se/umu/cs/dit06ajnajs/AntiTD.java}
863 % \end{footnotesize}
864 \end{document}