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