1 \documentclass[titlepage, twoside,
a4paper,
12pt
]{article
}
2 \usepackage[swedish
]{babel
}
3 \usepackage[utf8
]{inputenc}
14 % Include pdf with multiple pages ex \includepdf[pages=-, nup=2x2]{filename.pdf}
15 \usepackage[final
]{pdfpages
}
16 % Place figures where they should be
20 \definecolor{keywordcolor
}{rgb
}{0.5,
0,
0.75}
25 basicstyle=
\scriptsize\ttfamily,
26 stringstyle=
\color{blue
},
27 commentstyle=
\color{red
},
30 numberblanklines=true,
32 showstringspaces=false,
33 keywordstyle=
\color{keywordcolor
}
34 % identifierstyle=\color{identifiercolor}
39 \newfloat{kod
}{H
}{lop
}
40 \floatname{kod
}{Kodsnutt
}
44 \def\preTitle{Laboration
4}
45 \def\kurs{Applikationsprogrammering i Java, HT-
08}
47 \def\namn{Andreas Jacobsson
}
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
}
66 \begin{tabular
}{@
{}p
{\textwidth}@
{}}
67 UMEÅ UNIVERSITET
\hfill \today \\
68 Institutionen för
\inst \\
75 \huge{\textbf{\kurs}} \\
85 \large{\textbf{Handledare
}}\\
86 \mbox{\large{\handledareTre}}
87 \mbox{\large{\handledareTva}}
88 \mbox{\large{\handledareEtt}}
89 \mbox{\large{\handledareFyra}}
97 % Dedication goes here
104 \lhead{\footnotesize{\namn,
\mail\\
\namnTva,
\mailTva}}
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:
129 \verb!> java -jar AntiTD.jar!
132 \subsection{Antaganden om problemspecifikationen
}
133 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.
135 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.
137 Problemspecifikation finns i original på sidan:\\
139 \verb!http://www.cs.umu.se/kurser/
5DV085/HT08/labbar/lab4.html/!
% DONE check
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:\\
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 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:\\
170 \verb!salt:~/edu/apjava/lab3> ant!
174 % Det som händer vid anrop av kommandot ovan är att \textit{Ant} läser
175 % av filen \textit{build.xml} och letar efter standardkommandona att
176 % köra. I det här fallet är det operationerna som är definierade i
177 % XML-elementet \verb!<target />! med attributet \verb!name="dist"!. Se
178 % bildaga~\ref{app:build.xml} för mer information om vad som händer. Oftast
179 % har taggarna i \textit{build.xml} relativt självförklarande namn, de
180 % motsvarar i många fall direkta kommandon som går att köra i en
183 \section{Systembeskrivning
}\label{Systembeskrivning
}
184 % Beskriv översiktligt hur programmet är uppbyggt och hur det löser
189 \includegraphics[width=
110mm
]{images/Paintables.pdf
}
190 \caption{UML klassdiagram
}
191 \label{fig:image/Paintable
}
195 \subsection{Resurser
}
196 Resurser som används av programmet men som inte är Java-filer ligger i
197 katalogen
\verb!src/resources!. Nedan avsnitt beskriver de filer och
198 mappar som ligger i denna katalog.
200 \subsubsection{levels.xml
}\label{sec:levels.xml
}
201 Filen
\textit{levels.xml
} innehåller standarduppsättningen av banor
202 spelet använder. Filen följer schemat
\textit{levels.xsd
} och kan
203 exempelvis vara utformad enligt kodsnutt
\ref{kod:levels.xml
}.
208 <level name="MegaMap" unitsToWin="
5">
210 <tower type="BasicTower" />
211 <tower type="BasicTower" />
214 <square type="BlockedSquare" />
215 <square type="StartSquare direction="RIGHT" />
216 <square type="PathSquare" />
217 <square type="BlockedSquare" />
220 <square type="BlockedSquare" />
221 <square type="BlockedSquare" />
222 <square type="GoalSquare" />
223 <square type="BlockedSquare" />
228 \caption{Exempel XML
}\label{kod:levels.xml
}
231 \subsubsection{levels.xsd
}\label{sec:levels.xsd
}
232 Filer
\textit{levels.xsd
} innehåller ett XML-Schematn
233 \footnote{http://www.w3.org/XML/Schema
} som definierar hur giltiga
234 XML-dokument till spelet ska vara utformade. Se kodsnutt
235 \ref{kod:levels.xml
} för exempel på ett giltigt dokument.
237 \subsubsection{sounds
}\label{sec:sounds
}
238 Mappen
\textit{sounds
} innehåller ljud som spelas upp i spelet.
240 \subsubsection{map-images
}\label{sec:map-images
}
241 Mappen
\textit{map-images
} innehåller bilder som används av klasser av
242 typen
\textit{MapSquare
} (se avsnitt
\ref{sec:MapSquare
}).
244 \subsubsection{tower-images
}\label{sec:tower-images
}
245 Mappen
\textit{tower-images
} innehåller bilder som används av klasser
246 av typen
\textit{Tower
} (se avsnitt
\ref{sec:Tower
}).
248 \subsubsection{unit-images
}\label{sec:unit-images
}
249 Mappen
\textit{unit-images
} innehåller bilder som används av klasser
250 av typen
\textit{Unit
} (se avsnitt
\ref{sec:Unit
}).
252 \subsection{Paketet se.umu.cs.dit06ajnajs
}
253 Paketet
\textit{se.umu.cs.dit06ajnajs
} är huvudpaket som används i
254 programmet. I detta paket ligger de klasser som startar och
255 kontrollerar körningen av hela programmet.
257 \subsubsection{AntiTD
}\label{sec:AntiTD
}
258 Klassen
\textit{AntiTD
} används för att en användare ska kunna starta
259 programmet. Här kan ett argument skickas med vid start som ska hänvisa
260 till en XML-fil som innehåller information om banorna som ska spelas i
261 spelet. Om inget argument anges kommer en förinställd fil att
262 användas, se
\textit{levels.xml
} sida
263 \pageref{sec:levels.xml
}. XML-filerna ska följa schemat
264 \textit{levels.xsd
} se sida
\pageref{sec:levels.xsd
}.
266 \subsubsection{ATDController
}\label{sec:ATDController
}
267 Klassen
\textit{ATDController
} är programmets huvudklass. Enligt
268 design-mönstret
\textit{Model-View-Controller
} motsvarar denna klass
269 \textit{Controllern
}, alltså den klass som kontrollerar hela
270 programmets exekvering. Från denna klass konstruktor skapas
271 motsvarande
\textit{Model
} och
\textit{View
}.
273 Det startas två viktiga trådar när denna klass skapas,
274 \textit{AnimationThread
} och
\textit{CreditThread
}.
277 \subsubsection{ATDModel
}\label{sec:ATDModel
}
278 Klassen
\textit{ATDModel
} hanterar informationen som behövs för varje
279 spel. Här finns en spelare (
\textit{Player
}), en lista med banor
280 (
\textit{Level
}), en lista med alla enheter (
\textit{Unit
})som är ute
281 på den aktiva banan, och så vidare. Denna information använder och
282 ändrar
\textit{ATDController
} och
\textit{ATDView
} läser
285 \subsubsection{ATDView
}\label{sec:ATDView
}
286 Klassen
\textit{ATDView
} är spelets grafiska gränssnitt. Här ritas en
287 komponent ut som innehåller själva spelplanen och ett antal
288 komponenter för att styra spelets flöde finns. Metoder för att fästa
289 lyssnare på specifika komponenter finns för att
\textit{ATDController
}
290 ska kunna fästa lyssnare på dem.
292 \subsubsection{NoActiveStartSquareException
}\label{sec:NoActiveStartSquareException
}
293 \subsubsection{Paintable
}\label{sec:Paintable
}
294 \subsubsection{Player
}\label{sec:Player
}
296 \subsection{Paketet se.umu.cs.dit06ajnajs.agent
}
297 \subsubsection{Agent
}\label{sec:Agent
}
298 Gränssnittet
\textit{Agent
}, implementeras av alla klasser som ska
299 agera under spelets gång, detta gäller för närvarande instanser av
300 underklasser till
\textit{Unit
} och
\textit{Tower
}. Gränssnittet
301 utökar gränssnitten
\textit{Paintable
},
\textit{Clickable
} och
304 \subsubsection{AgentPrototypeFactory
}\label{sec:AgentPrototypeFactory
}
305 Klassen
\textit{AgentPrototypeFactory
} används för att skapa instanser
306 av underklasser till de abstrakta klasserna
\textit{Tower
} och
307 \textit{Unit
}. Klassen är implementerad enligt designmönstret
308 \textit{Singleton
}, det vill säga det får enbart finnas en instans av
309 denna klass under programmets körning. För att få tag på denna instans
310 används den statiska metoden
\textit{getInstance()
}.
312 I konstruktorn instansieras och sätts variabler som definierar de
313 olika enheterna, se beskrivning av
\textit{Unit
} sida
314 \pageref{sec:Unit
} och
\textit{Tower
} sida
\pageref{sec:Tower
} för
315 vilka variabler som finns och vad de gör. Detta innebär att det inte
316 behöver skapas en ny klass för varje ny typ av enhet eller torn som
317 ska skapas, det går dock alltid att skapa unika beteenden genom att
318 göra en ny klass som utökar klassen
\textit{Unit
} och överlagrar någon
319 av dess metoder, till exempel
\textit{act()
}.
321 \subsubsection{Tower
}\label{sec:Tower
}
325 \subsubsection{BasicTower
}\label{sec:BasicTower
}
326 Klassen
\textit{BasicTower
} utökar den abstrakta klassen
327 \textit{Tower
} och representerar det enklast möjliga tornet som finns
328 implementerat i detta spel. Klassen innehåller inga egna
329 implementationer utan ärver metoderna i
\textit{Tower
} rakt av.
331 \subsubsection{Unit
}\label{sec:Unit
}
332 Den abstrakta klassen
\textit{Unit
} ska utökas av underklasser för att
333 skapa representationer av enheter som ska kunna agera i ett
334 spel. En enhet består av ett flertal attribut som kommer att definiera
335 stora delar av dess utseende och beteende. Exempelvis finns en tabell
336 som innehåller olika bilder för varje rikting enheter har, en annan
337 tabell innehåller ljud för olika tillfällen.
339 Metoder med logik för att flytta enheten finns implementerade, bland
340 dessa är
\textit{act()
} och
\textit{collision()
} viktiga.
341 % TODO algobeskrivning nånstans här?
343 \subsubsection{FootmanUnit
}\label{sec:FootmanUnit
}
344 Klassen
\textit{FootmanUnit
} utökar den abstrakta klassen
345 \textit{Unit
} och representerar den enklast möjliga enheten som finns
346 implementerat i detta spel. Klassen innehåller inga egna
347 implementationer utan ärver metoderna i
\textit{Unit
} rakt av.
349 \subsubsection{Direction
}\label{sec:Direction
}
350 Uppräkningen (''Enumeration'')
\textit{Direction
} innehåller olika
351 riktningar som är giltiga i spelet. Giltiga värden är
\textit{UP,
352 DOWN, LEFT, RIGHT, NONE
}. Riktningen
\textit{NONE
} finns med för att
353 hantera skapande av rutor i banredigeraren som ännu inte har någon
356 \subsection{Paketet se.umu.cs.dit06ajnajs.map
}
357 Paketet
\textit{level
} innehåller en samling klasser som har en koppling till en bana i spelet. En bana är uppbyggd utav rutor av olika karaktär.
359 \subsubsection{Clickable
}\label{sec:Clickable
}
360 Gränssnittet
\textit{Clickable
}, är ett gränssnitt med metod
\textit{click()
}. Instanser av
\textit{Clickable
} reagerar på metodanropet på olika sätt beroende på implementation.
362 \subsubsection{Traversable
}\label{sec:Traversable
}
363 Gränssnittet
\textit{Traversable
}, är ett gränssnitt med metod
\textit{landOn()
} vilket tar emot en
\textit{Unit
} som parameter och manipulerar denna beroende tillståndet av instansen av
\textit{Traversible
}.
365 \subsubsection{Level
}\label{sec:Level
}
366 Klassen
\textit{Level
}, motsvarar en bana tänkt att användas i ett rutbaserat spel. Klassen implementerar gränsnitten
\textit{Paintable, Cloneable, Clickable
}. Banan kan alltså bland annat representeras grafiskt genom
\textit{Paintable
} och kan reagera på musklick genom
\textit{Clickable
}. Klassen innehåller en två-dimensionell lista vilket innehåller instanser av typen
\textit{MapSquare
} (se
\pageref{MapSquare
}). Listor finns även med pekare till de rutor som representerar start- och målrutor.
368 \subsubsection{MapSquare
}\label{sec:MapSquare
}
369 Klassen
\textit{Level
}, är en abstrakt klass som motsvarar en ruta tänkt att användas för att kombineras till en bana i ett rutbaserat spel. Gränsnitten
\textit{Paintable, Cloneable, Clickable
} implementeras. Rutan kan alltså bland annat representeras grafiskt genom
\textit{Paintable
} och kan reagera på musklick genom
\textit{Clickable
}. Dessutom ärver klassen från
\textit{Observable
} för att kunna registrera lyssnare som sedan notifieras när en enhet går på rutan. Ett objekt av typen
\textit{MapSquare
} kan vara av typen
\textit{PathSquare, TurnSquare, BlockedSquare, TowerSquare, BlockedSquare, StartSquare
} och
\texit{GoalSquare
}. Typernas egenskaper beskrivs nedan.
371 \subsubsection{MapSquareFactory
}\label{sec:MapSquareFactory
}
372 Klassen
\textit{MapSquareFactory
}, används för att skapa nya instanser av olika implementationer av
\textit{MapSquareFactory
} från en sträng. Detta för att underlätta skapandet av nya sorters rutor. Designmönstret
\textit{Singelton
} implementeras för att säkerställa att en och endast en instans finns tillgänglig.
374 \subsubsection{PathSquare
}\label{sec:PathSquare
}
375 Klassen
\textit{PathSquare
}, representerar en vägruta och implementerar därför gränssnittet
\textit{Traversible
}. Enheter kan alltså befinna sig och färdas framåt på en ruta av denna typ. Klassen implementerar designmönstret
\textit{Observer/Observable
} tillsammans med klassen
\textit{Tower
} ur paketet
\textit{agent
}. När en enhet anropar en rutas
\textit{landOn()
}-metod notifieras kringliggande torn och pekaren till den anropande enheten skickas vidare till tornen (se
\pageref{Tower
})
377 \subsubsection{TurnSquare
}\label{sec:TurnSquare
}
378 Klassen
\textit{PathSquare
}, representerar en sväng och ärver från
\textit{PathSquare
}. Klassen innehåller en lista med giltiga riktningar samt ett attribut för den nuvarande vald riktning. När en enhet anropar metoden
\textit{landOn()
} som kontrollerar om enheten har passerat mittlinjen av rutan relativt enhetens riktning. Om det är sant tilldelas enheten rutans nuvarande valda riktning. Metoden
\textit{click()
} byter den nuvarande valda riktningen till nästa giltiga riktning samt roterar bilden till den nya riktningen.
380 \subsubsection{BlockedSquare
}\label{sec:BlockedSquare
}
381 Klassen
\textit{PathSquare
}, representerar en blockerad ruta. I nuvarande version innehåller klassen inga implementationer och fungerar enbart som en utfyllnad.
383 \subsubsection{TowerSquare
}\label{sec:TowerSquare
}
384 Klassen
\textit{PathSquare
}, representerar en ruta där torn kan placeras ut. Rutan kan innehålla en referens till ett torn och markeras då som upptagen.
386 \subsubsection{StartSquare
}\label{sec:StartSquare
}
387 Klassen
\textit{PathSquare
}, representerar en startruta som enheter kan släppas ut på. Den innehåller en kö där enheter lagras och släpper ut en efter en då detta inte skapar kollisioner mellan enheter. En startruta kan markeras med metoden
\textit{click()
} och detta sätter boolean
\textit{active
} till sann och i den grafiska representationen läggs en grön ram till runt rutan.
389 \subsubsection{GoalSquare
}\label{sec:GoalSquare
}
390 Klassen
\textit{PathSquare
}, representerar en målruta där enheter samlas in
395 % \subsubsection{MapSquarePrototypeFactory}\label{sec:MapSquarePrototypeFactory}
397 \subsection{Paketet se.umu.cs.dit06ajnajs.util
}
398 Paketet
\textit{se.umu.cs.dit06ajnajs.util
} innerhåller främst klasser
399 för att hantera läsning och skrivning av XML, från och till filerna
400 där banor sparas. De flesta av dessa klasser är deklarerade som
401 \textit{final
} och innehåller enbart statiska metoder.
403 \subsubsection{SoundPlayer
}\label{sec:SoundPlayer
}
404 Klassen
\textit{SoundPlayer
} används för att spela upp allt ljud som
405 finns i spelet. En variabel håller reda på om ljuden ska spelas eller
406 inte, det vill säga om användaren vill höra ljud till spelet eller om
407 spelet ska vara helt tyst.
409 \subsubsection{LevelEditor
}\label{sec:LevelEditor
}
410 Klassen
\textit{LevelEditor
} är ett litet program i sig. Klassen har
411 en
\textit{main(String
[]~args)-metod
} vilket innebär att den kan
412 startas. Startas
\textit{LevelEditor
} kommer ett gränssnitt att visas
413 där användaren kan välja bland de olika typer av kartrutor (av typen
414 \textit{MapSquare
}) och sedan klicka på en component för att ''rita''
415 ut och skapa en ny bana. Det finns en knapp
\textit{Save map
} för att
416 spara kartan som är gjord. Denna karta sparas till katalogen
417 \textit{resources
} i root-katalogen från vilken programmet körs och
418 kommer att heta
\textit{temp-levels.xml
}. För att denna karta ska gå
419 att använda i spelet måste det läggas till information om vilken
420 riktning startrutor ska släppa ut nya enheter, hur många enheter som
421 behövs för vinst och vilka torn som ska finnas vid start.
423 \subsubsection{LevelsXMLOutputter
}\label{sec:LevelsXMLOutputter
}
424 Klassen
\textit{LevelsXMLOutputter
} är deklarerad som
\textit{final
}
425 och har en statisk metod för att skriva och konvertera en
426 \textit{Level
} (
\ref{sec:Level
}) till en
\textit{java.io.Writer
}. I
427 den nuvarande implementationen sparas inte all nödvändig information
428 undan, enbart informationen som
\textit{LevelEditorn
} kan skapa
431 \subsubsection{LevelsXMLParser
}\label{sec:LevelsXMLParser
}
432 \subsubsection{XMLUtil
}\label{sec:XMLUtil
}
434 \section{Begränsningar
}\label{Begransningar
}
435 % Vilka problem och begränsningar har din lösning av uppgiften? Hur
436 % skulle de kunna rättas till?
438 % 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
440 \section{Reflektioner
}\label{Reflektioner
}
441 % Reflektioner - Var det något som var speciellt krångligt? Vilka
442 % problem uppstod och hur löste ni dem? Vilka verktyg använde ni? Hur
443 % upplevde ni de verktygen? + Allmänna synpunkter. Om ni har upplevt
444 % problem på grund av olika miljöer (i termer av operativsystem och
445 % liknande) så kan det även vara intressant att nämna det, samt motivera
448 \section{Testkörningar
}\label{Testkorningar
}
449 % Noggranna testkörningar där man ser att programmet fungerar som det
452 \section{Diskussion
}\label{Diskussion
}
453 % Diskutera om laborationen samt allmänt kring Web services och om hur
454 % och när det är användbart (och inte användbart). Saker som kan vara
455 % trevliga att ta upp är interoperabilitet, lite om prestanda, koncepten
456 % lös koppling och så vidare. Den här sektionen ska vara en betydande
457 % del av rapporten. Det är upp till er själva att ta reda på den
458 % information ni behöver, även om föreläsningsmaterialet kan vara
459 % väldigt användbart. Kom även här ihåg att referera till era källor
460 % (även om det är från föreläsningsmaterialet).
461 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.
463 \subsection{Model-View-Controller
}
464 % TODO Fill this section
466 \subsection{Vidareutveckling
}
467 Nedan följer förslag på förändringar för att vidareutveckla spelet.
469 \subsubsection{Klass Item
}
470 I inledningar av projektet planerades en abstrakt klass
\textit{Item
} som skulle representera en pryl vilken skulle kunna lagras i ett attribut i en MapSquare. Objekt av typen
\textit{Item
} skulle t.ex. kunna vara
\textit{HealtItem, SpeedItem, CreditItem
} som kan representera prylar som ger mer hälsa, ökad fart respektive ett antal crediter att handla med. Dessa prylar skulle användas genom att slumpmässigt läggas till i objekt av typen
\textit{PathSquare
} och alltså representeras grafiskt genom att rutan ritar ut prylen ovanpå sig. En ruta med en pryl på skulle sedan skicka vidare en inkommande enhets referens till prylen som i sin tur skulle manipulera enhetens attribut. En pryl med teleporterbeteende diskuteras under rubrik
\textit{Unit av typen TeleportUnit
} (se
\pageref{TeleportUnit
}).
472 \subsubsection{Unit av typen TeleportUnit
}\label{TeleportUnit
}
473 För att uppfylla nivå tre av denna laborations kravspecifikation krävs en enhet med möjlighet att placera ut så kallade teleport-plattor. Detta kan uppnås i detta projekt genom att skapa subklasser av
\textit{Item
} kallad t.ex.
\textit{TeleportStartItem
} och
\textit{TeleportEndItem
}. Prylen
\textit{TeleportStartItem
} skulle kunna bäras av en
\textit{Unit
} av typen
\textit{TeleporterUnit
} och kunna läggas ut på nuvarande ruta genom t.ex. musklick på enheten. Attribut som behövs i
\textit{TeleportStartItem
} är x- och y-koordinater till den tillhörande prylen
\textit{TeleportEndItem
} vilket i sin tur innehåller attribut för aktuell riktning som utsläppta enheter ska ha samt en kö där uppsamlade enheter läggs till för att sedan släppas ut en efter en då positionen är ledig. Algoritm för kollisionsdetektering skulle fungera på samma sätt som algoritmen som används när enheter släpps ut ur startrutor (se
\pageref{StartSquare
});
475 \subsubsection{Gränssnitt
}
476 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.
478 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.
481 \bibliographystyle{alpha
}
482 \bibliography{books.bib
}
486 \pagenumbering{arabic
}
487 \section{Källkod
}\label{sec:kallkod
}
488 % Källkoden ska finnas tillgänglig i er hemkatalog
489 % ~/edu/apjava/lab1/. Bifoga även utskriven källkod.
490 Härefter följer utskrifter från källkoden och andra filer som hör till
494 \subsection{AntiTD.java
}\label{AntiTD.java
}
495 \lstinputlisting{../src/se/umu/cs/dit06ajnajs/AntiTD.java
}