Report, linebreak
[AntiTD.git] / report / report.tex
blob06c0d4af81ba96db9c8ed29cfd6b7a6766851698
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}
13 % Include pdf with multiple pages ex \includepdf[pages=-, nup=2x2]{filename.pdf}
14 \usepackage[final]{pdfpages}
15 % Place figures where they should be
16 \usepackage{float}
18 % SourceCode
19 \definecolor{keywordcolor}{rgb}{0.5,0,0.75}
20 \lstset{
21 inputencoding=utf8,
22 language=Java,
23 extendedchars=true,
24 basicstyle=\scriptsize\ttfamily,
25 stringstyle=\color{blue},
26 commentstyle=\color{red},
27 numbers=left,
28 firstnumber=auto,
29 numberblanklines=true,
30 stepnumber=1,
31 showstringspaces=false,
32 keywordstyle=\color{keywordcolor}
33 % identifierstyle=\color{identifiercolor}
36 % Float for text
37 \floatstyle{ruled}
38 \newfloat{kod}{H}{lop}
39 \floatname{kod}{Kodsnutt}
41 % vars
42 \def\title{AntiTD}
43 \def\preTitle{Laboration 4}
44 \def\kurs{Applikationsprogrammering i Java, HT-08}
46 \def\namn{Andreas Jakobsson}
47 \def\mail{dit06ajs@cs.umu.se}
48 \def\namnTva{Anton Johansson}
49 \def\mailTva{dit06ajn@cs.umu.se}
51 \def\pathtocode{$\sim$dit06ajn/edu/apjava/lab4}
53 \def\handledareEtt{Johan Eliasson, johane@cs.umu.se}
54 \def\handledareTva{Tor Sterner-Johansson, tors@cs.umu.se}
55 \def\handledareTre{Daniel Henriksson, danielh@cs.umu.se}
56 \def\handledareFyra{Johan Granberg, johang@cs.umu.se}
58 \def\inst{datavetenskap}
59 \def\dokumentTyp{Laborationsrapport}
61 \begin{document}
62 \begin{titlepage}
63 \thispagestyle{empty}
64 \begin{small}
65 \begin{tabular}{@{}p{\textwidth}@{}}
66 UMEÅ UNIVERSITET \hfill \today \\
67 Institutionen för \inst \\
68 \dokumentTyp \\
69 \end{tabular}
70 \end{small}
71 \vspace{10mm}
72 \begin{center}
73 \LARGE{\preTitle} \\
74 \huge{\textbf{\kurs}} \\
75 \vspace{10mm}
76 \LARGE{\title} \\
77 \vspace{15mm}
78 \begin{large}
79 \namn, \mail \\
80 \namnTva, \mailTva\\
81 \texttt{\pathtocode}
82 \end{large}
83 \vfill
84 \large{\textbf{Handledare}}\\
85 \mbox{\large{\handledareTre}}
86 \mbox{\large{\handledareTva}}
87 \mbox{\large{\handledareEtt}}
88 \mbox{\large{\handledareFyra}}
89 \end{center}
90 \end{titlepage}
92 \newpage
93 \mbox{}
94 \vspace{70mm}
95 \begin{center}
96 % Dedication goes here
97 \end{center}
98 \thispagestyle{empty}
99 \newpage
101 \pagestyle{fancy}
102 \rhead{\today}
103 \lhead{\footnotesize{\namn, \mail\\\namnTva, \mailTva}}
104 \chead{}
105 \lfoot{}
106 \cfoot{}
107 \rfoot{}
109 \cleardoublepage
110 \newpage
111 \tableofcontents
112 \cleardoublepage
114 \fancyfoot[LE,RO]{\thepage}
115 \pagenumbering{arabic}
117 \section{Problemspecifikation}\label{Problemspecifikation}
118 % Beskriv med egna ord vad uppgiften gick ut på. Är det någonting som
119 % varit oklart och ni gjort egna tolkningar så beskriv dessa.
120 Uppgiften för denna laboration är att implementera spelet
121 \textit{Anti-Tower Defence} i Java. Kortfattat går ett typiskt sådant
122 spel ut på släppa ut enheter med olika egenskaper på en bana på ett
123 sådant sätt att de överlever till ett mål på banan. När ett antal
124 enheter kommit i mål vinner man banan.
126 Kraven från specifikationen är uppdelade i tre nivåer där den första
127 nivån är grundnivån. Här ska spelet implementeras med en
128 uppdateringsfrekvens oberoende av datorns hastighet. Två stycken
129 enheter med olika egenskaper ska finnas. En bana innehåller zoner där
130 datorn kan placera ut torn och zoner där enheter kan röra sig. Vid
131 vinst eller förlust ska användaren ha möjlighet att spela igen eller
132 att avsluta applikationen. Alla renderingar ska ske med dubbelbuffring
133 för att undvika flimmer.
135 I nivå två tillkommer ytterligare krav utöver de i grundnivån. Flera
136 banor ska finnas och laddas från fil \textit{''levels.xml''}. Denna
137 fil ska valideras mot en egen specifierad standard. Varje bana ska ha
138 egna regler för hur många trupper i mål som krävs för att klara
139 banan. Banor ska kunna ha flera alternativa vägar till mål. Slutligen
140 ska highscores sparas och visas i applikationen med hjälp av
141 webbtjänsten från laboration 3
143 I den sista nivån ska banan utökas med ''växlar'' där användaren kan
144 påverka vilket håll trupperna rör sig i svängar. Dessutom ska enheter
145 kunna påverkas av zoner de går över genom att zoner implementerar ett
146 gränssnitt med en metod med t.ex. namnet \textit{landOn()}. En
147 truppmedlem ska implementeras med egenskapen att den kan lägga ut
148 teleporterplattor som andra enheter sedan kan landa på och förflyttas
149 mellan. Till sist ska projektet finnas i JAR-filen \textit{AnitTD.jar}
150 och gå att köra genom kommandot:
151 \begin{footnotesize}
152 \verb!> java -jar AntiTD.jar!
153 \end{footnotesize}
155 Problemspecifikation finns i original på sidan:\\
156 \begin{footnotesize}
157 \verb!http://www.cs.umu.se/kurser/5DV085/HT08/labbar/lab4.html/!
158 (kontrollerad 090112) % DONE check
159 \end{footnotesize}
161 \subsection{Antaganden om problemspecifikationen}
162 I samtliga nivåer nämns i originalspecifikationen hur menyradens
163 funktionalitet ska utvecklas. Specifika riktlinjer ges om hur
164 menyalternativ ska byta namn beroende på applikationens
165 tillstånd. Eftersom lösningen som presenteras i denna rapport hanterar
166 namnbyten för de menyalternativ som för författarna känns relevant,
167 görs antagandet att detta räcker för att visa att tekniken behärskas.
169 Vidare nämns ett gränssnitt som innehåller metod \textit{landOn()}. I
170 denna lösning antas denna metod få förändras enligt tycke, t.ex. genom
171 att låta metoden ta paramterar.
173 \section{Användarhandledning}\label{Anvandarhandledning}
174 % Förklara var programmet och källkoden ligger samt hur man kompilerar,
175 % startar och använder det. Förklara även översiktligt vad som händer
176 % när man använder de olika kommandona. Det räcker alltså inte att
177 % skriva "man skriver 'ant' för att kompilera", utan det måste även ingå
178 % en liten förklaring om vad som egentligen händer när man kör ant och
179 % varför det fungerar. Använd Internet eller litteratur för att själva
180 % ta reda på den information ni tycker känns relevant, dels för
181 % rapportens skull och dels för er egen. Kom ihåg att skriva tydliga
182 % (vetenskapliga) referenser!
183 Nedan följer en beskrivningar om hur spelet kompileras, startas och
184 används.
186 \subsection{Att kompilera och starta spelet}
187 %% TODO servar ...
188 Alla filer som behövs för att kompilera och köra detta spel ligger på
189 servrar som tillhandahålls av institutionen för datavetenskap i Umeå i katalogen:\\
190 \texttt{\pathtocode}
192 Denna katalog innehåller i sin tur några kataloger:
193 \begin{itemize}
194 \item Katalogen \verb!src! innehåller källkoden.
195 \item Katalogen \verb!test! innehåller testkod.
196 \item Katalogen \verb!bin! innehåller vid kompilering alla .class
197 filer och andra filer, såsom bilder och ljud.
198 \item Katalogen \verb!lib! innehåller olika bibliotek som behövs för
199 att köra och kompilera programmet. En sådan jar-fil är
200 \verb!jdom.jar!, som används för att spara och läsa XML-filer. Alla
201 andra filer rör sparande av poäng till en webbtjänst, det vill säga
202 jar-filer från webbtjänstbiblioteket \textit{Apache
203 Axis2}\footnote{http://ws.apache.org/axis2}.
204 \item Katalogen \verb!doc! innehåller Javadoc API-dokumentation.
206 \end{itemize}
207 Följande kommandon förutsätter att programmet \textit{Apache
208 Ant}\footnote{http://ant.apache.org/} är installerat. Verktyget
209 \textit{Ant} är ett byggverktyg som använder sig av specifikationen
210 lagrad i en XML-fil, oftast \textit{build.xml}, för att automatisera
211 alla nödvändiga operationen vid kompilering av ett projekt. Detta kan
212 innefatta all typ av filhantering, det vill säga kopiering,
213 borttagning och flyttning, men även själva kompileringen av
214 projektet. Verktyget kan ses som ett specialanpassat skript för att
215 kompilera hela projekt.
217 Spelet kompileras med kommandot:\\
218 \begin{footnotesize}
219 \verb!salt:~/edu/apjava/lab4> ant!
220 \end{footnotesize}
222 Det som händer vid anrop av kommandot ovan är att \textit{Ant} läser
223 av filen \textit{build.xml} och letar efter standardkommandona att
224 köra. I det här fallet är det operationerna som är definierade i
225 XML-elementet \verb!<target />! med attributet
226 \verb!name="compile"!. Oftast har taggarna i \textit{build.xml}
227 relativt självförklarande namn, de motsvarar i många fall direkta
228 kommandon som går att köra i en terminal. Nu ska programmet vara
229 kompilerat och ligga i katalogen \verb!bin/main!.
231 Spelet startas med kommandot:\\
232 \begin{footnotesize}
233 \verb!salt:~/edu/apjava/lab4> ant run!
234 \end{footnotesize}
236 En banredigerare kan startas med kommandot:\\
237 \begin{footnotesize}
238 \verb!salt:~/edu/apjava/lab4> ant run-editor!
239 \end{footnotesize}
241 Spelet kan även kompileras till en jar-fil som kan köras utan att
242 \textit{Ant} är installerat, detta görs med kommandot:\\
243 \begin{footnotesize}
244 \verb!salt:~/edu/apjava/lab4> ant jar!
245 \end{footnotesize}
247 Efter ovan kommando kommer det att skapas en fil \verb!AntiTD.jar! i
248 samma katalog. För att starta spelet kan denna jar-fil köras med
249 kommandot:\\
250 \begin{footnotesize}
251 \verb!salt:~/edu/apjava/lab4> java -jar AntiTD.jar!
252 \end{footnotesize}
254 För att jar-filen ska kunna köras måste de bibliotek som behövs för
255 körning finnas i en katalog \verb!lib! på samma sökväg som körningen
256 görs från.
258 \subsection{Att använda det grafiska gränssnittet}
259 Ett spel startas automatiskt vid start men när som helst kan ett helt
260 nytt spel startas genom att i menyraden välja \textit{AntiTD} och
261 därefter \textit{New Game}. I menyn \textit{AntiTD} finns också andra
262 självförklarande funktioner som \textit{Restart Level, Paus/Resume,
263 Mute/unMute} och \textit{Quit}, se skärmdumpar från avsnitt
264 \ref{Testkorningar}, sida \pageref{Testkorningar}. Till höger om
265 spelplanen tillhandahålls en kontrollpanel där enheter markeras genom
266 att klicka på dem i listan. Därefter, kontrollera att en lämplig
267 startruta är markerad. En markerad startruta visas genom att ett grönt
268 sträck ritas ut under startrutans bild. Tryck på knappen
269 \textit{Release Unit} för att nu släppa ut enheten på
270 banan. Manipulera enhetens frammarsch på banan genom att snurra på
271 riktningspilarna i kurvor och korsningar. Detta görs genom att klicka
272 på pilarna och dessa snurrar då runt till nästa giltiga riktning.
274 \section{Systembeskrivning}\label{Systembeskrivning}
275 % Beskriv översiktligt hur programmet är uppbyggt och hur det löser
276 % problemet.
278 Följande avsnitt beskriver de olika delarna av programmet uppdelat
279 paketvis med beskrivningar över vad de olika klasserna har för
280 funktion. Även en kort beskrivning över resurserna programmet använder
281 när det gäller filer som inte är Java-kod.
283 \subsection{Paketet se.umu.cs.dit06ajnajs}
284 Paketet \textit{se.umu.cs.dit06ajnajs} är huvudpaket som används i
285 programmet. I detta paket ligger de klasser som startar och
286 kontrollerar körningen av hela programmet. Se diagram i figur
287 \ref{fig:dit06ajnajs-uml} för en översiktlig beskrivning över hur
288 klasserna använder varandra.
290 \begin{figure}[H]
291 \begin{center}
292 \includegraphics[width=110mm]{images/mvc.pdf}
293 \caption{}
294 \label{fig:dit06ajnajs-uml}
295 \end{center}
296 \end{figure}
298 \subsubsection{AntiTD}\label{sec:AntiTD}
299 Klassen \textit{AntiTD} används för att en användare ska kunna starta
300 programmet. Här kan ett argument skickas med vid start som ska hänvisa
301 till en XML-fil som innehåller information om banorna som ska spelas i
302 spelet. Om inget argument anges kommer en förinställd fil att
303 användas, se \textit{levels.xml} sida
304 \pageref{sec:levels.xml}. XML-filerna ska följa schemat
305 \textit{levels.xsd}, se sida \pageref{sec:levels.xsd}.
307 \subsubsection{ATDController}\label{sec:ATDController}
308 Klassen \textit{ATDController} är programmets huvudklass. Enligt
309 design-mönstret \textit{Model-View-Controller} motsvarar denna klass
310 \textit{Controllern}, alltså den klass som kontrollerar hela
311 programmets exekvering. Från denna klass konstruktor skapas
312 motsvarande \textit{Model} och \textit{View}.
314 Det startas två viktiga trådar när denna klass skapas,
315 \textit{AnimationThread} och \textit{CreditThread}, se
316 algoritmbeskrivning på sida \pageref{sec:Algoritmbeskrivning}.
318 \subsubsection{ATDModel}\label{sec:ATDModel}
319 Klassen \textit{ATDModel} hanterar informationen som behövs för varje
320 spel. Här finns en spelare (\textit{Player}), en lista med banor
321 (\textit{Level}), en lista med alla enheter (\textit{Unit})som är ute
322 på den aktiva banan, och så vidare. Denna information använder och
323 ändrar \textit{ATDController} och \textit{ATDView} läser
324 informationen.
326 Denna klass agerar som ett mellansteg för informationen som finns
327 sparade i många av de klasser som finns i de paketen
328 \textit{se.umu.cs.dit06ajnajs.agent} och
329 \textit{se.umu.cs.dit06ajnajs.level}. Bland annat finns det metoder
330 för att lägga till torn och enheter i spelet.
332 \subsubsection{ATDView}\label{sec:ATDView}
333 Klassen \textit{ATDView} är spelets grafiska gränssnitt. Här ritas en
334 komponent ut som innehåller själva spelplanen och ett antal
335 komponenter för att styra spelets flöde finns. Metoder för att fästa
336 lyssnare på specifika komponenter finns för att \textit{ATDController}
337 ska kunna fästa lyssnare på dem.
339 Metoder för att rita om spelplanen finns tillgängliga för att
340 \textit{ATDController} ska kunna uppdatera gränssnittet efter varje
341 uppdatering av speldatan.
343 \subsubsection{Paintable}\label{sec:Paintable}
344 Gränssnittet \textit{Paintable} ska implementeras av allt som ska
345 kunna ritas upp på spelplanen. Detta görs då med metoden
346 \textit{paint(Graphics g)}.
348 \subsubsection{Clickable}\label{sec:Clickable}
349 Gränssnittet \textit{Clickable}, är ett gränssnitt med metod
350 \textit{click()}. Instanser av \textit{Clickable} reagerar på
351 metodanropet på olika sätt beroende på implementation.
353 \subsubsection{Player}\label{sec:Player}
354 Klassen \textit{Player} representerar en spelare av spelate. Här
355 sparas poäng, krediter och vilken nivån användaren spelar.
357 \subsection{Paketet se.umu.cs.dit06ajnajs.agent}
358 Klasserna i paket \textit{dit06ajnajs.agent} representerar agenter i
359 spelet som ska kunna agera på kartan. Se klassdiagrammet i figur
360 \ref{fig:agent-uml} för en överblick hur de olika agentera beror av
361 varandra.
363 \begin{figure}[H]
364 \begin{center}
365 \includegraphics[width=110mm]{images/agent.pdf}
366 \caption{}
367 \label{fig:agent-uml}
368 \end{center}
369 \end{figure}
371 \subsubsection{Agent}\label{sec:Agent}
372 Gränssnittet \textit{Agent}, implementeras av alla klasser som ska
373 agera under spelets gång, detta gäller för närvarande instanser av
374 underklasser till \textit{Unit} och \textit{Tower}. Gränssnittet
375 utökar gränssnitten \textit{Paintable}, \textit{Clickable} och
376 \textit{Cloneable}. Det vill säga varje agent i spelat ska kunna rita
377 ut sig själv, det ska gå att klicka på dem och det ska gå att klona
378 dem se avsnitt \ref{sec:AgentPrototypeFactory}.
380 \subsubsection{AgentPrototypeFactory}\label{sec:AgentPrototypeFactory}
381 Klassen \textit{AgentPrototypeFactory} används för att skapa instanser
382 av underklasser till de abstrakta klasserna \textit{Tower} och
383 \textit{Unit}. Klassen är implementerad enligt designmönstret
384 \textit{Singleton}, det vill säga det får enbart finnas en instans av
385 denna klass under programmets körning. För att få tag på denna instans
386 används den statiska metoden \textit{getInstance()}.
388 I konstruktorn instansieras och sätts variabler som definierar de
389 olika enheterna, se beskrivning av \textit{Unit}, sida
390 \pageref{sec:Unit}, och \textit{Tower}, sida \pageref{sec:Tower}, för
391 vilka variabler som finns och vad de gör. Detta innebär att det inte
392 behöver skapas en ny klass för varje ny typ av enhet eller torn som
393 ska skapas, det går dock alltid att skapa unika beteenden genom att
394 göra en ny klass som utökar klassen \textit{Unit} och överlagrar någon
395 av dess metoder, till exempel \textit{act()}.
397 En positiv effekt som fås genom kloning av enheter är att många av
398 dess resurser delas för varje enhet. Varje enhet som finns i spelet
399 har gemensamma referenser till bilder och ljud de ritar upp och
400 spelar.
402 \subsubsection{Tower}\label{sec:Tower}
403 Den abstrakta klassen \textit{Tower} ska utökas av underklasser för
404 att skapa representationer av torn som ska kunna agera i ett spel. Ett
405 torn består av ett flertal attribut som kommer att definiera stora
406 delar av dess utseende och beteende.
408 Klassen implementerar gränssnitten \textit{Agent},
409 \textit{Observer}. Torn observerar de rutor av typen
410 \textit{PathSquare}, som är inom dess räckvid, för att få information
411 om det kommer enheter (av typen \textit{Unit}) att möjligtvis skjuta
412 på, se algoritmbeskrivning på sida \pageref{sec:algo-tower}.
414 Metoder med logik för att flytta enheten finns implementerade, bland
415 dessa är \textit{act()} och \textit{collision()} viktiga.
417 \subsubsection{BasicTower}\label{sec:BasicTower}
418 Klassen \textit{BasicTower} utökar den abstrakta klassen
419 \textit{Tower} och representerar det enklast möjliga tornet som finns
420 implementerat i detta spel. Klassen innehåller inga egna
421 implementationer utan ärver metoderna i \textit{Tower} rakt av.
423 \subsubsection{Unit}\label{sec:Unit}
424 Den abstrakta klassen \textit{Unit} ska utökas av underklasser för att
425 skapa representationer av enheter som ska kunna agera i ett
426 spel. En enhet består av ett flertal attribut som kommer att definiera
427 stora delar av dess utseende och beteende. Exempelvis finns en tabell
428 som innehåller olika bilder för varje rikting enheter har, en annan
429 tabell innehåller ljud för olika tillfällen.
431 Viktiga attribut är x- och y-position på kartan, dessa används för att
432 enheten ska kunna rita ut sig själv på rätt plats. Vid förflyttning av
433 en enhet ändras x- y-position.
435 En centerpunkt räknas även ut för varje ändring av x- och
436 y-position. Denna punkt används bland annat för att räkna avstånd
437 mellan torn och enhet.
439 Varje enhet har även metoder för att returnera en rektangel som
440 definierar dess nuvarande och framtida yttre gränser på en bana. Denna
441 rektangel används vid kollisionsuträkning se algoritmbeskrivning på
442 sida \pageref{sec:alog-kollision}.
444 Metoder med logik för att flytta enheten finns implementerade, bland
445 dessa är \textit{act()} och \textit{collision()} viktiga.
446 % TODO algobeskrivning nånstans här?
448 \subsubsection{FootmanUnit}\label{sec:FootmanUnit}
449 Klassen \textit{FootmanUnit} utökar den abstrakta klassen
450 \textit{Unit} och representerar den enklast möjliga enheten som finns
451 implementerat i detta spel. Klassen innehåller inga egna
452 implementationer utan ärver metoderna i \textit{Unit} rakt av.
454 \subsubsection{Direction}\label{sec:Direction}
455 Uppräkningen (''Enumeration'') \textit{Direction} innehåller olika
456 riktningar som är giltiga i spelet. Giltiga värden är \textit{UP,
457 DOWN, LEFT, RIGHT, NONE}. Riktningen \textit{NONE} finns med för att
458 hantera skapande av rutor i banredigeraren som ännu inte har någon
459 riktning.
461 \subsection{Paketet se.umu.cs.dit06ajnajs.level}
462 Paketet \textit{level} innehåller en samling klasser som har en
463 koppling till en bana i spelet. En bana är uppbyggd utav rutor av
464 olika karaktär. Se klassdiagram över de olika kartrutorna i figur
465 \ref{fig:kartrutor-uml}.
467 \begin{figure}[H]
468 \begin{center}
469 \includegraphics[width=110mm]{images/level.pdf}
470 \caption{Klassdiagram över kartrutor}
471 \label{fig:kartrutor-uml}
472 \end{center}
473 \end{figure}
475 \subsubsection{Clickable}\label{sec:Clickable}
476 Gränssnittet \textit{Clickable}, är ett gränssnitt med metod
477 \textit{click()}. Instanser av \textit{Clickable} reagerar på
478 metodanropet på olika sätt beroende på implementation.
480 \subsubsection{Traversable}\label{sec:Traversable}
481 Gränssnittet \textit{Traversable}, är ett gränssnitt med metod
482 \textit{landOn()} vilket tar emot en \textit{Unit} som parameter och
483 manipulerar denna beroende av tillståndet av instansen av
484 \textit{Traversible}.
486 \subsubsection{Level}\label{sec:Level}
487 Klassen \textit{Level}, motsvarar en bana tänkt att användas i ett
488 rutbaserat spel. Klassen implementerar gränsnitten \textit{Paintable,
489 Cloneable, Clickable}. Banan kan alltså bland annat representeras
490 grafiskt genom \textit{Paintable} och kan reagera på musklick genom
491 \textit{Clickable}. Klassen innehåller en två-dimensionell lista
492 vilket innehåller instanser av typen \textit{MapSquare}. Listor finns
493 även med pekare till de rutor som representerar start- och målrutor.
495 \subsubsection{MapSquare}\label{sec:MapSquare}
496 Klassen \textit{Level}, är en abstrakt klass som motsvarar en ruta
497 tänkt att användas för att kombineras till en bana i ett rutbaserat
498 spel. Gränsnitten \textit{Paintable, Cloneable, Clickable}
499 implementeras. Rutan kan alltså bland annat representeras grafiskt
500 genom \textit{Paintable} och kan reagera på musklick genom
501 \textit{Clickable}. Dessutom ärver klassen från \textit{Observable}
502 för att kunna registrera lyssnare som sedan notifieras när en enhet
503 går på rutan. Ett objekt av typen \textit{MapSquare} kan vara av typen
504 \textit{PathSquare, TurnSquare, BlockedSquare, TowerSquare,
505 BlockedSquare, StartSquare} och \textit{GoalSquare}. Typernas
506 egenskaper beskrivs nedan.
508 \subsubsection{MapSquareFactory}\label{sec:MapSquareFactory}
509 Klassen \textit{MapSquareFactory}, används för att skapa nya instanser
510 av olika implementationer av \textit{MapSquareFactory} från en
511 sträng. Detta för att underlätta skapandet av nya sorters
512 rutor. Designmönstret \textit{Singelton} implementeras för att
513 säkerställa att en och endast en instans finns tillgänglig.
515 \subsubsection{PathSquare}\label{sec:PathSquare}
516 Klassen \textit{PathSquare}, representerar en vägruta och
517 implementerar därför gräns\-snittet \textit{Traversible}. Enheter kan
518 alltså befinna sig och färdas framåt på en ruta av denna typ. Klassen
519 implementerar designmönstret \textit{Observer/Observable} tillsammans
520 med klassen \textit{Tower} ur paketet \textit{agent}. När en enhet
521 anropar en rutas \textit{landOn()}-metod notifieras kringliggande torn
522 och pekaren till den anropande enheten skickas vidare till tornen (se
523 \pageref{sec:Tower}).
525 \subsubsection{TurnSquare}\label{sec:TurnSquare}
526 Klassen \textit{PathSquare}, representerar en sväng och ärver från
527 \textit{PathSquare}. Klassen innehåller en lista med giltiga
528 riktningar samt ett attribut för den nuvarande vald riktning. När en
529 enhet anropar metoden \textit{landOn()} som kontrollerar om enheten
530 har passerat mittlinjen av rutan relativt enhetens riktning. Om det är
531 sant tilldelas enheten rutans nuvarande valda riktning. Metoden
532 \textit{click()} byter den nuvarande valda riktningen till nästa
533 giltiga riktning samt roterar bilden till den nya riktningen.
535 \subsubsection{BlockedSquare}\label{sec:BlockedSquare}
536 Klassen \textit{PathSquare}, representerar en blockerad ruta. I
537 nuvarande version innehåller klassen inga implementationer och
538 fungerar enbart som en utfyllnad.
540 \subsubsection{TowerSquare}\label{sec:TowerSquare}
541 Klassen \textit{PathSquare}, representerar en ruta där torn kan
542 placeras ut. Rutan kan innehålla en referens till ett torn och
543 markeras då som upptagen.
545 \subsubsection{StartSquare}\label{sec:StartSquare}
546 Klassen \textit{PathSquare}, representerar en startruta som enheter
547 kan släppas ut på. Den innehåller en kö där enheter lagras och släpper
548 ut en efter en då detta inte skapar kollisioner mellan enheter. En
549 startruta kan markeras med metoden \textit{click()} och detta sätter
550 boolean \textit{active} till sann och i den grafiska representationen
551 läggs en grön ram till runt rutan.
553 \subsubsection{GoalSquare}\label{sec:GoalSquare}
554 Klassen \textit{PathSquare}, representerar en målruta där enheter
555 samlas in % TODO is something lost here?
557 \subsubsection{NoActiveStartSquareException}\label{sec:NoActiveStartSquareException}
558 Klassen \textit{NoActiveStartSquareException} är ett undantag som
559 utökar \textit{RuntimeException}. Detta undantag kan kastas om det
560 skulle vara så att ingen aktiv startruta är aktiv när en användare
561 försöker sätta ut en ny enhet.
563 \subsection{Paketet se.umu.cs.dit06ajnajs.util}
564 Paketet \textit{se.umu.cs.dit06ajnajs.util} innerhåller främst klasser
565 för att hantera läsning och skrivning av XML, från och till filerna
566 där banor sparas. De flesta av dessa klasser är deklarerade som
567 \textit{final} och innehåller enbart statiska metoder.
569 \subsubsection{SoundPlayer}\label{sec:SoundPlayer}
570 Klassen \textit{SoundPlayer} används för att spela upp allt ljud som
571 finns i spelet. En variabel håller reda på om ljuden ska spelas eller
572 inte, det vill säga om användaren vill höra ljud till spelet eller om
573 spelet ska vara helt tyst.
575 \subsubsection{LevelEditor}\label{sec:LevelEditor}
576 Klassen \textit{LevelEditor} är ett litet program i sig. Klassen har
577 en \textit{main(String[]~args)-metod} vilket innebär att den kan
578 startas. Startas \textit{LevelEditor} kommer ett gränssnitt att visas
579 där användaren kan välja bland de olika typer av kartrutor (av typen
580 \textit{MapSquare}) och sedan klicka på en component för att ''rita''
581 ut och skapa en ny bana. Det finns en knapp \textit{Save map} för att
582 spara kartan som är gjord. Denna karta sparas till katalogen
583 \textit{resources} i root-katalogen från vilken programmet körs och
584 kommer att heta \textit{temp-levels.xml}. För att denna karta ska gå
585 att använda i spelet måste det läggas till information om vilken
586 riktning startrutor ska släppa ut nya enheter, hur många enheter som
587 behövs för vinst och vilka torn som ska finnas vid start.
589 Denna klass implementerades för att på ett snabbt och enkelt sätt
590 kunna skapa flera olika kartor till spelet.
592 \subsubsection{LevelsXMLOutputter}\label{sec:LevelsXMLOutputter}
593 Klassen \textit{LevelsXMLOutputter} är deklarerad som \textit{final}
594 och har en statisk metod för att skriva och konvertera en
595 \textit{Level} (\ref{sec:Level}) till en \textit{java.io.Writer}. I
596 den nuvarande implementationen sparas inte all nödvändig information
597 undan, enbart informationen som \textit{LevelEditorn} kan skapa
598 sparas.
600 \subsubsection{LevelsXMLParser}\label{sec:LevelsXMLParser}
601 Klassen \textit{LevelsXMLParser} har två metoder för att tolka
602 XML-dokument som följer XML-schemat i avsnitt \ref{sec:levels.xsd} och
603 bygga upp kompletta ban-instanser \textit{Level} (\ref{sec:Level}).
605 \subsubsection{XMLUtil}\label{sec:XMLUtil}
606 Klassen \textit{XMLUtil} har metoder för att ladda en fil, via
607 \textit{java.net.URL} eller \textit{java.io.File}, och returnera ett
608 validerat dokument, \textit{org.jdom.Document}.
610 \subsection{Resurser}
611 Resurser som används av programmet men som inte är Java-filer ligger i
612 katalogen \verb!src/resources!. Nedan avsnitt beskriver de filer och
613 mappar som ligger i denna katalog.
615 \subsubsection{Filen levels.xml}\label{sec:levels.xml}
616 Filen \textit{levels.xml} innehåller standarduppsättningen av banor
617 spelet använder. Filen följer schemat \textit{levels.xsd} och kan
618 exempelvis vara utformad enligt kodsnutt \ref{kod:levels.xml}.
620 \begin{kod}
621 \begin{footnotesize}
622 \begin{verbatim}
623 <level name="MegaMap" unitsToWin="5">
624 <towers>
625 <tower type="BasicTower" />
626 <tower type="BasicTower" />
627 </towers>
628 <row>
629 <square type="BlockedSquare" />
630 <square type="StartSquare direction="RIGHT" />
631 <square type="PathSquare" />
632 <square type="BlockedSquare" />
633 </row>
634 <row>
635 <square type="BlockedSquare" />
636 <square type="BlockedSquare" />
637 <square type="GoalSquare" />
638 <square type="BlockedSquare" />
639 </row>
640 </level>
641 \end{verbatim}
642 \end{footnotesize}
643 \caption{Exempel XML}\label{kod:levels.xml}
644 \end{kod}
646 \subsubsection{Filen levels.xsd}\label{sec:levels.xsd}
647 Filer \textit{levels.xsd} innehåller ett XML-Schema
648 \footnote{http://www.w3.org/XML/Schema} som definierar hur giltiga
649 XML-dokument till spelet ska vara utformade. Se kodsnutt
650 \ref{kod:levels.xml} för exempel på ett giltigt dokument.
652 \subsubsection{Katalogen sounds}\label{sec:sounds}
653 Katalogen \textit{sounds} innehåller ljud som spelas upp i spelet.
655 \subsubsection{Katalogen map-images}\label{sec:map-images}
656 Katalogen \textit{map-images} innehåller bilder som används av klasser av
657 typen \textit{MapSquare} (se avsnitt \ref{sec:MapSquare}).
659 \subsubsection{Katalogen tower-images}\label{sec:tower-images}
660 Katalogen \textit{tower-images} innehåller bilder som används av klasser
661 av typen \textit{Tower} (se avsnitt \ref{sec:Tower}).
663 \subsubsection{Katalogen unit-images}\label{sec:unit-images}
664 Katalogen \textit{unit-images} innehåller bilder som används av
665 klasser av typen \textit{Unit} (se avsnitt \ref{sec:Unit}).
668 \subsection{Algoritmbeskrivning}\label{sec:Algoritmbeskrivning}
669 Följande avsnitt förklarar några av algoritmerna som finns
670 implementerade i spelet i mer detalj.
672 \subsubsection{Tråden AnimationThread}
673 Tråden \textit{AnimationThread} är aktiv under hela applikationens
674 livstid. Följande steg genomförs för varje iteration.
676 \begin{enumerate}
677 \item Starta tidtagning.
678 \item Är spelet pausat?
679 \begin{itemize}
680 \item Om ja, gå till en inre oändlig loop som fortsätter snurra
681 tills dess att spelet går ur pausläget.
682 \item Om nej, gå till nästa steg.
683 \end{itemize}
684 \item För varje enhet på bana, kontrollera kollisioner och säg till
685 enhet att agera (se algoritmbeskrivning \textit{Kollisionshantering}
686 samt algoritmbeskrivning \textit{Enheternas act()}).
687 \item Samla upp döda enheter och meddela \textit{ATDController} att
688 dessa ska tas bort från modellen.
689 \item För varje torn på banan, säg till torn att agera (se
690 algoritmbeskrivning \textit{Tornens act()}).
691 \item För varje målruta, samla in enheter och räkna mängden tjänade
692 krediter.
693 \item Är spelet redan vunnit?
694 \begin{itemize}
695 \item Om ja, gör inget av krediterna och gå vidare.
696 \item Om nej, tilldela spelaren (\textit{Player}) krediterna och
697 gå vidare.
698 \end{itemize}
699 \item För varje startruta, släpp ut enheter från kö om utsläppet
700 inte innebär en kollision
701 \item För varje \textit{Agent}, anropa dess metod \textit{Paint()}.
702 \item Uppdatera spelkomponenten i \textit{ATDView} (se
703 algoritmbeskrivning \textit{Utritning av spelet}).
704 \item Stoppa tidtagning och sov tråden den kvarvarande tiden av det
705 förinställda tidssteget för att sedan börja om från steg 1.
706 \end{enumerate}
710 \subsubsection{Tråden CreditThread}
711 Tråden \textit{CreditThread} är aktiv under hela applikationens
712 livstid. Följande steg genomförs för varje iteration.
714 \begin{enumerate}
715 \item Är spelet pausat?
716 \begin{itemize}
717 \item Om ja, gå till en inre oändlig loop som fortsätter snurra
718 tills dess att spelet går ur pausläget.
719 \item Om nej, gå till nästa steg.
720 \end{itemize}
721 \item Beräkna antalet tjänade krediter genom att kontrollera hur
722 många enheter som finns ute på spelplanen. Lägg dessa till spelaren
723 (\textit{Player}).
724 \item Är målet för banan uppnått?
725 \begin{itemize}
726 \item Om ja, sluta räkna poäng och meddela
727 \textit{ATDController} att banan är avklarad.
728 \item Om nej, gå till nästa steg.
729 \end{itemize}
730 \item Är banan förlorad?
731 \begin{itemize}
732 \item Om ja, meddela \textit{ATDControllern} att banan är
733 avklarad.
734 \item Om nej, gå till nästa steg.
735 \end{itemize}
736 \item Sov ett förinställt intervall och börja sedan om.
737 \end{enumerate}
739 \subsubsection{Kollisionshantering}\label{sec:alog-kollision}
740 För att inte enheter ska gå över varandra är kollisionshantering
741 implementerat. Innan varje enhet rör sig kollas enhetens framtida
742 position med alla andra enheters nuvarande position för att se om det
743 kommer att bli någon kollision, se figur \ref{fig:algo-kollision}. I
744 figurens läge 1 ska \textit{Unit2} förflytta sig, i läge 2 testas
745 enhetens framtida position, mot alla andra enheter på spelplanen,
746 eftersom det blev en kollision pausas \textit{Unit2} och läge 3
747 inträffar.
749 \begin{figure}[H]
750 \begin{center}
751 \includegraphics[width=110mm]{images/collision.pdf}
752 \caption{Kollision mellan två enheter}
753 \label{fig:algo-kollision}
754 \end{center}
755 \end{figure}
757 Om det inträffar en kollision och enheterna har motsatt riktning, det
758 vill säga ena enheten rör sig med riktning \textit{UP} och andra
759 \textit{DOWN} eller \textit{LEFT} mot \textit{RIGHT}, sätts båda
760 enheternas riktning till den motsatta de för närvarande färdas i och
761 första enheten flyttar sig. Om det inträffa kollision där enheterna
762 inte har motsatt riktning får enheten som kollen gjordes för inte
763 förflytta sig denna omgång.
765 % TODO ALgoritm besk vis
766 \subsubsection{Krediträkning}
767 I nuläget beräknas spelarens intjänade krediter på ett mycket enkelt
768 sätt och kan ses som en tillfällig implementation. För varje iteration
769 i tråden \textit{CreditThread} baseras den intjänade krediten av
770 antalet enheter på kartan multiplicerat med 10. För varje iteration i
771 tråden \textit{AnimationThread} samlas enheter in från målrutor och
772 totala antalet multipliceras med 100.
774 \subsubsection{Tornens act()}\label{sec:algo-tower}
775 När det är dags för torn att sköta sin uppdatering körs dess
776 \textit{act()} metod, se kodsnutt \ref{kod:act-tower}.
778 Om det finns enheter i listan \textit{fireingList} som lever så
779 beskjuts dessa om de är inom räckhåll annars så tas de bort ur listan.
781 \begin{kod}
782 \begin{footnotesize}
783 \begin{verbatim}
784 public void act() {
785 if (!fireingList.isEmpty()) {
786 Unit unit = fireingList.get(0);
787 if (unit.isAlive()) {
788 Point unitPoint = unit.getCenterPoint();
790 int unitXPos = unitPoint.x;
791 int unitYPos = unitPoint.y;
792 int distans = (int) Math.hypot((this.centerX - unitXPos),
793 this.centerY - unitYPos);
794 if (distans < this.range) {
795 logger.info("UNIT IN RANGE, FIIIIIREEEEEEE!!!");
796 this.fiering = true;
797 unit.damage(damage);
798 } else {
799 fireingList.remove(unit);
801 } else {
802 fireingList.remove(unit);
806 \end{verbatim}
807 \end{footnotesize}
808 \caption{Tower act(...)}\label{kod:act-tower}
809 \end{kod}
812 \subsubsection{Enheternas act()}
813 När det är dags för enheter att sköta sin uppdatering körs dess
814 \textit{act()} metod, se kodsnutt \ref{kod:act-unit}.
816 Om enheten lever och inte är pausad så förflyttar den sig till sin
817 nästa position och anropar rutans metod \textit{landOn(this)}. Om den
818 av någon oförutsägbar händelse skulle hamna utanför rutor som är
819 traverserbara \textit{Traversible} så dör de.
821 Om enheten var pausad så sätts den som icke pausad så att den har
822 möjlighet att röra sig i nästa tidssteg.
824 \begin{kod}
825 \begin{footnotesize}
826 \begin{verbatim}
827 public void act() {
828 // Check if this unit has health left
829 if (this.currentHealth > 0) {
830 // Check if this unit is active
831 if (!pause) {
832 Point nextPos = getNextPosition();
833 // TODO check for collision on next position
834 move(nextPos);
836 // Land on current square
837 MapSquare currentSquare
838 = level.getMapSquareAtPoint(centerX, centerY);
839 if (currentSquare instanceof Traversable) {
840 ((Traversable) currentSquare).landOn(this);
841 } else {
842 // Unit hitting something not Traversable and therefore
843 // dies.
844 this.alive = false;
846 } else {
847 // Toggle pause back to false;
848 pause = false;
850 } else {
851 // Kill unit
852 this.alive = false;
853 SoundPlayer.play(sounds.get("dead"));
856 \end{verbatim}
857 \end{footnotesize}
858 \caption{Unit act(...)}\label{kod:act-unit}
859 \end{kod}
861 \subsubsection{Svängar}
862 En enhets svängs av antingen en \textit{TurnSquare} eller genom av en
863 annan enhet, \textit{Unit}. Enheter får nya riktningar (svängs) genom
864 att metoden \textit{setDirection(...)} körs, se kodsnutt
865 \ref{kod:setDirection}. Första parametern som anges är den nya
866 riktning enheten ska ha, andra parametern ska innehålla en referens
867 till det objekt som kallade på metoden. Denna lösningen gör att en
868 enhet inte kan svängas två gånger i rad av samma objekt. Denna lösning
869 valdes eftersom en enhet inte ska kunna svängas flera gånger i rad av
870 samma \textit{TurnSquare} när en användare klickar upprepade gånger på
871 denna under tiden som enheten befinner sig inom rutan.
873 En enhet svängs av en svängruta, \textit{TurnSquare}, om enhetens
874 mittpunkt har passerat rutans mittpunkt.
876 En enhet svängs vid kollision med en annan enhet om enheterna har
877 motsatta riktningar.
879 \begin{kod}
880 \begin{footnotesize}
881 \begin{verbatim}
882 public void setDirection(Direction direction, Object caller) {
883 if (this.lastTurnedBy != caller) {
884 this.direction = direction;
885 this.lastTurnedBy = caller;
886 } else {
887 logger.info("Turned by same caller twice: " + caller);
890 \end{verbatim}
891 \end{footnotesize}
892 \caption{Metoden setDirection(...)}\label{kod:setDirection}
893 \end{kod}
895 \subsubsection{Utritning av spelet}
896 Spelplanen ritas ut på en komponent i \textit{ATDView}. Denna
897 komponent är en inre klass som utökar Javas \textit{JComponent} och är
898 döpt till \textit{GameComponent}. När denna komponent skapas hämtas en
899 bild från \textit{ATDModel} och sparas undan i ett attribut.
901 Metoden \textit{paintComponent(Graphics g)} överlagras för att rita ut
902 spelet i gräns\-snittet. Vid varje uppdatering av spelplanen körs denna
903 metod enligt kodsnutt \ref{kod:paintComponent}.
905 \begin{kod}
906 \begin{footnotesize}
907 \begin{verbatim}
908 public void paintComponent(Graphics g) {
909 logger.fine("paintComponent: " + Thread.currentThread().toString());
911 // Draw backgroundImage
912 g.drawImage(backgroundImage, 0, 0, null);
914 // Draw gameImage which should contain updated information from
915 // Controller
916 g.drawImage(gameImage, 0, 0, null);
918 // Clear gameImage image with a big transparent rectangle.
919 Color transparent = new Color(0, 0, 0, 0);
920 gameGraphics.setColor(transparent);
921 gameGraphics.setComposite(AlphaComposite.Src);
922 gameGraphics.fill(new Rectangle2D.Double(0, 0, width, height));
924 \end{verbatim}
925 \end{footnotesize}
926 \caption{Metoden paintComponent(Graphics g)}\label{kod:paintComponent}
927 \end{kod}
929 För att få en uppdaterad bild där alla enheter ritar ut sig själv
930 sparas tillhörande \textit{Graphics}-objekt som ett attribut i
931 \textit{ATDView} som sedan kan hämtas av animationstråden för att låta
932 varje aktuell instans av \textit{Paintable} (se avsnitt
933 \ref{sec:Paintable} på sida \pageref{sec:Paintable}) rita ut sig själv
934 på bilden, se kodsnutt \ref{kod:paint}. Nedersta raden,
935 \verb!view.repaintGame();!, ritar om hela spelkomponenten, se kodsnutt
936 \ref{kod:paintComponent};
938 \begin{kod}
939 \begin{footnotesize}
940 \begin{verbatim}
941 // Repaint all agents
942 Graphics g = view.getGameGraphics();
943 for (Unit unit : units) {
944 unit.paint(g);
946 for (Tower tower : towers) {
947 tower.paint(g);
950 // Refresh the game view
951 view.repaintGame();
952 \end{verbatim}
953 \end{footnotesize}
954 \caption{Utsnitt ur AnimationThread i ATDController}\label{kod:paint}
955 \end{kod}
957 \section{Begränsningar}\label{Begransningar}
958 % Vilka problem och begränsningar har din lösning av uppgiften? Hur
959 % skulle de kunna rättas till?
960 Följande avsnitt beskriver några områden inom implementationen med
961 olika begränsningar. För diskussion kring hur funktionaliteten för en
962 teleporterenhet kan läggas till i spelet, se avsnitt
963 \ref{sec:teleportunit}.
965 \subsection{Kollisioner}
966 I situationen där enheter går i en cirkel kan ett totalt stopp uppstå
967 där alla väntar på att enheten framför ska försvinna. I detta läge
968 finns inget annat alternativ än att starta om ifall det inte finns
969 torn i närheten som kan frigöra utrymme genom att döda enheter. Ett
970 exempel på en enkel lösning till detta är att erbjuda användaren att
971 kunna döda enheter själv genom att t.ex. klicka på dem.
973 Något lite mindre trivialt fel som upptäckts under testkörningar kan
974 uppstå när två köer av enheter som ligger väldigt nära varandra möts
975 rakt mot varandra i en flervägskorsning. Då kan enheter börja vänta på
976 varandra trots att den önskade effekten hade varit att de antingen
977 studsar mot varandra eller att en enhet hinner fram till svängrutan
978 och går iväg längst den nya vägen.
981 \subsection{Webbtjänst}
982 När spelaren klarat alla banor i spelet visas en dialogruta där namn
983 kan skrivas in. Om spelaren trycker \textit{OK} skickas den samlade
984 poängen till en webbtjänst från laboration 3. Ännu har ingen
985 funktionalitet lagts till för att visa denna highscorelista i
986 spelet. Lösningen för detta är att t.ex. i menyraden lägga till ett
987 alternativ för att få fram en panel där listan enkelt laddas in genom
988 metodanrop till webbtjänstens metod \textit{retrive()}.
990 \subsection{Kollisioner i svängar}
991 Sättet enheter svänger på kan göra att det uppkommer tillfällen då
992 enheter hamnar centrerade utanför vägrutor mittlinje. Det är tänkt
993 att enheter hela tiden ska röra sig i mitten av vägrutor.
995 Detta problem kan uppkomma när två enheter med motstående riktningar
996 möts i en svängruta. Eftersom de inte har passerat svängrutans
997 mittpunkt svänger de inte utan kolliderar med varandra och ändrar
998 rikting till varandras motsats. Om deras mittpunkt fortfarande
999 befinner sig inom rutan kommer detta innebära att för svängrutan ser
1000 det nu ut som att enheterna har passerat mittpunkten och då svänger
1001 rutan båda enheterna som nu hamnar ocentrerat parallellt med
1002 varandra. Se bild i figur \ref{fig:turnProblem}.
1004 \begin{figure}[H]
1005 \begin{center}
1006 \includegraphics[width=110mm]{images/turnProblem.pdf}
1007 \caption{}
1008 \label{fig:turnProblem}
1009 \end{center}
1010 \end{figure}
1012 \subsection{Trådsäkerhet}
1013 Eftersom två trådar körs parallellt från \textit{ATDController} som
1014 båda hämtar och skriver till modellen är trådsäkerhet en
1015 riskfaktor. Vi har under utvecklingen av spelet endast haft problem
1016 med listan över levande enheter som kunde hämtas och itereras från en
1017 tråd och samtidigt som en annan tråd tagit bort enheter från samma
1018 lista. Detta har då fått spelet att krascha. Lösningen blev att låta
1019 modellen returnera en kopia av listan som trådar fick arbeta mot. Det
1020 finns säkerligen andra tillfällen då information hämtas och samtidigt
1021 modifieras som kan ställa till med problem men inga har uppstått under
1022 testkörningar. Lösningen på dessa problem är att se över vad i
1023 modellen som kan bli problem för trådsäkerhet
1025 % NOTE Antingen skriver vi bara om buggar här och låter icke-uppfyllda
1026 % specpunkter ligga i diskussion eller så skiver vi båda och låter
1027 % diskussion ta upp saker vi skulle vilja göra
1029 \section{Reflektioner}\label{Reflektioner}
1030 % Reflektioner - Var det något som var speciellt krångligt? Vilka
1031 % problem uppstod och hur löste ni dem? Vilka verktyg använde ni? Hur
1032 % upplevde ni de verktygen? + Allmänna synpunkter. Om ni har upplevt
1033 % problem på grund av olika miljöer (i termer av operativsystem och
1034 % liknande) så kan det även vara intressant att nämna det, samt motivera
1035 % ert val av miljö.
1037 \section{Testkörningar}\label{Testkorningar}
1038 % Noggranna testkörningar där man ser att programmet fungerar som det
1039 % ska.
1040 I denna sektion presenteras några skärmdumpar från körningar av applikationen.
1042 \begin{figure}[H]
1043 \begin{center}
1044 \includegraphics[width=110mm]{images/ingame1.png}
1045 \caption{Skärmdump av applikationen}
1046 \label{fig:ingame1}
1047 \end{center}
1048 \end{figure}
1050 \begin{figure}[H]
1051 \begin{center}
1052 \includegraphics[width=110mm]{images/ingame2.png}
1053 \caption{Skärmdump av applikationen}
1054 \label{fig:ingame2}
1055 \end{center}
1056 \end{figure}
1058 Figur \ref{fig:ingame1} och figur \ref{fig:ingame2} visar hela
1059 applikationen under ett pågående spel.
1061 \begin{figure}[H]
1062 \begin{center}
1063 \includegraphics[width=110mm]{images/promptWinIngame.png}
1064 \caption{Skärmdump av dialogruta ''Level completed''}
1065 \label{fig:win}
1066 \end{center}
1067 \end{figure}
1069 \begin{figure}[H]
1070 \begin{center}
1071 \includegraphics[width=110mm]{images/promptLose.png}
1072 \caption{Skärmdump av dialogruta ''Level lost''}
1073 \label{fig:lose}
1074 \end{center}
1075 \end{figure}
1077 Efter att användaren vunnit eller förlorat en bana låses
1078 användargränssnittet och användaren får upp alternativ för fortsatt
1079 spel i dialogrutor så som figur \ref{fig:win} och figur
1080 \ref{fig:lose} visar. Enheter som fortfarande är ute på banan
1081 fortsätter att gå runt och kan dö eller gå i mål. Dock slutar
1082 poängräkningen.
1084 \begin{figure}[H]
1085 \begin{center}
1086 \includegraphics[width=110mm]{images/promptHighscore.png}
1087 \caption{Skärmdump av dialogruta ''Input highscore''}
1088 \label{fig:highscore}
1089 \end{center}
1090 \end{figure}
1092 När inga fler banor finns att spela får användaren möjlighet att
1093 skicka in sin ihoptjänade poäng till en highscore lista. Denna
1094 funktionalitet drivs av en webbtjänst som ingick i den laboration som
1095 gjordes innan denna laboration.
1097 \begin{figure}[H]
1098 \begin{center}
1099 \includegraphics[width=110mm]{images/menu_AntiTD.png}
1100 \caption{Skärmdump av meny ''AntiTD''}
1101 \label{fig:menu_antitd}
1102 \end{center}
1103 \end{figure}
1105 \begin{figure}[H]
1106 \begin{center}
1107 \includegraphics[width=110mm]{images/menu_Help.png}
1108 \caption{Skärmdump av meny ''Help''}
1109 \label{fig:menu_help}
1110 \end{center}
1111 \end{figure}
1113 Figur \ref{fig:menu_antitd} och figur \ref{fig:menu_help} visar de
1114 alternativ som döljer sig i menyraden. I figur \ref{fig:menu_antitd}
1115 syns det tredje alternativet \textit{Resume} vilket vid start heter
1116 \textit{Paus} men är nu i ett annat tillstånd eftersom applikationen
1117 vid detta tillfälle var pausat. Detsamma gäller för fjärde
1118 alternativet \textit{unMute} vilket börjar som \textit{Mute}. Figur
1119 \ref{fig:menu_help} visar menyalternativen \textit{Help} och
1120 \textit{About}. Dessa innehåller en kort beskrivning av spelets regler
1121 och mål respektive en kort beskrivning om vilka som skapat
1122 applikationen.
1124 \begin{figure}[H]
1125 \begin{center}
1126 \includegraphics[width=110mm]{images/leveleditor1.png}
1127 \caption{Skärmdump ''LevelEditor'', applikationen har just startat}
1128 \label{fig:editor1}
1129 \end{center}
1130 \end{figure}
1132 \begin{figure}[H]
1133 \begin{center}
1134 \includegraphics[width=110mm]{images/leveleditor2.png}
1135 \caption{Skärmdump ''LevelEditor'', ''MapSquares'' av typen ''BlockedSquare''}
1136 \label{fig:editor2}
1137 \end{center}
1138 \end{figure}
1140 \begin{figure}[H]
1141 \begin{center}
1142 \includegraphics[width=110mm]{images/leveleditor3.png}
1143 \caption{Skärmdump ''LevelEditor'', ''Mapsquares'' av typen ''PathSquare'', ''StartSquare'' och ''GoalSquare''}
1144 \label{fig:editor3}
1145 \end{center}
1146 \end{figure}
1148 \begin{figure}[H]
1149 \begin{center}
1150 \includegraphics[width=110mm]{images/leveleditor4.png}
1151 \caption{Skärmdump ''LevelEditor'', ''Mapsquares'' av typen ''TurnSquare''}
1152 \label{fig:editor4}
1153 \end{center}
1154 \end{figure}
1156 I figur \ref{fig:editor1} till figur \ref{fig:editor4} visas
1157 skärmdumpar av testapplikationen för att skapa banor. En hel bana har
1158 skapats genom att klicka ut rutor av olika typ.
1160 \section{Vidareutveckling}\label{Diskussion}
1162 Projektet är implementerat enligt design-mönstret
1163 \textit{Model-View-Controller}. Resultatet diskuteras under rubriken
1164 \textit{Model-View-Controller}. I detta stadie finns en bra grund för
1165 att lägga till funktionalitet så som nya enheter och nya banrutor med
1166 speciella egenskaper samt att utveckla användargränssnittet. I
1167 nedanstående avsnitt \textit{Vidareutveckling} diskuteras olika
1168 möjligheter till vidareutveckling av spelet.
1170 \subsection{Model-View-Controller}
1171 % TODO Fill this section
1172 Eftersom modellen \textit{ATDModel} är helt oberoende av
1173 \textit{ATDController} och \textit{ATDView} finns möjligheter att göra
1174 radikala förändringar i de senare utan att påverka modellen. Till
1175 exempel kan gränsnittet modifieras fritt eftersom det bara hämtar
1176 information från modellen och inte skriver till den. Det är alltså
1177 metoderna i \textit{ATDController} som manipulerar modellen och gör
1178 metodanrop för att uppdatera vyn så här läggs ansvaret för att styra
1179 vad som går att göra i programmet.
1181 \subsection{Klass Item}
1182 I inledningar av projektet planerades en abstrakt klass \textit{Item}
1183 som skulle representera en pryl vilken skulle kunna lagras i ett
1184 attribut i en MapSquare. Objekt av typen \textit{Item} skulle
1185 t.ex. kunna vara \textit{HealtItem, SpeedItem, CreditItem} som kan
1186 representera prylar som ger mer hälsa, ökad fart respektive ett antal
1187 crediter att handla med. Dessa prylar skulle användas genom att
1188 slumpmässigt läggas till i objekt av typen \textit{PathSquare} och
1189 alltså representeras grafiskt genom att rutan ritar ut prylen ovanpå
1190 sig. En ruta med en pryl på skulle sedan skicka vidare en inkommande
1191 enhets referens till prylen som i sin tur skulle manipulera enhetens
1192 attribut. En pryl med teleporterbeteende diskuteras under rubrik
1193 \textit{Unit av typen TeleportUnit} (se avsnitt \ref{sec:teleportunit}).
1195 \subsection{Unit av typen TeleportUnit}\label{sec:teleportunit}
1196 För att uppfylla nivå tre av denna laborations kravspecifikation krävs
1197 en enhet med möjlighet att placera ut så kallade
1198 teleport-plattor. Detta kan uppnås i detta projekt genom att skapa
1199 subklasser av \textit{Item} kallad t.ex. \textit{TeleportStartItem}
1200 och \textit{TeleportEndItem}. Prylen \textit{TeleportStartItem} skulle
1201 kunna bäras av en \textit{Unit} av typen \textit{TeleporterUnit} och
1202 kunna läggas ut på nuvarande ruta genom t.ex. musklick på
1203 enheten. Attribut som behövs i \textit{TeleportStartItem} är x- och
1204 y-koordinater till den tillhörande prylen \textit{TeleportEndItem}
1205 vilket i sin tur innehåller attribut för aktuell riktning som
1206 utsläppta enheter ska ha samt en kö där uppsamlade enheter läggs till
1207 för att sedan släppas ut en efter en då positionen är ledig. Algoritm
1208 för kollisionsdetektering skulle fungera på samma sätt som algoritmen
1209 som används när enheter släpps ut ur startrutor (se
1210 \pageref{sec:StartSquare});
1212 \subsection{Gränssnitt}
1213 I nuläget startas första banan direkt när applikationen startar. Att
1214 få se en så kallad splash-screen (introduktionsbild) kan vara önskvärt
1215 och åtgärdas enkelt genom att i konstruktor för \textit{ATDController}
1216 lägga till ett metodanrop till metod i \textit{ATDView} som visar
1217 något och väntar på att användaren ska välja ett nytt spel.
1219 I kontrollpanelen finns stora möjligheter till vidareutveckling då den
1220 nuvarande just täcker den funktionalitet som behövs för att köra
1221 spelet. Till en början skulle listan med tillgängliga units kunna
1222 bytas ut mot ikoner som visar enhetens grafiska representation. För
1223 att lättare kunna få en översikt över en enhets egenskaper skulle
1224 hälsa och hastighet kunna förmedlas med staplar istället för med
1225 text. Om listan byts mot ikoner finns även möjligheten att ta bort
1226 knappen \textit{Release Units} och låta användaren skicka ut önskad
1227 enhet genom att direkt klicka på enhetens ikon.
1229 \subsection{Observer–Obervable}
1230 Eftersom Javas \textit{Observalbe} är en klass som måste utökas för
1231 att användas kan inte \textit{MapSquares} klonas utan att alla får en
1232 gemensam lista med \textit{Observers}. En egen implementation av
1233 \textit{Observer–Observalbe} skulle behövas för att kunna klona
1234 kartrutor på ett användbart sätt. Med en sådan implementation hade det
1235 varit lättare i ett senare skede läsa in alla konfigurationsdetaljer
1236 för att skapa både kartrutor och enheter utifrån XML-dokument.
1238 \subsection{LevelEditor}
1239 Klassen \textit{LevelEditor} hade behövt vidareutvecklas för att kunna
1240 användas för att skapa kompletta banor och redigera tillgängliga
1241 banor. Några punkter som hade behövts:
1243 \begin{itemize}
1244 \item Möjlighet att sätta riktning på en \textit{StartSquare}
1245 \item Möjlighet att skapa flera banor och spara dem i en gemensam XML-fil.
1246 \item Möjlighet att välja bilder som ska användas för rutorna.
1247 \item Möjlighet att sätta antal enheter som krävs i mål för att vinna en bana.
1248 \item Möjlighet att sätta ut torn.
1249 \end{itemize}
1251 \bibliographystyle{alpha}
1252 \bibliography{books.bib}
1254 \newpage
1255 \appendix
1256 \pagenumbering{roman}
1257 \section{Källkod}\label{sec:kallkod}
1258 % Källkoden ska finnas tillgänglig i er hemkatalog
1259 % ~/edu/apjava/lab1/. Bifoga även utskriven källkod.
1260 Härefter följer utskrifter från källkoden och andra filer som hör till
1261 denna laboration.
1263 \newpage
1264 \subsection{AntiTD.java}\label{AntiTD.java}
1265 \lstinputlisting{../src/se/umu/cs/dit06ajnajs/AntiTD.java}
1266 % \begin{footnotesize}
1267 % \verbatiminput{../src/se/umu/cs/dit06ajnajs/AntiTD.java}
1268 % \end{footnotesize}
1269 \end{document}