MaImplemented landOn in PathSquare
[AntiTD.git] / README.org
blobfa1e51817e482a7ee226dfa1c3df25c70c7b4b76
1 #+TITLE:     Spec/plan laboration 4, apjava
2 #+AUTHOR:    Anton Johansson, Andreas Jacobsson
3 #+EMAIL:     anton.johansson@gmail.com
4 #+DATE:      2008-12-08 Mon
6 * Plan
7   Se [[file:report/timplan.xsl][timplan.xsl]]
8 * Frågor
9 ** DONE Trådar
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.
15    
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.
21 * Planeringsmöten
22 ** Första
23    CLOCK: [2008-12-10 Wed 20:30]--[2008-12-11 Thu 00:36] =>  4:06
24    
25 *** Klasser
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
29       metod.
30     - Road <|- Sand, Ice.
31     - Intersection en Item? Ett sätt att välja väg vid
32       flervalskorsningar.
33     - Map, JComponent?
34     - Model håller koll på alla enheter.
35     - Controller, The allseeing eye, säger till varje enhet att
36       uppdatera sig själv.
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!
43       
44 *** Interface
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.
48       
49 *** Logik
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
53    beskjutning.
54    
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
58    befinner sig på.
60 *** Kartor XML
61     : <map>
62     :  <row>
63     :    <square type="stone"/>
64     :    <square type="road">
65     :      <item type="health"/>
66     :    </square>
67     :  </row>
68     : </map>
69    
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.
75 *** Flytt av 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]]
88   
89   - Vi använder XMLSchema.
90     
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?
95      
96 ** Andra
97    CLOCK: [2008-12-11 Thu 16:07]--[2008-12-11 Thu 19:06] =>  2:59
98    
99 *** Path <|- Turnpath
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!
107     
108 *** DoubleBuffering
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
112     där DoubleBuffering.
113     
114 *** Animationtråd
115     Tården kan se ut så här:
116     : while(running) {
117     :     for (Unit unit : units) {
118     :         unit.update();
119     :     }
120     :     for (Unit unit : units) {
121     :         unit.paint(Graphics g);
122     :     }
123     : }
124 *** Gränssnitt
125     Tänk på att knappar kan vara bilder.
126 *** Ett Game
127     - Nytt game startas, spelare finns redan.
128     - Karta skapas
129     - Pengar ges
130     - Poäng är noll
131     - Torn placeras
132     - Game on!
133       
134 *** Levels.xml
135     - Levevels.xml Innerhåller information om hur banan ska byggas
136     upp.
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.
141       
142 * Implementeringstillfällen
143 ** Första
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.
149    
150 ** Andra
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
156 ][Plan]]
157 ** Tredje
158    CLOCK: [2008-12-16 Tue 18:30]
160 * Om spelet
161   Ett Tower Defence-spel är ett spel i vilket användarens uppgift är att
162   skydda sig mot fiender genom att sätta upp torn. Dessa torn ska sedan
163   skjuta ner fienden innan de når ett givet mål, och tornen måste
164   således placeras ut strategiskt.
165   
166   För att göra spelet intressantare brukar det krävas att en viss mängd
167   fienden tar sig i mål för att man ska förlora, och det kan finnas
168   flera sorters fiender och torn (flygande och markgående fienden etc.).
169   
170 * Spelets regler
171   - Att släppa ut trupper ska kosta valuta (nedan kallat kredit), och
172     spelaren får ett antal krediter tilldelade varje bana. När dessa
173     är slut kan inga trupper köpas, och spelaren förlorar om de
174     trupper på banan inte tar sig i mål och ger upphov till vinst.
175   - Vinst är när ett visst antal "målkrediter" tjänats. Detta brukar
176     bara vara ett antal truppmedlemmar, men kan mycket väl viktas med
177     deras hälsa när de kommer in i mål.
178   - Krediter tjänas på något sätt under banans gång, förslagsvis en
179     viss krediter/sekund för varje truppmedlem, samt en viss mängd
180     krediter vid målgång.
181   - Fienden behöver inte vara smarta. Det räcker med att de väljer en
182     varelse inom räckhåll och skjuter på den.
183   - Fienden får ha endast laser (ljusstråle som träffar direkt så ni
184     slipper beräkna en projektils bana).
185   - Utplacering av tornen som skjuter på trupperna behöver endast
186     placeras ut slumpmässigt i tillåtna zoner.
188 * Laborationen
189   Laborationen ska lösas i grupper om 2 (två) personer. Det ses från vår
190   sida som en näst intill omöjlig uppgift att göra laborationen enskilt
191   under kursens gång, därför finns det inga undantag. Parindelningen är
192   upp till er att fixa, men alla grupper ska anmäla sig på denna
193   sida. Vet ni inte om någon att jobba med så skriv in er i en ny grupp
194   , eller om det redan finns en grupp med bara en person så skriv in er
195   i den och kontakta så snart som möjligt personen som redan stod där om
196   att du vill jobba med honnom/henne.
198   Målet med spelet är att skapa en bas för utbyggnad av
199   funktionaliteten. Därför är det väldigt viktigt att ni lägger stor
200   möda på spelets interna struktur för att få en lättnavigerad kodbas
201   med logisk uppbyggnad. Dokumentationen är väldigt viktig den med,
202   vilket innebär att samtliga klasser, samtliga metoder samt
203   medlemsvariabler ska kommenteras med utförliga
204   JavaDoc-kommentarer. JavaDoc är dock inte den enda typen av grundlig
205   dokumentation som krävs, se nedan.  Syfte
207 * Syftet med laborationen är att få pröva på och använda:
208   - Trådar
209   - XML / DTD / XMLSchema
210   - GUI (Swing)
211   - Grafik
212   - Öva färdigheten i rapportskrivning med en specifik målgrupp
213   - Följa en given kodkonvention
215 * Er uppgift
216   Er uppgift är inte att implementera ett Tower Defence-spel, utan ett
217   Anti-Tower Defence-spel. Ni ska alltså låta användaren skicka ut
218   fienden som sedan datorn ska skjuta ner. Ett exempel på ett sådant
219   spel är: [[http://www.sugar-free-games.com/playgame.php%3Fgame%3D1127][Anti-TD]] på Sugar Free Games.
220 ** Kravlista
221    För att göra spelet mer intressant ut laborationssynpunkt finns det
222    en del krav på er lösning:
223    
224 *** I alla nivåer gäller:
225 **** TODO Implementera spelet AntiTD i Java
226 **** TODO Följa SUN:s kodkonvention: http://java.sun.com/docs/codeconv/index.html
227 **** TODO Följa god OO- och MDI-stil.
228 **** TODO Källkoden skall ligga i katalogen
229      : ~/edu/apjava/lab4/src/
230 **** TODO En komplierad version i katalogen
231      : ~/edu/apjava/lab4/bin/
232 **** TODO Rapporten skall ligga i katalogen
233      : ~/edu/apjava/lab4/report/
234 **** TODO JavaDoc-sidorna skall ligga i katalogen
235      : ~/edu/apjava/lab4/doc/
236    
237 *** TODO Nivå 1 (grundnivå)
238 **** TODO Klassen "AntiTD"
239      Startar ett Anti Tower Defence-spel utan att ta emot några argument från användaren.
240 **** TODO Trådar
241      Spelet ska använda sig av flera trådar för att låta flera delar jobba parallellt.
242 **** TODO Uppdateringsintervall
243      Spelets uppdateringsintervall skall vara tidsberoende och inte
244      beroende av datorns hastighet.
245 **** TODO Banor
246      Det ska finnas minst en bana längs vilken man kan skicka ut
247      trupper.
248 **** TODO Vinst/Förlust
249      Vid "vinst" eller "förlust" så ska användaren presenteras med
250      valet om att spela igen eller avsluta spelet. Medans detta val
251      pågår så ska inte användaren kunna göra nåt annat, men objekt på
252      spelplanen ska fortsätta röra sig.
253 **** TODO GUI:t skall använda sig av Swing-biblioteket.
254 **** TODO Rendering
255      All rendering skall ske dubbelbuffrat för att undvika flimmer.
256 **** TODO Det ska finnas minst två huvudmenyer:
257      - En meny med valen:
258        + New Game/Restart
259          + Om inget spel har startats så heter menypunkten tex. "New
260            Game" och vid klick så startar den ett nytt spel. Om spelet
261            redan är igång så ska menypunkten heta tex. "Restart" och
262            spelet börjar om från början.
263        + Pause/Resume
264          + Menypunkten kan tex. heta "Pause" om spelet är igång och
265            när man klickar på menypunkten så ska alla trupper och torn
266            stanna och inga knappar ska gå att klicka på. Om spelet är
267            i "Pause"-läge så ska menypunkten byta namn till
268            tex. "Resume" och vid klick så ska spelet återupptas där
269            det sist var, dvs. fordonen skall fortsätta röra på sig
270            samt att användaren kan skicka ut fler trupper.
271        + Mute
272          + Sluta spela upp ljud. Då den här menyn väljs ska
273            menyalternativet bytas till "Unmute" och vice versa.
274        + Quit
275          + Avsluta spelet.
276      - Den andra menyn ska innehålla:
277        + About: Berättar i en dialogruta vem som gjort spelet och när.
278        + Help: Berättar i en dialogruta hur man spelar.
279 **** TODO Zoner i banor
280      Varje bana skall innehålla zoner där datorn kan placera ut torn,
281      vägar längs vilka trupper kan röra sig.
282 **** TODO Grupptyper
283      Minst två typer av trupper ska implementeras med olika förmågor
284      (klarar olika antal träffar, kostar olika mycket, har olika
285      hastighet, etc.).
287 *** TODO Nivå 2 (multipla banor/XML)
288 **** TODO Flera banor
289      Spelet ska klara av flera banor. Banorna ska se olika ut,
290      exempelvis hur trupperna kan röra sig.
291 **** TODO Spara banor i fil levels.xml
292      Flera banor skall lagras i en fil som heter
293      "levels.xml". XML-formatet skall följa en DTD som ni själva
294      specificerar. XML-filen skall valideras mot den DTD (eller XML
295      Schema) ni skriver.
296 **** TODO Banzoner
297      Varje bana skall innehålla zoner där datorn kan placera ut torn,
298      vägar längs vilka trupper kan röra sig, samt regler för banan,
299      exempelvis hur många trupper som måste komma igenom för att
300      användaren ska vinna. Allt detta ska stå i XML-filen under varje
301      bana.
302 **** TODO Vinst/förlust
303      När användaren "vinner" en bana så skall spelet fråga användaren
304      om den vill spela samma bana en gång till eller fortsätta till
305      nästa bana.
306 **** TODO Restart level
307      Den första menyn ska byggas ut med alternativet "restart level".
308 **** TODO Flera vägsträckor per bana
309      Det ska finnas (möjlighet till, samt exempel på) flera möjliga
310      vägsträckor per bana för trupperna.
311 **** TODO Spara resultat till Highscoreservice
312      Alla resultat ska sparas med hjälp av det ni gjorde i
313      lab 3. Highscores ska kunna visas (baserat på tid, poäng, nivå,
314      etc.).
315 **** TODO Parameter som anger levels.xml vid start
316      Ges ett argument vid körning ska detta tolkas som ett filnamn och
317      läsas in istället för levels.xml och på så vis kan fler banor
318      göras och köras utan att modifiera i spelets katalog.
320 *** TODO Nivå 3 (triggers / jar)
321 **** TODO Triggers, vägpekare i vägskäl?
322      Banor ska kunna innehålla (och det ska finnas exempel på banor
323      som innehåller) "växlar" som gör att en väg kan mynna ut i en
324      T-korsning där spelaren klickar på ex. en knapp för att välja åt
325      vilket håll trupperna ska gå.
326 **** TODO Skapa ett interface som har en metod "landOn".
327 **** TODO Banklasser implements landOn
328      De olika områdena på en bana skall finnas i egna klasser. Varje
329      sådan klass kan implementera interfacet beskrivet ovan.
330 **** TODO Läsa in class-filer från XML?
331      Vid start av en ny bana så skall programmet läsa in de
332      class-filer som XML-filen har deklarerat som sina områden och när
333      truppmedlemmarna går på ett visst område så ska denna
334      områdesklass funktion "landOn" anropas och någonting skall hända,
335      förutsatt att den implementerat ovan nämnda interface.
336 **** TODO Områden, ex Teleporters
337      Ett speciellt område utöver de beskrivna hittills skall
338      finnas. Tex: Teleporters, när en truppmedlem går på en viss ruta
339      så flyttas den till en annan på vägen.
340 **** TODO Teleportertrupper
341      Teleportertrupper ska implementeras som kostar mer, men ska kunna
342      lägga ner teleporterplattor när användaren väljer, och på så vis
343      kommer trupperna att kunna slippa förflytta sig lika långt.
344 **** TODO Spelet sparas i AntiTD.jar 
345      Spelet samt de filer som behövs för grundspelet skall finnas i en
346      JAR-fil som heter "AntiTD.jar". Spelet ska startas med kommandot:
347      java -jar AntiTD.jar
349 * Redovisning
350   Den här laborationen har inte bara ett fungerande system som mål, utan
351   den ska även vara en bas för vidareutveckling. Därför ska den visas
352   upp för en fiktiv kund som ska köpa spelet av er för en stor hög
353   pengar. Därför är det viktigt att ni gör bra ifrån er på både spelets
354   uppvisning, och dokumentationen som ska lämnas in.
355   
356 ** Milestone DEADLINE: <2008-12-18 Thu 15:00>
357    Innan jul ska ni boka in er för ett tillfälle hos handledarna för
358    att redovisa projektets framskridande. Vid detta möte bör delar av
359    programmet vara implementerat och ni bör kunna redovisa en plan (i
360    form av följande dokument) för hur arbetet ska fortskrida fram till
361    de olika redovisningstillfällena. Ni kommer att kunna boka in er
362    för denna redovisning 18/12 mellan 15-17. Bokning av tid kommer att
363    kunna ske senast veckan innan (info om detta kommer via mail). Om
364    ni av någon anledning vet att ni ej kan delta vid detta tillfälle
365    så hör av er till handledarna i förväg så kan redovisningen
366    genomföras vid något tidigare tillfälle.
367    
368 ** Uppvisning (promotion) DEADLINE: <2009-01-13 Tue>
369   Samtliga lösningar ska visas på gruppövningen den 13e
370   januari. Ungefär 10 minuter per grupp ges. Tar uppvisningen för
371   lång, eller för kort tid, minskar intresset från kunden. Hjälpmedel
372   ni har att tillgå är: OH-apparat, ... Mer info kommer senare.
373   
374 ** Fysisk inlämning av dokumentation
375    Det som i normala fall brukar vara en rapport om själva utvecklandet
376    kommer på den här laborationen ha en annan uppgift.
378    Utöver dokumentationen av programmet så ska ni även lämna in en
379    detaljerad beskrivning av vem som gjort vad i projektet. Detta för att
380    individuell poängbedömning ska kunna göras (var nogrann med
381    denna). Denna del ska ges som en bilaga till rapporten. Till exempel
382    kan en uppdaterad version av dokumentet från milestone tillfället
383    ingpå. Observera att det inte räcker med en mening där ni säger att ni
384    båda varit inblandade i allt och gjort lika mkt (lite mer detaljnivå
385    krävs).
387 * Programdokumentation  DEADLINE: <2009-01-13 Tue 15:15>
388   Dokumentation av arbetet ska vara inlämnad senast Tisdag 13/1-09
389   15:15 Den största vikten i rapporten ligger på hur systemet är
390   uppbyggt. Vilka delar ska modifieras för att olika effekter ska
391   uppnås. Här hör ett eller flera UML-diagram hemma,
392   algoritmbeskrivningar i grafisk form, etc.
393   
394   Tänk på att den här delen ska fungera som referenslitteratur. Det
395   ska alltså inte vara uppsatser, utan listor, bilder, grafer,
396   tabeller, träd, etc. Små textstycken behövs med, men en
397   beskrivningar i uppsatsform är inget alternativ.
399 * Bedömning
400   Rapporten kommer betygsättas utifrån dels utseende (teckensnittsval,
401   marginalbredd, sidnumrering), innehåll (styckeuppdelning, förlopp, hur
402   lätt det är att slå upp saker i den), informationsförmedling (vad
403   berättas i rapporten), och slutligen kommer även stavfel,
404   särskrivningar, meningsbyggnadsfel och språkblandningar in i bilden.
406   JavaDoc-sidorna kommer gås igenom och deras innehåll kommer bedömas.
408   Javakoden kommer synas så den följer konventioner och "bra"
409   programmeringsstil. Ex. på mindre bra programmeringsstil är:
410   
411   : if (a.getP() < 4)
412   :    return false;
413   :  else
414   :    return true;
415   
416   En helhetsbedömning av bl.a. ovanstående kommer poängsätta rapporten,
417   kodens dokumentation, redovisning och källkoden. Resultatet kommer
418   bli: Nivå Poäng 1 0 - 7 2 0 - 14 3 0 - 20
419   
420   Dokumentationen kommer stå för runt 1/3 av den totala poängen, så glöm
421   inte att lägga ner tid på den.
422   
423   OBS: Poängsättningen av labben kommer att ske på den först inlämnade
424   versionen. Fel som ger O på labben kommer givetvis att bidra till att
425   minska poängtalet rätt rejält.
426   
427 * Ev otydligheter i specifikationen
428   Är något otydligt i specifikationen så är det upp till er att klargöra
429   vad som gäller. Redovisa även sådana klargörande i rapporten.