1 #+TITLE: Spec/plan laboration 4, apjava
2 #+AUTHOR: Anton Johansson, Andreas Jacobsson
3 #+EMAIL: anton.johansson@gmail.com
7 Se [[file:report/timplan.xsl][timplan.xsl]]
10 Vad skulle fördelen kunna vara med att försöka sätta varje Unit i
11 en separat tråd? Vad blir mest beräkningstungt, att göra massa
12 saker i samma tråd mot att hantera varje enhets logik separat?
14 *** Svar: Vi väljer inte separata trådar för varje enhet, detta eftersom det verkar bli mer problem.
16 ** TODO Statiska metoder vs andra
17 Hur ska man på ett bra sätt implementerar Builder/Factory klasser?
18 Vad är fördelen/nackdelen med att dessa enbart innehåller statiska
19 metoder om så är möjligt.
23 CLOCK: [2008-12-10 Wed 20:30]--[2008-12-11 Thu 00:36] => 4:06
26 - Item <|- Health, Teleport, SpeedBoost, Guns 'n' ammo.
27 - Square <|- Stone, Savanna, Road. Idé, varje Square har en
28 instans av Javas Rectangle för att kunna använda dess intersects
31 - Intersection en Item? Ett sätt att välja väg vid
34 - Model håller koll på alla enheter.
35 - Controller, The allseeing eye, säger till varje enhet att
37 - View, ritas upp för varje fram. Kontroller meddelar när det är
38 dags, data hämtas från Model.
39 - Poängräkning skulle kunna ske i separat tråd som sover
40 specificerat antal millisekunder för att sedan vakna upp och
41 räkna av antalet enheter på plan.
42 - Player, synchronized score!
45 - Ett interface för att se till att allt som behöver det har en
46 =intersects()= metod för att testa om den överlappar annan klass
47 som implementerar samma interface. Främst för Unit.
50 Squares extends JComponent, Observable (Towers ska vara Observers),
51 Units meddelar rutor att de befinner sig i dem. Towers får då en
52 referns till aktuell Unit och lägger denna i en lista för
55 Anledningen till något typ av arv av JComponent är att
56 vi vill ha metoden getComponentAt(Point) från en högre nivå (Map av
57 typ JComponent?) för att Units ska kunna veta vilken ruta de
63 : <square type="stone"/>
64 : <square type="road">
65 : <item type="health"/>
70 *** Collision detection
71 Varje Unit kollar om den intersectar med någon annan Unit innan
72 den rör sig. Om den gör det så minskar den flytten tills den
73 hittar en flytt som inte intersectar med någon Unit.
76 1) Unit leter upp rutan den befinner sig i: Frågar map (JComponent
77 getComponentAt(Point?))
78 2) Fråga ruta om aktuell speedFactor, för att modifiera sin
79 hastighet. 1 är standard, 1 * UnitSpeed.
80 3) Unit meddelar sin ruta att den befinner sig där, Obervable
81 ruta. Rutan meddelar Tower, Tower sparar Unit i kö. Se [[*Logik]]
82 4) Unit har en tidsenhet som intervall på hur ofta den får göra
83 förflyttningar, detta representerar hastighet. Unit tidstämplas
84 vid varje flytt med aktuell tid i millisekunder. Vid nästa flytt
85 kollar den så att satt tidsintervall har förflutit.
86 5) Enumeration håller koll på riktning.
87 6) Se [[*Collision%20detection][*Collision detection]]
89 - Vi använder XMLSchema.
91 *** TODO Till nästa gång
92 **** TODO Ta reda på hur vi svänger i kurvor.
93 **** TODO Metoderna intersects och contains.
94 **** TODO Easter eggs?
97 CLOCK: [2008-12-11 Thu 16:07]--[2008-12-11 Thu 19:06] => 2:59
100 Hela Canvas har en mouseListener som lyssnar på musklick, dessa
101 koordinater kollas mot matris för spelplanen och objekt som finns
102 där returneras, Object instanceof Turnpath ger ändring i sväng.
103 *** Flyweight pattern för rutor?
104 *** En matris för spelplanen
105 Spelplanen vet koordinater för varje ruta, Units kan fråga
106 spelplanen efter ruta för aktuell koordinat!
109 Skapa en instans av bakgrundsbild att rita hämtas till en instans
110 av BufferedImage för att rita upp gubbar på för varje
111 uppritning. Clear Canvas, rita upp BufferedImage och vipps så är
115 Tården kan se ut så här:
117 : for (Unit unit : units) {
120 : for (Unit unit : units) {
121 : unit.paint(Graphics g);
125 Tänk på att knappar kan vara bilder.
127 - Nytt game startas, spelare finns redan.
135 - Levevels.xml Innerhåller information om hur banan ska byggas
137 - LevelStyle.xml innerhåller information om vilka bilder som hör
138 ihop med vilka ban-element.
139 - UnitStyles.xml innehåller information om vilka bilder som hör
140 ihop med vilka Units.
142 * Implementeringstillfällen
144 CLOCK: [2008-12-14 Sun 14:00]--[2008-12-14 Sun 20:36] => 6:36
145 *** DONE Animerade Units
146 Units förflyttar sig över skärmen, statisk bakgrundsbild ligger
147 kvar, är detta dubbelbuffrat?
148 *** DONE Början på hela programmets struktur.
151 CLOCK: [2008-12-15 Mon 14:15]
152 *** DONE Kartan ritas upp med bilder
153 *** DONE Tower implementerad och utsatt på karta!
154 *** DONE MouseListener på GameComponent
155 *** DONE Plan för framtida arbeta initierad se, [[*Plan
158 CLOCK: [2008-12-16 Tue 18:30]--[2008-12-16 Tue 23:37] => 5:07
160 *** DONE Register Observer, Observable Tower observs PathSquares.
163 Ett Tower Defence-spel är ett spel i vilket användarens uppgift är att
164 skydda sig mot fiender genom att sätta upp torn. Dessa torn ska sedan
165 skjuta ner fienden innan de når ett givet mål, och tornen måste
166 således placeras ut strategiskt.
168 För att göra spelet intressantare brukar det krävas att en viss mängd
169 fienden tar sig i mål för att man ska förlora, och det kan finnas
170 flera sorters fiender och torn (flygande och markgående fienden etc.).
173 - Att släppa ut trupper ska kosta valuta (nedan kallat kredit), och
174 spelaren får ett antal krediter tilldelade varje bana. När dessa
175 är slut kan inga trupper köpas, och spelaren förlorar om de
176 trupper på banan inte tar sig i mål och ger upphov till vinst.
177 - Vinst är när ett visst antal "målkrediter" tjänats. Detta brukar
178 bara vara ett antal truppmedlemmar, men kan mycket väl viktas med
179 deras hälsa när de kommer in i mål.
180 - Krediter tjänas på något sätt under banans gång, förslagsvis en
181 viss krediter/sekund för varje truppmedlem, samt en viss mängd
182 krediter vid målgång.
183 - Fienden behöver inte vara smarta. Det räcker med att de väljer en
184 varelse inom räckhåll och skjuter på den.
185 - Fienden får ha endast laser (ljusstråle som träffar direkt så ni
186 slipper beräkna en projektils bana).
187 - Utplacering av tornen som skjuter på trupperna behöver endast
188 placeras ut slumpmässigt i tillåtna zoner.
191 Laborationen ska lösas i grupper om 2 (två) personer. Det ses från vår
192 sida som en näst intill omöjlig uppgift att göra laborationen enskilt
193 under kursens gång, därför finns det inga undantag. Parindelningen är
194 upp till er att fixa, men alla grupper ska anmäla sig på denna
195 sida. Vet ni inte om någon att jobba med så skriv in er i en ny grupp
196 , eller om det redan finns en grupp med bara en person så skriv in er
197 i den och kontakta så snart som möjligt personen som redan stod där om
198 att du vill jobba med honnom/henne.
200 Målet med spelet är att skapa en bas för utbyggnad av
201 funktionaliteten. Därför är det väldigt viktigt att ni lägger stor
202 möda på spelets interna struktur för att få en lättnavigerad kodbas
203 med logisk uppbyggnad. Dokumentationen är väldigt viktig den med,
204 vilket innebär att samtliga klasser, samtliga metoder samt
205 medlemsvariabler ska kommenteras med utförliga
206 JavaDoc-kommentarer. JavaDoc är dock inte den enda typen av grundlig
207 dokumentation som krävs, se nedan. Syfte
209 * Syftet med laborationen är att få pröva på och använda:
211 - XML / DTD / XMLSchema
214 - Öva färdigheten i rapportskrivning med en specifik målgrupp
215 - Följa en given kodkonvention
218 Er uppgift är inte att implementera ett Tower Defence-spel, utan ett
219 Anti-Tower Defence-spel. Ni ska alltså låta användaren skicka ut
220 fienden som sedan datorn ska skjuta ner. Ett exempel på ett sådant
221 spel är: [[http://www.sugar-free-games.com/playgame.php%3Fgame%3D1127][Anti-TD]] på Sugar Free Games.
223 För att göra spelet mer intressant ut laborationssynpunkt finns det
224 en del krav på er lösning:
226 *** I alla nivåer gäller:
227 **** TODO Implementera spelet AntiTD i Java
228 **** TODO Följa SUN:s kodkonvention: http://java.sun.com/docs/codeconv/index.html
229 **** TODO Följa god OO- och MDI-stil.
230 **** TODO Källkoden skall ligga i katalogen
231 : ~/edu/apjava/lab4/src/
232 **** TODO En komplierad version i katalogen
233 : ~/edu/apjava/lab4/bin/
234 **** TODO Rapporten skall ligga i katalogen
235 : ~/edu/apjava/lab4/report/
236 **** TODO JavaDoc-sidorna skall ligga i katalogen
237 : ~/edu/apjava/lab4/doc/
239 *** TODO Nivå 1 (grundnivå)
240 **** TODO Klassen "AntiTD"
241 Startar ett Anti Tower Defence-spel utan att ta emot några argument från användaren.
243 Spelet ska använda sig av flera trådar för att låta flera delar jobba parallellt.
244 **** TODO Uppdateringsintervall
245 Spelets uppdateringsintervall skall vara tidsberoende och inte
246 beroende av datorns hastighet.
248 Det ska finnas minst en bana längs vilken man kan skicka ut
250 **** TODO Vinst/Förlust
251 Vid "vinst" eller "förlust" så ska användaren presenteras med
252 valet om att spela igen eller avsluta spelet. Medans detta val
253 pågår så ska inte användaren kunna göra nåt annat, men objekt på
254 spelplanen ska fortsätta röra sig.
255 **** TODO GUI:t skall använda sig av Swing-biblioteket.
257 All rendering skall ske dubbelbuffrat för att undvika flimmer.
258 **** TODO Det ska finnas minst två huvudmenyer:
261 + Om inget spel har startats så heter menypunkten tex. "New
262 Game" och vid klick så startar den ett nytt spel. Om spelet
263 redan är igång så ska menypunkten heta tex. "Restart" och
264 spelet börjar om från början.
266 + Menypunkten kan tex. heta "Pause" om spelet är igång och
267 när man klickar på menypunkten så ska alla trupper och torn
268 stanna och inga knappar ska gå att klicka på. Om spelet är
269 i "Pause"-läge så ska menypunkten byta namn till
270 tex. "Resume" och vid klick så ska spelet återupptas där
271 det sist var, dvs. fordonen skall fortsätta röra på sig
272 samt att användaren kan skicka ut fler trupper.
274 + Sluta spela upp ljud. Då den här menyn väljs ska
275 menyalternativet bytas till "Unmute" och vice versa.
278 - Den andra menyn ska innehålla:
279 + About: Berättar i en dialogruta vem som gjort spelet och när.
280 + Help: Berättar i en dialogruta hur man spelar.
281 **** TODO Zoner i banor
282 Varje bana skall innehålla zoner där datorn kan placera ut torn,
283 vägar längs vilka trupper kan röra sig.
285 Minst två typer av trupper ska implementeras med olika förmågor
286 (klarar olika antal träffar, kostar olika mycket, har olika
289 *** TODO Nivå 2 (multipla banor/XML)
290 **** TODO Flera banor
291 Spelet ska klara av flera banor. Banorna ska se olika ut,
292 exempelvis hur trupperna kan röra sig.
293 **** TODO Spara banor i fil levels.xml
294 Flera banor skall lagras i en fil som heter
295 "levels.xml". XML-formatet skall följa en DTD som ni själva
296 specificerar. XML-filen skall valideras mot den DTD (eller XML
299 Varje bana skall innehålla zoner där datorn kan placera ut torn,
300 vägar längs vilka trupper kan röra sig, samt regler för banan,
301 exempelvis hur många trupper som måste komma igenom för att
302 användaren ska vinna. Allt detta ska stå i XML-filen under varje
304 **** TODO Vinst/förlust
305 När användaren "vinner" en bana så skall spelet fråga användaren
306 om den vill spela samma bana en gång till eller fortsätta till
308 **** TODO Restart level
309 Den första menyn ska byggas ut med alternativet "restart level".
310 **** TODO Flera vägsträckor per bana
311 Det ska finnas (möjlighet till, samt exempel på) flera möjliga
312 vägsträckor per bana för trupperna.
313 **** TODO Spara resultat till Highscoreservice
314 Alla resultat ska sparas med hjälp av det ni gjorde i
315 lab 3. Highscores ska kunna visas (baserat på tid, poäng, nivå,
317 **** TODO Parameter som anger levels.xml vid start
318 Ges ett argument vid körning ska detta tolkas som ett filnamn och
319 läsas in istället för levels.xml och på så vis kan fler banor
320 göras och köras utan att modifiera i spelets katalog.
322 *** TODO Nivå 3 (triggers / jar)
323 **** TODO Triggers, vägpekare i vägskäl?
324 Banor ska kunna innehålla (och det ska finnas exempel på banor
325 som innehåller) "växlar" som gör att en väg kan mynna ut i en
326 T-korsning där spelaren klickar på ex. en knapp för att välja åt
327 vilket håll trupperna ska gå.
328 **** TODO Skapa ett interface som har en metod "landOn".
329 **** TODO Banklasser implements landOn
330 De olika områdena på en bana skall finnas i egna klasser. Varje
331 sådan klass kan implementera interfacet beskrivet ovan.
332 **** TODO Läsa in class-filer från XML?
333 Vid start av en ny bana så skall programmet läsa in de
334 class-filer som XML-filen har deklarerat som sina områden och när
335 truppmedlemmarna går på ett visst område så ska denna
336 områdesklass funktion "landOn" anropas och någonting skall hända,
337 förutsatt att den implementerat ovan nämnda interface.
338 **** TODO Områden, ex Teleporters
339 Ett speciellt område utöver de beskrivna hittills skall
340 finnas. Tex: Teleporters, när en truppmedlem går på en viss ruta
341 så flyttas den till en annan på vägen.
342 **** TODO Teleportertrupper
343 Teleportertrupper ska implementeras som kostar mer, men ska kunna
344 lägga ner teleporterplattor när användaren väljer, och på så vis
345 kommer trupperna att kunna slippa förflytta sig lika långt.
346 **** TODO Spelet sparas i AntiTD.jar
347 Spelet samt de filer som behövs för grundspelet skall finnas i en
348 JAR-fil som heter "AntiTD.jar". Spelet ska startas med kommandot:
352 Den här laborationen har inte bara ett fungerande system som mål, utan
353 den ska även vara en bas för vidareutveckling. Därför ska den visas
354 upp för en fiktiv kund som ska köpa spelet av er för en stor hög
355 pengar. Därför är det viktigt att ni gör bra ifrån er på både spelets
356 uppvisning, och dokumentationen som ska lämnas in.
358 ** Milestone DEADLINE: <2008-12-18 Thu 15:00>
359 Innan jul ska ni boka in er för ett tillfälle hos handledarna för
360 att redovisa projektets framskridande. Vid detta möte bör delar av
361 programmet vara implementerat och ni bör kunna redovisa en plan (i
362 form av följande dokument) för hur arbetet ska fortskrida fram till
363 de olika redovisningstillfällena. Ni kommer att kunna boka in er
364 för denna redovisning 18/12 mellan 15-17. Bokning av tid kommer att
365 kunna ske senast veckan innan (info om detta kommer via mail). Om
366 ni av någon anledning vet att ni ej kan delta vid detta tillfälle
367 så hör av er till handledarna i förväg så kan redovisningen
368 genomföras vid något tidigare tillfälle.
370 ** Uppvisning (promotion) DEADLINE: <2009-01-13 Tue>
371 Samtliga lösningar ska visas på gruppövningen den 13e
372 januari. Ungefär 10 minuter per grupp ges. Tar uppvisningen för
373 lång, eller för kort tid, minskar intresset från kunden. Hjälpmedel
374 ni har att tillgå är: OH-apparat, ... Mer info kommer senare.
376 ** Fysisk inlämning av dokumentation
377 Det som i normala fall brukar vara en rapport om själva utvecklandet
378 kommer på den här laborationen ha en annan uppgift.
380 Utöver dokumentationen av programmet så ska ni även lämna in en
381 detaljerad beskrivning av vem som gjort vad i projektet. Detta för att
382 individuell poängbedömning ska kunna göras (var nogrann med
383 denna). Denna del ska ges som en bilaga till rapporten. Till exempel
384 kan en uppdaterad version av dokumentet från milestone tillfället
385 ingpå. Observera att det inte räcker med en mening där ni säger att ni
386 båda varit inblandade i allt och gjort lika mkt (lite mer detaljnivå
389 * Programdokumentation DEADLINE: <2009-01-13 Tue 15:15>
390 Dokumentation av arbetet ska vara inlämnad senast Tisdag 13/1-09
391 15:15 Den största vikten i rapporten ligger på hur systemet är
392 uppbyggt. Vilka delar ska modifieras för att olika effekter ska
393 uppnås. Här hör ett eller flera UML-diagram hemma,
394 algoritmbeskrivningar i grafisk form, etc.
396 Tänk på att den här delen ska fungera som referenslitteratur. Det
397 ska alltså inte vara uppsatser, utan listor, bilder, grafer,
398 tabeller, träd, etc. Små textstycken behövs med, men en
399 beskrivningar i uppsatsform är inget alternativ.
402 Rapporten kommer betygsättas utifrån dels utseende (teckensnittsval,
403 marginalbredd, sidnumrering), innehåll (styckeuppdelning, förlopp, hur
404 lätt det är att slå upp saker i den), informationsförmedling (vad
405 berättas i rapporten), och slutligen kommer även stavfel,
406 särskrivningar, meningsbyggnadsfel och språkblandningar in i bilden.
408 JavaDoc-sidorna kommer gås igenom och deras innehåll kommer bedömas.
410 Javakoden kommer synas så den följer konventioner och "bra"
411 programmeringsstil. Ex. på mindre bra programmeringsstil är:
418 En helhetsbedömning av bl.a. ovanstående kommer poängsätta rapporten,
419 kodens dokumentation, redovisning och källkoden. Resultatet kommer
420 bli: Nivå Poäng 1 0 - 7 2 0 - 14 3 0 - 20
422 Dokumentationen kommer stå för runt 1/3 av den totala poängen, så glöm
423 inte att lägga ner tid på den.
425 OBS: Poängsättningen av labben kommer att ske på den först inlämnade
426 versionen. Fel som ger O på labben kommer givetvis att bidra till att
427 minska poängtalet rätt rejält.
429 * Ev otydligheter i specifikationen
430 Är något otydligt i specifikationen så är det upp till er att klargöra
431 vad som gäller. Redovisa även sådana klargörande i rapporten.