1 \documentclass[titlepage,
a4paper,
12pt
]{article
}
2 \usepackage[swedish
]{babel
}
3 \usepackage[utf8
]{inputenc}
13 % Include pdf with multiple pages ex \includepdf[pages=-, nup=2x2]{filename.pdf}
14 \usepackage[final
]{pdfpages
}
15 % Place figures where they should be
19 \definecolor{keywordcolor
}{rgb
}{0.5,
0,
0.75}
24 basicstyle=
\scriptsize\ttfamily,
25 stringstyle=
\color{blue
},
26 commentstyle=
\color{red
},
29 numberblanklines=true,
31 showstringspaces=false,
32 keywordstyle=
\color{keywordcolor
}
33 % identifierstyle=\color{identifiercolor}
38 \newfloat{kod
}{H
}{lop
}
39 \floatname{kod
}{Kodsnutt
}
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
}
65 \begin{tabular
}{@
{}p
{\textwidth}@
{}}
66 UMEÅ UNIVERSITET
\hfill \today \\
67 Institutionen för
\inst \\
74 \huge{\textbf{\kurs}} \\
84 \large{\textbf{Handledare
}}\\
85 \mbox{\large{\handledareTre}}
86 \mbox{\large{\handledareTva}}
87 \mbox{\large{\handledareEtt}}
88 \mbox{\large{\handledareFyra}}
96 % Dedication goes here
103 \lhead{\footnotesize{\namn,
\mail\\
\namnTva,
\mailTva}}
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:
153 \verb!> java -jar AntiTD.jar!
156 Problemspecifikation finns i original på sidan:\\
158 \verb!http://www.cs.umu.se/kurser/
5DV085/HT08/labbar/lab4.html/!
159 (kontrollerad
090112)
% DONE check
162 \subsection{Antaganden om problemspecifikationen
}
163 I samtliga nivåer nämns i originalspecifikationen hur menyradens
164 funktionalitet ska utvecklas. Specifika riktlinjer ges om hur
165 menyalternativ ska byta namn beroende på applikationens
166 tillstånd. Eftersom lösningen som presenteras i denna rapport hanterar
167 namnbyten för de menyalternativ som för författarna känns relevant,
168 görs antagandet att detta räcker för att visa att tekniken behärskas.
170 Vidare nämns ett gränssnitt som innehåller metod
\textit{landOn()
}. I
171 denna lösning antas denna metod få förändras enligt tycke, t.ex. genom
172 att låta metoden ta paramterar.
174 \section{Användarhandledning
}\label{Anvandarhandledning
}
175 % Förklara var programmet och källkoden ligger samt hur man kompilerar,
176 % startar och använder det. Förklara även översiktligt vad som händer
177 % när man använder de olika kommandona. Det räcker alltså inte att
178 % skriva "man skriver 'ant' för att kompilera", utan det måste även ingå
179 % en liten förklaring om vad som egentligen händer när man kör ant och
180 % varför det fungerar. Använd Internet eller litteratur för att själva
181 % ta reda på den information ni tycker känns relevant, dels för
182 % rapportens skull och dels för er egen. Kom ihåg att skriva tydliga
183 % (vetenskapliga) referenser!
184 Nedan följer en beskrivningar om hur spelet kompileras, startas och
187 \subsection{Att kompilera och starta spelet
}
189 Alla filer som behövs för att kompilera och köra detta spel ligger på
190 servrar som tillhandahålls av institutionen för datavetenskap i Umeå i katalogen:\\
193 Denna katalog innehåller i sin tur några kataloger:
195 \item Katalogen
\verb!src! innehåller källkoden.
196 \item Katalogen
\verb!test! innehåller testkod.
197 \item Katalogen
\verb!bin! innehåller vid kompilering alla .class
198 filer och andra filer, såsom bilder och ljud.
199 \item Katalogen
\verb!lib! innehåller olika bibliotek som behövs för
200 att köra och kompilera programmet. En sådan jar-fil är
201 \verb!jdom.jar!, som används för att spara och läsa XML-filer. Alla
202 andra filer rör sparande av poäng till en webbtjänst, det vill säga
203 jar-filer från webbtjänstbiblioteket
\textit{Apache
204 Axis2
}\footnote{http://ws.apache.org/axis2
}.
205 \item Katalogen
\verb!doc! innehåller Javadoc API-dokumentation.
208 Följande kommandon förutsätter att programmet
\textit{Apache
209 Ant
}\footnote{http://ant.apache.org/
} är installerat. Verktyget
210 \textit{Ant
} är ett byggverktyg som använder sig av specifikationen
211 lagrad i en XML-fil, oftast
\textit{build.xml
}, för att automatisera
212 alla nödvändiga operationen vid kompilering av ett projekt. Detta kan
213 innefatta all typ av filhantering, det vill säga kopiering,
214 borttagning och flyttning, men även själva kompileringen av
215 projektet. Verktyget kan ses som ett specialanpassat skript för att
216 kompilera hela projekt.
218 Spelet kompileras med kommandot:\\
220 \verb!salt:~/edu/apjava/lab4> ant!
223 Det som händer vid anrop av kommandot ovan är att
\textit{Ant
} läser
224 av filen
\textit{build.xml
} och letar efter standardkommandona att
225 köra. I det här fallet är det operationerna som är definierade i
226 XML-elementet
\verb!<target />! med attributet
227 \verb!name="compile"!. Oftast har taggarna i
\textit{build.xml
}
228 relativt självförklarande namn, de motsvarar i många fall direkta
229 kommandon som går att köra i en terminal. Nu ska programmet vara
230 kompilerat och ligga i katalogen
\verb!bin/main!.
232 Spelet startas med kommandot:\\
234 \verb!salt:~/edu/apjava/lab4> ant run!
237 En banredigerare kan startas med kommandot:\\
239 \verb!salt:~/edu/apjava/lab4> ant run-editor!
242 Spelet kan även kompileras till en jar-fil som kan köras utan att
243 \textit{Ant
} är installerat, detta görs med kommandot:\\
245 \verb!salt:~/edu/apjava/lab4> ant jar!
248 Efter ovan kommando kommer det att skapas en fil
\verb!AntiTD.jar! i
249 samma katalog. För att starta spelet kan denna jar-fil köras med
252 \verb!salt:~/edu/apjava/lab4> java -jar AntiTD.jar!
255 För att jar-filen ska kunna köras måste de bibliotek som behövs för
256 körning finnas i en katalog
\verb!lib! på samma sökväg som körningen
259 \subsection{Att använda det grafiska gränssnittet
}
260 Ett spel startas automatiskt vid start men när som helst kan ett helt
261 nytt spel startas genom att i menyraden välja
\textit{AntiTD
} och
262 därefter
\textit{New Game
}. I menyn
\textit{AntiTD
} finns också andra
263 självförklarande funktioner som
\textit{Restart Level, Paus/Resume,
264 Mute/unMute
} och
\textit{Quit
}, se skärmdumpar från avsnitt
265 \ref{Testkorningar
}, sida
\pageref{Testkorningar
}. Till höger om
266 spelplanen tillhandahålls en kontrollpanel där enheter markeras genom
267 att klicka på dem i listan. Därefter, kontrollera att en lämplig
268 startruta är markerad. En markerad startruta visas genom att ett grönt
269 sträck ritas ut under startrutans bild. Tryck på knappen
270 \textit{Release Unit
} för att nu släppa ut enheten på
271 banan. Manipulera enhetens frammarsch på banan genom att snurra på
272 riktningspilarna i kurvor och korsningar. Detta görs genom att klicka
273 på pilarna och dessa snurrar då runt till nästa giltiga riktning.
275 \section{Systembeskrivning
}\label{Systembeskrivning
}
276 % Beskriv översiktligt hur programmet är uppbyggt och hur det löser
279 Följande avsnitt beskriver de olika delarna av programmet uppdelat
280 paketvis med beskrivningar över vad de olika klasserna har för
281 funktion. Även en kort beskrivning över resurserna programmet använder
282 när det gäller filer som inte är Java-kod.
284 \subsection{Paketet se.umu.cs.dit06ajnajs
}
285 Paketet
\textit{se.umu.cs.dit06ajnajs
} är huvudpaket som används i
286 programmet. I detta paket ligger de klasser som startar och
287 kontrollerar körningen av hela programmet. Se diagram i figur
288 \ref{fig:dit06ajnajs-uml
} för en översiktlig beskrivning över hur
289 klasserna använder varandra.
293 \includegraphics[width=
110mm
]{images/mvc.pdf
}
295 \label{fig:dit06ajnajs-uml
}
299 \subsubsection{AntiTD
}\label{sec:AntiTD
}
300 Klassen
\textit{AntiTD
} används för att en användare ska kunna starta
301 programmet. Här kan ett argument skickas med vid start som ska hänvisa
302 till en XML-fil som innehåller information om banorna som ska spelas i
303 spelet. Om inget argument anges kommer en förinställd fil att
304 användas, se
\textit{levels.xml
} sida
305 \pageref{sec:levels.xml
}. XML-filerna ska följa schemat
306 \textit{levels.xsd
}, se sida
\pageref{sec:levels.xsd
}.
308 \subsubsection{ATDController
}\label{sec:ATDController
}
309 Klassen
\textit{ATDController
} är programmets huvudklass. Enligt
310 design-mönstret
\textit{Model-View-Controller
} motsvarar denna klass
311 \textit{Controllern
}, alltså den klass som kontrollerar hela
312 programmets exekvering. Från denna klass konstruktor skapas
313 motsvarande
\textit{Model
} och
\textit{View
}.
315 Det startas två viktiga trådar när denna klass skapas,
316 \textit{AnimationThread
} och
\textit{CreditThread
}, se
317 algoritmbeskrivning på sida
\pageref{sec:Algoritmbeskrivning
}.
319 \subsubsection{ATDModel
}\label{sec:ATDModel
}
320 Klassen
\textit{ATDModel
} hanterar informationen som behövs för varje
321 spel. Här finns en spelare (
\textit{Player
}), en lista med banor
322 (
\textit{Level
}), en lista med alla enheter (
\textit{Unit
})som är ute
323 på den aktiva banan, och så vidare. Denna information använder och
324 ändrar
\textit{ATDController
} och
\textit{ATDView
} läser
327 Denna klass agerar som ett mellansteg för informationen som finns
328 sparade i många av de klasser som finns i de paketen
329 \textit{se.umu.cs.dit06ajnajs.agent
} och
330 \textit{se.umu.cs.dit06ajnajs.level
}. Bland annat finns det metoder
331 för att lägga till torn och enheter i spelet.
333 \subsubsection{ATDView
}\label{sec:ATDView
}
334 Klassen
\textit{ATDView
} är spelets grafiska gränssnitt. Här ritas en
335 komponent ut som innehåller själva spelplanen och ett antal
336 komponenter för att styra spelets flöde finns. Metoder för att fästa
337 lyssnare på specifika komponenter finns för att
\textit{ATDController
}
338 ska kunna fästa lyssnare på dem.
340 Metoder för att rita om spelplanen finns tillgängliga för att
341 \textit{ATDController
} ska kunna uppdatera gränssnittet efter varje
342 uppdatering av speldatan.
344 \subsubsection{Paintable
}\label{sec:Paintable
}
345 Gränssnittet
\textit{Paintable
} ska implementeras av allt som ska
346 kunna ritas upp på spelplanen. Detta görs då med metoden
347 \textit{paint(Graphics g)
}.
349 \subsubsection{Clickable
}\label{sec:Clickable
}
350 Gränssnittet
\textit{Clickable
}, är ett gränssnitt med metod
351 \textit{click()
}. Instanser av
\textit{Clickable
} reagerar på
352 metodanropet på olika sätt beroende på implementation.
354 \subsubsection{Player
}\label{sec:Player
}
355 Klassen
\textit{Player
} representerar en spelare av spelate. Här
356 sparas poäng, krediter och vilken nivån användaren spelar.
358 \subsection{Paketet se.umu.cs.dit06ajnajs.agent
}
359 Klasserna i paket
\textit{dit06ajnajs.agent
} representerar agenter i
360 spelet som ska kunna agera på kartan. Se klassdiagrammet i figur
361 \ref{fig:agent-uml
} för en överblick hur de olika agentera beror av
366 \includegraphics[width=
110mm
]{images/agent.pdf
}
368 \label{fig:agent-uml
}
372 \subsubsection{Agent
}\label{sec:Agent
}
373 Gränssnittet
\textit{Agent
}, implementeras av alla klasser som ska
374 agera under spelets gång, detta gäller för närvarande instanser av
375 underklasser till
\textit{Unit
} och
\textit{Tower
}. Gränssnittet
376 utökar gränssnitten
\textit{Paintable
},
\textit{Clickable
} och
377 \textit{Cloneable
}. Det vill säga varje agent i spelat ska kunna rita
378 ut sig själv, det ska gå att klicka på dem och det ska gå att klona
379 dem se avsnitt
\ref{sec:AgentPrototypeFactory
}.
381 \subsubsection{AgentPrototypeFactory
}\label{sec:AgentPrototypeFactory
}
382 Klassen
\textit{AgentPrototypeFactory
} används för att skapa instanser
383 av underklasser till de abstrakta klasserna
\textit{Tower
} och
384 \textit{Unit
}. Klassen är implementerad enligt designmönstret
385 \textit{Singleton
}, det vill säga det får enbart finnas en instans av
386 denna klass under programmets körning. För att få tag på denna instans
387 används den statiska metoden
\textit{getInstance()
}.
389 I konstruktorn instansieras och sätts variabler som definierar de
390 olika enheterna, se beskrivning av
\textit{Unit
}, sida
391 \pageref{sec:Unit
}, och
\textit{Tower
}, sida
\pageref{sec:Tower
}, för
392 vilka variabler som finns och vad de gör. Detta innebär att det inte
393 behöver skapas en ny klass för varje ny typ av enhet eller torn som
394 ska skapas, det går dock alltid att skapa unika beteenden genom att
395 göra en ny klass som utökar klassen
\textit{Unit
} och överlagrar någon
396 av dess metoder, till exempel
\textit{act()
}.
398 En positiv effekt som fås genom kloning av enheter är att många av
399 dess resurser delas för varje enhet. Varje enhet som finns i spelet
400 har gemensamma referenser till bilder och ljud de ritar upp och
403 \subsubsection{Tower
}\label{sec:Tower
}
404 Den abstrakta klassen
\textit{Tower
} ska utökas av underklasser för
405 att skapa representationer av torn som ska kunna agera i ett spel. Ett
406 torn består av ett flertal attribut som kommer att definiera stora
407 delar av dess utseende och beteende.
409 Klassen implementerar gränssnitten
\textit{Agent
},
410 \textit{Observer
}. Torn observerar de rutor av typen
411 \textit{PathSquare
}, som är inom dess räckvid, för att få information
412 om det kommer enheter (av typen
\textit{Unit
}) att möjligtvis skjuta
413 på, se algoritmbeskrivning på sida
\pageref{sec:algo-tower
}.
415 Metoder med logik för att flytta enheten finns implementerade, bland
416 dessa är
\textit{act()
} och
\textit{collision()
} viktiga.
418 \subsubsection{BasicTower
}\label{sec:BasicTower
}
419 Klassen
\textit{BasicTower
} utökar den abstrakta klassen
420 \textit{Tower
} och representerar det enklast möjliga tornet som finns
421 implementerat i detta spel. Klassen innehåller inga egna
422 implementationer utan ärver metoderna i
\textit{Tower
} rakt av.
424 \subsubsection{Unit
}\label{sec:Unit
}
425 Den abstrakta klassen
\textit{Unit
} ska utökas av underklasser för att
426 skapa representationer av enheter som ska kunna agera i ett
427 spel. En enhet består av ett flertal attribut som kommer att definiera
428 stora delar av dess utseende och beteende. Exempelvis finns en tabell
429 som innehåller olika bilder för varje rikting enheter har, en annan
430 tabell innehåller ljud för olika tillfällen.
432 Viktiga attribut är x- och y-position på kartan, dessa används för att
433 enheten ska kunna rita ut sig själv på rätt plats. Vid förflyttning av
434 en enhet ändras x- y-position.
436 En centerpunkt räknas även ut för varje ändring av x- och
437 y-position. Denna punkt används bland annat för att räkna avstånd
438 mellan torn och enhet.
440 Varje enhet har även metoder för att returnera en rektangel som
441 definierar dess nuvarande och framtida yttre gränser på en bana. Denna
442 rektangel används vid kollisionsuträkning se algoritmbeskrivning på
443 sida
\pageref{sec:alog-kollision
}.
445 Metoder med logik för att flytta enheten finns implementerade, bland
446 dessa är
\textit{act()
} och
\textit{collision()
} viktiga.
447 % TODO algobeskrivning nånstans här?
449 \subsubsection{FootmanUnit
}\label{sec:FootmanUnit
}
450 Klassen
\textit{FootmanUnit
} utökar den abstrakta klassen
451 \textit{Unit
} och representerar den enklast möjliga enheten som finns
452 implementerat i detta spel. Klassen innehåller inga egna
453 implementationer utan ärver metoderna i
\textit{Unit
} rakt av.
455 \subsubsection{Direction
}\label{sec:Direction
}
456 Uppräkningen (''Enumeration'')
\textit{Direction
} innehåller olika
457 riktningar som är giltiga i spelet. Giltiga värden är
\textit{UP,
458 DOWN, LEFT, RIGHT, NONE
}. Riktningen
\textit{NONE
} finns med för att
459 hantera skapande av rutor i banredigeraren som ännu inte har någon
462 \subsection{Paketet se.umu.cs.dit06ajnajs.level
}
463 Paketet
\textit{level
} innehåller en samling klasser som har en
464 koppling till en bana i spelet. En bana är uppbyggd utav rutor av
465 olika karaktär. Se klassdiagram över de olika kartrutorna i figur
466 \ref{fig:kartrutor-uml
}.
470 \includegraphics[width=
110mm
]{images/level.pdf
}
471 \caption{Klassdiagram över kartrutor
}
472 \label{fig:kartrutor-uml
}
476 \subsubsection{Traversable
}\label{sec:Traversable
}
477 Gränssnittet
\textit{Traversable
}, är ett gränssnitt med metod
478 \textit{landOn()
} vilket tar emot en
\textit{Unit
} som parameter och
479 manipulerar denna beroende av tillståndet av instansen av
480 \textit{Traversible
}.
482 \subsubsection{Level
}\label{sec:Level
}
483 Klassen
\textit{Level
}, motsvarar en bana tänkt att användas i ett
484 rutbaserat spel. Klassen implementerar gränsnitten
\textit{Paintable,
485 Cloneable, Clickable
}. Banan kan alltså bland annat representeras
486 grafiskt genom
\textit{Paintable
} och kan reagera på musklick genom
487 \textit{Clickable
}. Klassen innehåller en två-dimensionell lista
488 vilket innehåller instanser av typen
\textit{MapSquare
}. Listor finns
489 även med pekare till de rutor som representerar start- och målrutor.
491 \subsubsection{MapSquare
}\label{sec:MapSquare
}
492 Klassen
\textit{Level
}, är en abstrakt klass som motsvarar en ruta
493 tänkt att användas för att kombineras till en bana i ett rutbaserat
494 spel. Gränsnitten
\textit{Paintable, Cloneable, Clickable
}
495 implementeras. Rutan kan alltså bland annat representeras grafiskt
496 genom
\textit{Paintable
} och kan reagera på musklick genom
497 \textit{Clickable
}. Dessutom ärver klassen från
\textit{Observable
}
498 för att kunna registrera lyssnare som sedan notifieras när en enhet
499 går på rutan. Ett objekt av typen
\textit{MapSquare
} kan vara av typen
500 \textit{PathSquare, TurnSquare, BlockedSquare, TowerSquare,
501 BlockedSquare, StartSquare
} och
\textit{GoalSquare
}. Typernas
502 egenskaper beskrivs nedan.
504 \subsubsection{MapSquareFactory
}\label{sec:MapSquareFactory
}
505 Klassen
\textit{MapSquareFactory
}, används för att skapa nya instanser
506 av olika implementationer av
\textit{MapSquareFactory
} från en
507 sträng. Detta för att underlätta skapandet av nya sorters
508 rutor. Designmönstret
\textit{Singelton
} implementeras för att
509 säkerställa att en och endast en instans finns tillgänglig.
511 \subsubsection{PathSquare
}\label{sec:PathSquare
}
512 Klassen
\textit{PathSquare
}, representerar en vägruta och
513 implementerar därför gräns\-snittet
\textit{Traversible
}. Enheter kan
514 alltså befinna sig och färdas framåt på en ruta av denna typ. Klassen
515 implementerar designmönstret
\textit{Observer/Observable
} tillsammans
516 med klassen
\textit{Tower
} ur paketet
\textit{agent
}. När en enhet
517 anropar en rutas
\textit{landOn()
}-metod notifieras kringliggande torn
518 och pekaren till den anropande enheten skickas vidare till tornen (se
519 \pageref{sec:Tower
}).
521 \subsubsection{TurnSquare
}\label{sec:TurnSquare
}
522 Klassen
\textit{PathSquare
}, representerar en sväng och ärver från
523 \textit{PathSquare
}. Klassen innehåller en lista med giltiga
524 riktningar samt ett attribut för den nuvarande vald riktning. När en
525 enhet anropar metoden
\textit{landOn()
} som kontrollerar om enheten
526 har passerat mittlinjen av rutan relativt enhetens riktning. Om det är
527 sant tilldelas enheten rutans nuvarande valda riktning. Metoden
528 \textit{click()
} byter den nuvarande valda riktningen till nästa
529 giltiga riktning samt roterar bilden till den nya riktningen.
531 \subsubsection{BlockedSquare
}\label{sec:BlockedSquare
}
532 Klassen
\textit{PathSquare
}, representerar en blockerad ruta. I
533 nuvarande version innehåller klassen inga implementationer och
534 fungerar enbart som en utfyllnad.
536 \subsubsection{TowerSquare
}\label{sec:TowerSquare
}
537 Klassen
\textit{PathSquare
}, representerar en ruta där torn kan
538 placeras ut. Rutan kan innehålla en referens till ett torn och
539 markeras då som upptagen.
541 \subsubsection{StartSquare
}\label{sec:StartSquare
}
542 Klassen
\textit{PathSquare
}, representerar en startruta som enheter
543 kan släppas ut på. Den innehåller en kö där enheter lagras och släpper
544 ut en efter en då detta inte skapar kollisioner mellan enheter. En
545 startruta kan markeras med metoden
\textit{click()
} och detta sätter
546 boolean
\textit{active
} till sann och i den grafiska representationen
547 läggs en grön ram till runt rutan.
549 \subsubsection{GoalSquare
}\label{sec:GoalSquare
}
550 Klassen
\textit{PathSquare
}, representerar en målruta där enheter
551 samlas in och sparas i en lista, alla enheter som samlas sätts till
552 att vara döda. När metoden
\textit{getCredit()
} anropas så ges
100
553 poäng för varje enhet i listan och listan rensas.
555 \subsubsection{NoActiveStartSquareException
}\label{sec:NoActiveStartSquareException
}
556 Klassen
\textit{NoActiveStartSquareException
} är ett undantag som
557 utökar
\textit{RuntimeException
}. Detta undantag kan kastas om det
558 skulle vara så att ingen aktiv startruta är aktiv när en användare
559 försöker sätta ut en ny enhet.
561 \subsection{Paketet se.umu.cs.dit06ajnajs.util
}
562 Paketet
\textit{se.umu.cs.dit06ajnajs.util
} innerhåller främst klasser
563 för att hantera läsning och skrivning av XML, från och till filerna
564 där banor sparas. De flesta av dessa klasser är deklarerade som
565 \textit{final
} och innehåller enbart statiska metoder.
567 \subsubsection{SoundPlayer
}\label{sec:SoundPlayer
}
568 Klassen
\textit{SoundPlayer
} används för att spela upp allt ljud som
569 finns i spelet. En variabel håller reda på om ljuden ska spelas eller
570 inte, det vill säga om användaren vill höra ljud till spelet eller om
571 spelet ska vara helt tyst.
573 \subsubsection{LevelEditor
}\label{sec:LevelEditor
}
574 Klassen
\textit{LevelEditor
} är ett litet program i sig. Klassen har
575 en
\textit{main(String
[]~args)-metod
} vilket innebär att den kan
576 startas. Startas
\textit{LevelEditor
} kommer ett gränssnitt att visas
577 där användaren kan välja bland de olika typer av kartrutor (av typen
578 \textit{MapSquare
}) och sedan klicka på en component för att ''rita''
579 ut och skapa en ny bana. Det finns en knapp
\textit{Save map
} för att
580 spara kartan som är gjord. Denna karta sparas till katalogen
581 \textit{resources
} i root-katalogen från vilken programmet körs och
582 kommer att heta
\textit{temp-levels.xml
}. För att denna karta ska gå
583 att använda i spelet måste det läggas till information om vilken
584 riktning startrutor ska släppa ut nya enheter, hur många enheter som
585 behövs för vinst och vilka torn som ska finnas vid start.
587 Denna klass implementerades för att på ett snabbt och enkelt sätt
588 kunna skapa flera olika kartor till spelet.
590 \subsubsection{LevelsXMLOutputter
}\label{sec:LevelsXMLOutputter
}
591 Klassen
\textit{LevelsXMLOutputter
} är deklarerad som
\textit{final
}
592 och har en statisk metod för att skriva och konvertera en
593 \textit{Level
} (
\ref{sec:Level
}) till en
\textit{java.io.Writer
}. I
594 den nuvarande implementationen sparas inte all nödvändig information
595 undan, enbart informationen som
\textit{LevelEditorn
} kan skapa
598 \subsubsection{LevelsXMLParser
}\label{sec:LevelsXMLParser
}
599 Klassen
\textit{LevelsXMLParser
} har två metoder för att tolka
600 XML-dokument som följer XML-schemat i avsnitt
\ref{sec:levels.xsd
} och
601 bygga upp kompletta ban-instanser
\textit{Level
} (
\ref{sec:Level
}).
603 \subsubsection{XMLUtil
}\label{sec:XMLUtil
}
604 Klassen
\textit{XMLUtil
} har metoder för att ladda en fil, via
605 \textit{java.net.URL
} eller
\textit{java.io.File
}, och returnera ett
606 validerat dokument,
\textit{org.jdom.Document
}.
608 \subsection{Resurser
}
609 Resurser som används av programmet men som inte är Java-filer ligger i
610 katalogen
\verb!src/resources!. Nedan avsnitt beskriver de filer och
611 mappar som ligger i denna katalog.
613 \subsubsection{Filen levels.xml
}\label{sec:levels.xml
}
614 Filen
\textit{levels.xml
} innehåller standarduppsättningen av banor
615 spelet använder. Filen följer schemat
\textit{levels.xsd
} och kan
616 exempelvis vara utformad enligt kodsnutt
\ref{kod:levels.xml
}.
621 <level name="MegaMap" unitsToWin="
5">
623 <tower type="BasicTower" />
624 <tower type="BasicTower" />
627 <square type="BlockedSquare" />
628 <square type="StartSquare direction="RIGHT" />
629 <square type="PathSquare" />
630 <square type="BlockedSquare" />
633 <square type="BlockedSquare" />
634 <square type="BlockedSquare" />
635 <square type="GoalSquare" />
636 <square type="BlockedSquare" />
641 \caption{Exempel XML
}\label{kod:levels.xml
}
644 \subsubsection{Filen levels.xsd
}\label{sec:levels.xsd
}
645 Filer
\textit{levels.xsd
} innehåller ett XML-Schema
646 \footnote{http://www.w3.org/XML/Schema
} som definierar hur giltiga
647 XML-dokument till spelet ska vara utformade. Se kodsnutt
648 \ref{kod:levels.xml
} för exempel på ett giltigt dokument.
650 \subsubsection{Katalogen sounds
}\label{sec:sounds
}
651 Katalogen
\textit{sounds
} innehåller ljud som spelas upp i spelet.
653 \subsubsection{Katalogen map-images
}\label{sec:map-images
}
654 Katalogen
\textit{map-images
} innehåller bilder som används av klasser av
655 typen
\textit{MapSquare
} (se avsnitt
\ref{sec:MapSquare
}).
657 \subsubsection{Katalogen tower-images
}\label{sec:tower-images
}
658 Katalogen
\textit{tower-images
} innehåller bilder som används av klasser
659 av typen
\textit{Tower
} (se avsnitt
\ref{sec:Tower
}).
661 \subsubsection{Katalogen unit-images
}\label{sec:unit-images
}
662 Katalogen
\textit{unit-images
} innehåller bilder som används av
663 klasser av typen
\textit{Unit
} (se avsnitt
\ref{sec:Unit
}).
666 \subsection{Algoritmbeskrivning
}\label{sec:Algoritmbeskrivning
}
667 Följande avsnitt förklarar några av algoritmerna som finns
668 implementerade i spelet i mer detalj.
670 \subsubsection{Tråden AnimationThread
}
671 Tråden
\textit{AnimationThread
} är aktiv under hela applikationens
672 livstid. Följande steg genomförs för varje iteration.
675 \item Starta tidtagning.
676 \item Är spelet pausat?
678 \item Om ja, gå till en inre oändlig loop som fortsätter snurra
679 tills dess att spelet går ur pausläget.
680 \item Om nej, gå till nästa steg.
682 \item För varje enhet på bana, kontrollera kollisioner och säg till
683 enhet att agera (se algoritmbeskrivning
\textit{Kollisionshantering
}
684 samt algoritmbeskrivning
\textit{Enheternas act()
}).
685 \item Samla upp döda enheter och meddela
\textit{ATDController
} att
686 dessa ska tas bort från modellen.
687 \item För varje torn på banan, säg till torn att agera (se
688 algoritmbeskrivning
\textit{Tornens act()
}).
689 \item För varje målruta, samla in enheter och räkna mängden tjänade
691 \item Är spelet redan vunnit?
693 \item Om ja, gör inget av krediterna och gå vidare.
694 \item Om nej, tilldela spelaren (
\textit{Player
}) krediterna och
697 \item För varje startruta, släpp ut enheter från kö om utsläppet
698 inte innebär en kollision
699 \item För varje
\textit{Agent
}, anropa dess metod
\textit{Paint()
}.
700 \item Uppdatera spelkomponenten i
\textit{ATDView
} (se
701 algoritmbeskrivning
\textit{Utritning av spelet
}).
702 \item Stoppa tidtagning och sov tråden den kvarvarande tiden av det
703 förinställda tidssteget för att sedan börja om från steg
1.
708 \subsubsection{Tråden CreditThread
}
709 Tråden
\textit{CreditThread
} är aktiv under hela applikationens
710 livstid. Följande steg genomförs för varje iteration.
713 \item Är spelet pausat?
715 \item Om ja, gå till en inre oändlig loop som fortsätter snurra
716 tills dess att spelet går ur pausläget.
717 \item Om nej, gå till nästa steg.
719 \item Beräkna antalet tjänade krediter genom att kontrollera hur
720 många enheter som finns ute på spelplanen. Lägg dessa till spelaren
722 \item Är målet för banan uppnått?
724 \item Om ja, sluta räkna poäng och meddela
725 \textit{ATDController
} att banan är avklarad.
726 \item Om nej, gå till nästa steg.
728 \item Är banan förlorad?
730 \item Om ja, meddela
\textit{ATDControllern
} att banan är
732 \item Om nej, gå till nästa steg.
734 \item Sov ett förinställt intervall och börja sedan om.
737 \subsubsection{Kollisionshantering
}\label{sec:alog-kollision
}
738 För att inte enheter ska gå över varandra är kollisionshantering
739 implementerat. Innan varje enhet rör sig kollas enhetens framtida
740 position med alla andra enheters nuvarande position för att se om det
741 kommer att bli någon kollision, se figur
\ref{fig:algo-kollision
}. I
742 figurens läge
1 ska
\textit{Unit2
} förflytta sig, i läge
2 testas
743 enhetens framtida position, mot alla andra enheter på spelplanen,
744 eftersom det blev en kollision pausas
\textit{Unit2
} och läge
3
749 \includegraphics[width=
110mm
]{images/collision.pdf
}
750 \caption{Kollision mellan två enheter
}
751 \label{fig:algo-kollision
}
755 Om det inträffar en kollision och enheterna har motsatt riktning, det
756 vill säga ena enheten rör sig med riktning
\textit{UP
} och andra
757 \textit{DOWN
} eller
\textit{LEFT
} mot
\textit{RIGHT
}, sätts båda
758 enheternas riktning till den motsatta de för närvarande färdas i och
759 första enheten flyttar sig. Om det inträffa kollision där enheterna
760 inte har motsatt riktning får enheten som kollen gjordes för inte
761 förflytta sig denna omgång.
763 % TODO ALgoritm besk vis
764 \subsubsection{Krediträkning
}
765 I nuläget beräknas spelarens intjänade krediter på ett mycket enkelt
766 sätt och kan ses som en tillfällig implementation. För varje iteration
767 i tråden
\textit{CreditThread
} baseras den intjänade krediten av
768 antalet enheter på kartan multiplicerat med
10. För varje iteration i
769 tråden
\textit{AnimationThread
} samlas enheter in från målrutor och
770 totala antalet multipliceras med
100.
772 \subsubsection{Tornens act()
}\label{sec:algo-tower
}
773 När det är dags för torn att sköta sin uppdatering körs dess
774 \textit{act()
} metod, se kodsnutt
\ref{kod:act-tower
}.
776 Om det finns enheter i listan
\textit{fireingList
} som lever så
777 beskjuts dessa om de är inom räckhåll annars så tas de bort ur listan.
783 if (!fireingList.isEmpty())
{
784 Unit unit = fireingList.get(
0);
785 if (unit.isAlive())
{
786 Point unitPoint = unit.getCenterPoint();
788 int unitXPos = unitPoint.x;
789 int unitYPos = unitPoint.y;
790 int distans = (int) Math.hypot((this.centerX - unitXPos),
791 this.centerY - unitYPos);
792 if (distans < this.range)
{
793 logger.info("UNIT IN RANGE, FIIIIIREEEEEEE!!!");
797 fireingList.remove(unit);
800 fireingList.remove(unit);
806 \caption{Tower act(...)
}\label{kod:act-tower
}
810 \subsubsection{Enheternas act()
}
811 När det är dags för enheter att sköta sin uppdatering körs dess
812 \textit{act()
} metod, se kodsnutt
\ref{kod:act-unit
}.
814 Om enheten lever och inte är pausad så förflyttar den sig till sin
815 nästa position och anropar rutans metod
\textit{landOn(this)
}. Om den
816 av någon oförutsägbar händelse skulle hamna utanför rutor som är
817 traverserbara
\textit{Traversible
} så dör de.
819 Om enheten var pausad så sätts den som icke pausad så att den har
820 möjlighet att röra sig i nästa tidssteg.
826 // Check if this unit has health left
827 if (this.currentHealth >
0)
{
828 // Check if this unit is active
830 Point nextPos = getNextPosition();
831 // TODO check for collision on next position
834 // Land on current square
835 MapSquare currentSquare
836 = level.getMapSquareAtPoint(centerX, centerY);
837 if (currentSquare instanceof Traversable)
{
838 ((Traversable) currentSquare).landOn(this);
840 // Unit hitting something not Traversable and therefore
845 // Toggle pause back to false;
851 SoundPlayer.play(sounds.get("dead"));
856 \caption{Unit act(...)
}\label{kod:act-unit
}
859 \subsubsection{Svängar
}
860 En enhets svängs av antingen en
\textit{TurnSquare
} eller genom av en
861 annan enhet,
\textit{Unit
}. Enheter får nya riktningar (svängs) genom
862 att metoden
\textit{setDirection(...)
} körs, se kodsnutt
863 \ref{kod:setDirection
}. Första parametern som anges är den nya
864 riktning enheten ska ha, andra parametern ska innehålla en referens
865 till det objekt som kallade på metoden. Denna lösningen gör att en
866 enhet inte kan svängas två gånger i rad av samma objekt. Denna lösning
867 valdes eftersom en enhet inte ska kunna svängas flera gånger i rad av
868 samma
\textit{TurnSquare
} när en användare klickar upprepade gånger på
869 denna under tiden som enheten befinner sig inom rutan.
871 En enhet svängs av en svängruta,
\textit{TurnSquare
}, om enhetens
872 mittpunkt har passerat rutans mittpunkt.
874 En enhet svängs vid kollision med en annan enhet om enheterna har
880 public void setDirection(Direction direction, Object caller)
{
881 if (this.lastTurnedBy != caller)
{
882 this.direction = direction;
883 this.lastTurnedBy = caller;
885 logger.info("Turned by same caller twice: " + caller);
890 \caption{Metoden setDirection(...)
}\label{kod:setDirection
}
893 \subsubsection{Utritning av spelet
}
894 Spelplanen ritas ut på en komponent i
\textit{ATDView
}. Denna
895 komponent är en inre klass som utökar Javas
\textit{JComponent
} och är
896 döpt till
\textit{GameComponent
}. När denna komponent skapas hämtas en
897 bild från
\textit{ATDModel
} och sparas undan i ett attribut.
899 Metoden
\textit{paintComponent(Graphics g)
} överlagras för att rita ut
900 spelet i gräns\-snittet. Vid varje uppdatering av spelplanen körs denna
901 metod enligt kodsnutt
\ref{kod:paintComponent
}.
906 public void paintComponent(Graphics g)
{
907 logger.fine("paintComponent: " + Thread.currentThread().toString());
909 // Draw backgroundImage
910 g.drawImage(backgroundImage,
0,
0, null);
912 // Draw gameImage which should contain updated information from
914 g.drawImage(gameImage,
0,
0, null);
916 // Clear gameImage image with a big transparent rectangle.
917 Color transparent = new Color(
0,
0,
0,
0);
918 gameGraphics.setColor(transparent);
919 gameGraphics.setComposite(AlphaComposite.Src);
920 gameGraphics.fill(new Rectangle2D.Double(
0,
0, width, height));
924 \caption{Metoden paintComponent(Graphics g)
}\label{kod:paintComponent
}
927 För att få en uppdaterad bild där alla enheter ritar ut sig själv
928 sparas tillhörande
\textit{Graphics
}-objekt som ett attribut i
929 \textit{ATDView
} som sedan kan hämtas av animationstråden för att låta
930 varje aktuell instans av
\textit{Paintable
} (se avsnitt
931 \ref{sec:Paintable
} på sida
\pageref{sec:Paintable
}) rita ut sig själv
932 på bilden, se kodsnutt
\ref{kod:paint
}. Nedersta raden,
933 \verb!view.repaintGame();!, ritar om hela spelkomponenten, se kodsnutt
934 \ref{kod:paintComponent
};
939 // Repaint all agents
940 Graphics g = view.getGameGraphics();
941 for (Unit unit : units)
{
944 for (Tower tower : towers)
{
948 // Refresh the game view
952 \caption{Utsnitt ur AnimationThread i ATDController
}\label{kod:paint
}
955 \section{Begränsningar
}\label{Begransningar
}
956 % Vilka problem och begränsningar har din lösning av uppgiften? Hur
957 % skulle de kunna rättas till?
958 Följande avsnitt beskriver några områden inom implementationen med
959 olika begränsningar. För diskussion kring hur funktionaliteten för en
960 teleporterenhet kan läggas till i spelet, se avsnitt
961 \ref{sec:teleportunit
}.
963 \subsection{Kollisioner
}
964 I situationen där enheter går i en cirkel kan ett totalt stopp uppstå
965 där alla väntar på att enheten framför ska försvinna. I detta läge
966 finns inget annat alternativ än att starta om ifall det inte finns
967 torn i närheten som kan frigöra utrymme genom att döda enheter. Ett
968 exempel på en enkel lösning till detta är att erbjuda användaren att
969 kunna döda enheter själv genom att t.ex. klicka på dem.
971 Något lite mindre trivialt fel som upptäckts under testkörningar kan
972 uppstå när två köer av enheter som ligger väldigt nära varandra möts
973 rakt mot varandra i en flervägskorsning. Då kan enheter börja vänta på
974 varandra trots att den önskade effekten hade varit att de antingen
975 studsar mot varandra eller att en enhet hinner fram till svängrutan
976 och går iväg längst den nya vägen.
979 \subsection{Webbtjänst
}
980 När spelaren klarat alla banor i spelet visas en dialogruta där namn
981 kan skrivas in. Om spelaren trycker
\textit{OK
} skickas den samlade
982 poängen till en webbtjänst från laboration
3. Ännu har ingen
983 funktionalitet lagts till för att visa denna highscorelista i
984 spelet. Lösningen för detta är att t.ex. i menyraden lägga till ett
985 alternativ för att få fram en panel där listan enkelt laddas in genom
986 metodanrop till webbtjänstens metod
\textit{retrive()
}.
988 \subsection{Kollisioner i svängar
}
989 Sättet enheter svänger på kan göra att det uppkommer tillfällen då
990 enheter hamnar centrerade utanför vägrutor mittlinje. Det är tänkt
991 att enheter hela tiden ska röra sig i mitten av vägrutor.
993 Detta problem kan uppkomma när två enheter med motstående riktningar
994 möts i en svängruta. Eftersom de inte har passerat svängrutans
995 mittpunkt svänger de inte utan kolliderar med varandra och ändrar
996 rikting till varandras motsats. Om deras mittpunkt fortfarande
997 befinner sig inom rutan kommer detta innebära att för svängrutan ser
998 det nu ut som att enheterna har passerat mittpunkten och då svänger
999 rutan båda enheterna som nu hamnar ocentrerat parallellt med
1000 varandra. Se bild i figur
\ref{fig:turnProblem
}.
1004 \includegraphics[width=
110mm
]{images/turnProblem.pdf
}
1006 \label{fig:turnProblem
}
1010 \subsection{Trådsäkerhet
}
1011 Eftersom två trådar körs parallellt från
\textit{ATDController
} som
1012 båda hämtar och skriver till modellen är trådsäkerhet en
1013 riskfaktor. Vi har under utvecklingen av spelet endast haft problem
1014 med listan över levande enheter som kunde hämtas och itereras från en
1015 tråd och samtidigt som en annan tråd tagit bort enheter från samma
1016 lista. Detta har då fått spelet att krascha. Lösningen blev att låta
1017 modellen returnera en kopia av listan som trådar fick arbeta mot. Det
1018 finns säkerligen andra tillfällen då information hämtas och samtidigt
1019 modifieras som kan ställa till med problem men inga har uppstått under
1020 testkörningar. Lösningen på dessa problem är att se över vad i
1021 modellen som kan bli problem för trådsäkerhet
1023 % NOTE Antingen skriver vi bara om buggar här och låter icke-uppfyllda
1024 % specpunkter ligga i diskussion eller så skiver vi båda och låter
1025 % diskussion ta upp saker vi skulle vilja göra
1027 % \section{Reflektioner}\label{Reflektioner}
1028 % % Reflektioner - Var det något som var speciellt krångligt? Vilka
1029 % % problem uppstod och hur löste ni dem? Vilka verktyg använde ni? Hur
1030 % % upplevde ni de verktygen? + Allmänna synpunkter. Om ni har upplevt
1031 % % problem på grund av olika miljöer (i termer av operativsystem och
1032 % % liknande) så kan det även vara intressant att nämna det, samt motivera
1033 % % ert val av miljö.
1035 \section{Testkörningar
}\label{Testkorningar
}
1036 % Noggranna testkörningar där man ser att programmet fungerar som det
1038 I denna sektion presenteras några skärmdumpar från körningar av applikationen.
1042 \includegraphics[width=
110mm
]{images/ingame1.png
}
1043 \caption{Skärmdump av applikationen
}
1050 \includegraphics[width=
110mm
]{images/ingame2.png
}
1051 \caption{Skärmdump av applikationen
}
1056 Figur
\ref{fig:ingame1
} och figur
\ref{fig:ingame2
} visar hela
1057 applikationen under ett pågående spel.
1061 \includegraphics[width=
110mm
]{images/promptWinIngame.png
}
1062 \caption{Skärmdump av dialogruta ''Level completed''
}
1069 \includegraphics[width=
110mm
]{images/promptLose.png
}
1070 \caption{Skärmdump av dialogruta ''Level lost''
}
1075 Efter att användaren vunnit eller förlorat en bana låses
1076 användargränssnittet och användaren får upp alternativ för fortsatt
1077 spel i dialogrutor så som figur
\ref{fig:win
} och figur
1078 \ref{fig:lose
} visar. Enheter som fortfarande är ute på banan
1079 fortsätter att gå runt och kan dö eller gå i mål. Dock slutar
1084 \includegraphics[width=
110mm
]{images/promptHighscore.png
}
1085 \caption{Skärmdump av dialogruta ''Input highscore''
}
1086 \label{fig:highscore
}
1090 När inga fler banor finns att spela får användaren möjlighet att
1091 skicka in sin ihoptjänade poäng till en highscore lista. Denna
1092 funktionalitet drivs av en webbtjänst som ingick i den laboration som
1093 gjordes innan denna laboration.
1097 \includegraphics[width=
110mm
]{images/menu_AntiTD.png
}
1098 \caption{Skärmdump av meny ''AntiTD''
}
1099 \label{fig:menu_antitd
}
1105 \includegraphics[width=
110mm
]{images/menu_Help.png
}
1106 \caption{Skärmdump av meny ''Help''
}
1107 \label{fig:menu_help
}
1111 Figur
\ref{fig:menu_antitd
} och figur
\ref{fig:menu_help
} visar de
1112 alternativ som döljer sig i menyraden. I figur
\ref{fig:menu_antitd
}
1113 syns det tredje alternativet
\textit{Resume
} vilket vid start heter
1114 \textit{Paus
} men är nu i ett annat tillstånd eftersom applikationen
1115 vid detta tillfälle var pausat. Detsamma gäller för fjärde
1116 alternativet
\textit{unMute
} vilket börjar som
\textit{Mute
}. Figur
1117 \ref{fig:menu_help
} visar menyalternativen
\textit{Help
} och
1118 \textit{About
}. Dessa innehåller en kort beskrivning av spelets regler
1119 och mål respektive en kort beskrivning om vilka som skapat
1124 \includegraphics[width=
110mm
]{images/leveleditor1.png
}
1125 \caption{Skärmdump ''LevelEditor'', applikationen har just startat
}
1132 \includegraphics[width=
110mm
]{images/leveleditor2.png
}
1133 \caption{Skärmdump ''LevelEditor'', ''MapSquares'' av typen ''BlockedSquare''
}
1140 \includegraphics[width=
110mm
]{images/leveleditor3.png
}
1141 \caption{Skärmdump ''LevelEditor'', ''Mapsquares'' av typen ''PathSquare'', ''StartSquare'' och ''GoalSquare''
}
1148 \includegraphics[width=
110mm
]{images/leveleditor4.png
}
1149 \caption{Skärmdump ''LevelEditor'', ''Mapsquares'' av typen ''TurnSquare''
}
1154 I figur
\ref{fig:editor1
} till figur
\ref{fig:editor4
} visas
1155 skärmdumpar av testapplikationen för att skapa banor. En hel bana har
1156 skapats genom att klicka ut rutor av olika typ.
1158 \section{Vidareutveckling
}\label{Diskussion
}
1160 Projektet är implementerat enligt design-mönstret
1161 \textit{Model-View-Controller
}. Resultatet diskuteras under rubriken
1162 \textit{Model-View-Controller
}. I detta stadie finns en bra grund för
1163 att lägga till funktionalitet så som nya enheter och nya banrutor med
1164 speciella egenskaper samt att utveckla användargränssnittet. I
1165 nedanstående avsnitt
\textit{Vidareutveckling
} diskuteras olika
1166 möjligheter till vidareutveckling av spelet.
1168 \subsection{Model-View-Controller
}
1169 % TODO Fill this section
1170 Eftersom modellen
\textit{ATDModel
} är helt oberoende av
1171 \textit{ATDController
} och
\textit{ATDView
} finns möjligheter att göra
1172 radikala förändringar i de senare utan att påverka modellen. Till
1173 exempel kan gränsnittet modifieras fritt eftersom det bara hämtar
1174 information från modellen och inte skriver till den. Det är alltså
1175 metoderna i
\textit{ATDController
} som manipulerar modellen och gör
1176 metodanrop för att uppdatera vyn så här läggs ansvaret för att styra
1177 vad som går att göra i programmet.
1179 \subsection{Klass Item
}
1180 I inledningar av projektet planerades en abstrakt klass
\textit{Item
}
1181 som skulle representera en pryl vilken skulle kunna lagras i ett
1182 attribut i en MapSquare. Objekt av typen
\textit{Item
} skulle
1183 t.ex. kunna vara
\textit{HealtItem, SpeedItem, CreditItem
} som kan
1184 representera prylar som ger mer hälsa, ökad fart respektive ett antal
1185 crediter att handla med. Dessa prylar skulle användas genom att
1186 slumpmässigt läggas till i objekt av typen
\textit{PathSquare
} och
1187 alltså representeras grafiskt genom att rutan ritar ut prylen ovanpå
1188 sig. En ruta med en pryl på skulle sedan skicka vidare en inkommande
1189 enhets referens till prylen som i sin tur skulle manipulera enhetens
1190 attribut. En pryl med teleporterbeteende diskuteras under rubrik
1191 \textit{Unit av typen TeleportUnit
} (se avsnitt
\ref{sec:teleportunit
}).
1193 \subsection{Unit av typen TeleportUnit
}\label{sec:teleportunit
}
1194 För att uppfylla nivå tre av denna laborations kravspecifikation krävs
1195 en enhet med möjlighet att placera ut så kallade
1196 teleport-plattor. Detta kan uppnås i detta projekt genom att skapa
1197 subklasser av
\textit{Item
} kallad t.ex.
\textit{TeleportStartItem
}
1198 och
\textit{TeleportEndItem
}. Prylen
\textit{TeleportStartItem
} skulle
1199 kunna bäras av en
\textit{Unit
} av typen
\textit{TeleporterUnit
} och
1200 kunna läggas ut på nuvarande ruta genom t.ex. musklick på
1201 enheten. Attribut som behövs i
\textit{TeleportStartItem
} är x- och
1202 y-koordinater till den tillhörande prylen
\textit{TeleportEndItem
}
1203 vilket i sin tur innehåller attribut för aktuell riktning som
1204 utsläppta enheter ska ha samt en kö där uppsamlade enheter läggs till
1205 för att sedan släppas ut en efter en då positionen är ledig. Algoritm
1206 för kollisionsdetektering skulle fungera på samma sätt som algoritmen
1207 som används när enheter släpps ut ur startrutor (se
1208 \pageref{sec:StartSquare
});
1210 \subsection{Gränssnitt
}
1211 I nuläget startas första banan direkt när applikationen startar. Att
1212 få se en så kallad splash-screen (introduktionsbild) kan vara önskvärt
1213 och åtgärdas enkelt genom att i konstruktor för
\textit{ATDController
}
1214 lägga till ett metodanrop till metod i
\textit{ATDView
} som visar
1215 något och väntar på att användaren ska välja ett nytt spel.
1217 I kontrollpanelen finns stora möjligheter till vidareutveckling då den
1218 nuvarande just täcker den funktionalitet som behövs för att köra
1219 spelet. Till en början skulle listan med tillgängliga units kunna
1220 bytas ut mot ikoner som visar enhetens grafiska representation. För
1221 att lättare kunna få en översikt över en enhets egenskaper skulle
1222 hälsa och hastighet kunna förmedlas med staplar istället för med
1223 text. Om listan byts mot ikoner finns även möjligheten att ta bort
1224 knappen
\textit{Release Units
} och låta användaren skicka ut önskad
1225 enhet genom att direkt klicka på enhetens ikon.
1227 \subsection{Observer–Obervable
}
1228 Eftersom Javas
\textit{Observalbe
} är en klass som måste utökas för
1229 att användas kan inte
\textit{MapSquares
} klonas utan att alla får en
1230 gemensam lista med
\textit{Observers
}. En egen implementation av
1231 \textit{Observer–Observalbe
} skulle behövas för att kunna klona
1232 kartrutor på ett användbart sätt. Med en sådan implementation hade det
1233 varit lättare i ett senare skede läsa in alla konfigurationsdetaljer
1234 för att skapa både kartrutor och enheter utifrån XML-dokument.
1236 \subsection{LevelEditor
}
1237 Klassen
\textit{LevelEditor
} hade behövt vidareutvecklas för att kunna
1238 användas för att skapa kompletta banor och redigera tillgängliga
1239 banor. Några punkter som hade behövts:
1242 \item Möjlighet att sätta riktning på en
\textit{StartSquare
}
1243 \item Möjlighet att skapa flera banor och spara dem i en gemensam XML-fil.
1244 \item Möjlighet att välja bilder som ska användas för rutorna.
1245 \item Möjlighet att sätta antal enheter som krävs i mål för att vinna en bana.
1246 \item Möjlighet att sätta ut torn.
1249 \bibliographystyle{alpha
}
1250 \bibliography{books.bib
}
1254 \pagenumbering{roman
}
1255 \section{Bilagor
}\label{sec:kallkod
}
1256 % Källkoden ska finnas tillgänglig i er hemkatalog
1257 % ~/edu/apjava/lab1/. Bifoga även utskriven källkod.
1258 Härefter följer utskrifter från källkoden och andra filer som hör till
1261 \subsection{Källkod
}
1262 \subsection{Redovisning av inblandning
}