From 97771422fc235b383e5accf98a30e4d04b8fb0e2 Mon Sep 17 00:00:00 2001 From: Andreas Jakobsson Date: Tue, 13 Jan 2009 01:04:30 +0100 Subject: [PATCH] =?utf8?q?spell=20and=20format=20+=20Testk=C3=B6rningar?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../{promtWinIngame.png => promptWinIngame.png} | Bin report/report.tex | 200 ++++++--------------- 2 files changed, 55 insertions(+), 145 deletions(-) rename report/images/{promtWinIngame.png => promptWinIngame.png} (100%) diff --git a/report/images/promtWinIngame.png b/report/images/promptWinIngame.png similarity index 100% rename from report/images/promtWinIngame.png rename to report/images/promptWinIngame.png diff --git a/report/report.tex b/report/report.tex index 1ad71aa..bdc84f5 100644 --- a/report/report.tex +++ b/report/report.tex @@ -1,4 +1,4 @@ -\documentclass[titlepage, twoside, a4paper, 12pt]{article} +\documentclass[titlepage, a4paper, 12pt]{article} \usepackage[swedish]{babel} \usepackage[utf8]{inputenc} \usepackage{verbatim} @@ -44,7 +44,7 @@ \def\preTitle{Laboration 4} \def\kurs{Applikationsprogrammering i Java, HT-08} -\def\namn{Andreas Jacobsson} +\def\namn{Andreas Jakobsson} \def\mail{dit06ajs@cs.umu.se} \def\namnTva{Anton Johansson} \def\mailTva{dit06ajn@cs.umu.se} @@ -129,16 +129,16 @@ I den sista nivån ska banan utökas med ''växlar'' där användaren kan påver \verb!> java -jar AntiTD.jar! \end{footnotesize} +Problemspecifikation finns i original på sidan:\\ +\begin{footnotesize} +\verb!http://www.cs.umu.se/kurser/5DV085/HT08/labbar/lab4.html/! (kontrollerad 090112) % DONE check +\end{footnotesize} + \subsection{Antaganden om problemspecifikationen} I samtliga nivåer nämns i originalspecifikationen hur menyradens funktionalitet ska utvecklas. Specifika riktlinjer ges om hur menyalternativ ska byta namn beroende på applikationens tillstånd. Eftersom lösningen som presenteras i denna rapport hanterar namnbyten för de menyalternativ som för författarna känns relevant, görs antagandet att detta räcker för att visa att tekniken behärskas. Vidare nämns ett gränssnitt som innehåller metod \textit{landOn()}. I denna lösning antas denna metod få förändras enligt tycke, t.ex. genom att låta metoden ta paramterar. -Problemspecifikation finns i original på sidan:\\ -\begin{footnotesize} -\verb!http://www.cs.umu.se/kurser/5DV085/HT08/labbar/lab4.html/! % DONE check -\end{footnotesize} - \section{Användarhandledning}\label{Anvandarhandledning} % Förklara var programmet och källkoden ligger samt hur man kompilerar, % startar och använder det. Förklara även översiktligt vad som händer @@ -158,7 +158,7 @@ Källkoden ligger i underkatalogen \verb!src!. Följande kommandon förutsätter att programmet \textit{Apache Ant}\footnote{http://ant.apache.org/} är installerat. Verktyget \textit{Ant} är ett byggverktyg som använder sig av specifikationen -lagrad i en XML-fil, oftast \textit{build.xml}, för automatisera alla +lagrad i en XML-fil, oftast \textit{build.xml}, för att automatisera alla nödvändiga operationen vid kompilering av ett projekt. Detta kan innefatta all typ av filhantering, det vill säga kopiering, borttagning och flyttning, men även själva kompileringen av @@ -229,7 +229,7 @@ exempelvis vara utformad enligt kodsnutt \ref{kod:levels.xml}. \end{kod} \subsubsection{Filen levels.xsd}\label{sec:levels.xsd} -Filer \textit{levels.xsd} innehåller ett XML-Schematn +Filer \textit{levels.xsd} innehåller ett XML-Schema \footnote{http://www.w3.org/XML/Schema} som definierar hur giltiga XML-dokument till spelet ska vara utformade. Se kodsnutt \ref{kod:levels.xml} för exempel på ett giltigt dokument. @@ -260,7 +260,7 @@ till en XML-fil som innehåller information om banorna som ska spelas i spelet. Om inget argument anges kommer en förinställd fil att användas, se \textit{levels.xml} sida \pageref{sec:levels.xml}. XML-filerna ska följa schemat -\textit{levels.xsd} se sida \pageref{sec:levels.xsd}. +\textit{levels.xsd}, se sida \pageref{sec:levels.xsd}. \subsubsection{ATDController}\label{sec:ATDController} Klassen \textit{ATDController} är programmets huvudklass. Enligt @@ -309,33 +309,17 @@ denna klass under programmets körning. För att få tag på denna instans används den statiska metoden \textit{getInstance()}. I konstruktorn instansieras och sätts variabler som definierar de -olika enheterna, se beskrivning av \textit{Unit} sida -\pageref{sec:Unit} och \textit{Tower} sida \pageref{sec:Tower} för +olika enheterna, se beskrivning av \textit{Unit}, sida +\pageref{sec:Unit}, och \textit{Tower}, sida \pageref{sec:Tower}, för vilka variabler som finns och vad de gör. Detta innebär att det inte behöver skapas en ny klass för varje ny typ av enhet eller torn som ska skapas, det går dock alltid att skapa unika beteenden genom att göra en ny klass som utökar klassen \textit{Unit} och överlagrar någon av dess metoder, till exempel \textit{act()}. -En positiv effekt som fås genom kloning av enheter är att många av -dess resurser delas för varje enhet. Varje enhet som finns i spelet -har gemensamma referenser till bilder och ljud de ritar upp och -spelar. - \subsubsection{Tower}\label{sec:Tower} -Den abstrakta klassen \textit{Tower} ska utökas av underklasser för -att skapa representationer av torn som ska kunna agera i ett spel. Ett -torn består av ett flertal attribut som kommer att definiera stora -delar av dess utseende och beteende. -Klassen implementerar gränssnitten \textit{Agent}, \textit{Observer}, -\textit{Cloneable}. Torn observerar de rutor av typen -\textit{PathSquare}, som är inom dess räckvid, för att få information -om det kommer enheter (av typen \textit{Unit}) att möjligtvis skjuta -på. % TODO: Algobeskr -Metoder med logik för att flytta enheten finns implementerade, bland -dessa är \textit{act()} och \textit{collision()} viktiga. \subsubsection{BasicTower}\label{sec:BasicTower} Klassen \textit{BasicTower} utökar den abstrakta klassen @@ -375,10 +359,10 @@ Paketet \textit{level} innehåller en samling klasser som har en koppling till e Gränssnittet \textit{Clickable}, är ett gränssnitt med metod \textit{click()}. Instanser av \textit{Clickable} reagerar på metodanropet på olika sätt beroende på implementation. \subsubsection{Traversable}\label{sec:Traversable} -Gränssnittet \textit{Traversable}, är ett gränssnitt med metod \textit{landOn()} vilket tar emot en \textit{Unit} som parameter och manipulerar denna beroende tillståndet av instansen av \textit{Traversible}. +Gränssnittet \textit{Traversable}, är ett gränssnitt med metod \textit{landOn()} vilket tar emot en \textit{Unit} som parameter och manipulerar denna beroende av tillståndet av instansen av \textit{Traversible}. \subsubsection{Level}\label{sec:Level} -Klassen \textit{Level}, motsvarar en bana tänkt att användas i ett rutbaserat spel. Klassen implementerar gränsnitten \textit{Paintable, Cloneable, Clickable}. Banan kan alltså bland annat representeras grafiskt genom \textit{Paintable} och kan reagera på musklick genom \textit{Clickable}. Klassen innehåller en två-dimensionell lista vilket innehåller instanser av typen \textit{MapSquare} (se \pageref{MapSquare}). Listor finns även med pekare till de rutor som representerar start- och målrutor. +Klassen \textit{Level}, motsvarar en bana tänkt att användas i ett rutbaserat spel. Klassen implementerar gränsnitten \textit{Paintable, Cloneable, Clickable}. Banan kan alltså bland annat representeras grafiskt genom \textit{Paintable} och kan reagera på musklick genom \textit{Clickable}. Klassen innehåller en två-dimensionell lista vilket innehåller instanser av typen \textit{MapSquare}. Listor finns även med pekare till de rutor som representerar start- och målrutor. \subsubsection{MapSquare}\label{sec:MapSquare} Klassen \textit{Level}, är en abstrakt klass som motsvarar en ruta tänkt att användas för att kombineras till en bana i ett rutbaserat spel. Gränsnitten \textit{Paintable, Cloneable, Clickable} implementeras. Rutan kan alltså bland annat representeras grafiskt genom \textit{Paintable} och kan reagera på musklick genom \textit{Clickable}. Dessutom ärver klassen från \textit{Observable} för att kunna registrera lyssnare som sedan notifieras när en enhet går på rutan. Ett objekt av typen \textit{MapSquare} kan vara av typen \textit{PathSquare, TurnSquare, BlockedSquare, TowerSquare, BlockedSquare, StartSquare} och \textit{GoalSquare}. Typernas egenskaper beskrivs nedan. @@ -399,7 +383,7 @@ Klassen \textit{PathSquare}, representerar en blockerad ruta. I nuvarande versio Klassen \textit{PathSquare}, representerar en ruta där torn kan placeras ut. Rutan kan innehålla en referens till ett torn och markeras då som upptagen. \subsubsection{StartSquare}\label{sec:StartSquare} -Klassen \textit{PathSquare}, representerar en startruta som enheter kan släppas ut på. Den innehåller en kö där enheter lagras och släpper ut en efter en då detta inte skapar kollisioner mellan enheter. En startruta kan markeras med metoden \textit{click()} och detta sätter boolean \textit{active} till sann och i den grafiska representationen läggs en grön ram till runt rutan. Varje startruta är registrerad som observant till alla andra startrutor vilket gör att när en startruta sätts som aktiv så meddelar den alla andra startrutor på spelplanen att de ska ändra status till att vara inaktiva. +Klassen \textit{PathSquare}, representerar en startruta som enheter kan släppas ut på. Den innehåller en kö där enheter lagras och släpper ut en efter en då detta inte skapar kollisioner mellan enheter. En startruta kan markeras med metoden \textit{click()} och detta sätter boolean \textit{active} till sann och i den grafiska representationen läggs en grön ram till runt rutan. \subsubsection{GoalSquare}\label{sec:GoalSquare} Klassen \textit{PathSquare}, representerar en målruta där enheter samlas in @@ -407,7 +391,7 @@ Klassen \textit{PathSquare}, representerar en målruta där enheter samlas in -%\subsubsection{MapSquarePrototypeFactory}\label{sec:MapSquarePrototypeFactory} +% \subsubsection{MapSquarePrototypeFactory}\label{sec:MapSquarePrototypeFactory} \subsection{Paketet se.umu.cs.dit06ajnajs.util} Paketet \textit{se.umu.cs.dit06ajnajs.util} innerhåller främst klasser @@ -444,107 +428,10 @@ undan, enbart informationen som \textit{LevelEditorn} kan skapa sparas. \subsubsection{LevelsXMLParser}\label{sec:LevelsXMLParser} -Klassen \textit{LevelsXMLParser} har två metoder för att tolka -XML-dokument som följer XML-schemat i avsnitt \ref{sec:levels.xsd} och -bygga upp kompletta ban-instanser \textit{Level} (\ref{sec:Level}). +Klassen \textit{LevelsXMLParser} har två metoder för att tolka XML-dokument som följer XML-schemat i avsnitt \ref{sec:levels.xsd} och bygga upp kompletta ban-instanser \textit{Level} (\ref{sec:Level}). \subsubsection{XMLUtil}\label{sec:XMLUtil} -Klassen \textit{XMLUtil} har metoder för att ladda en fil, via -\textit{java.net.URL} eller \textit{java.io.File}, och returnera ett -validerat dokument, \textit{org.jdom.Document}. - -\subsection{Algoritmbeskrivning} -Följande avsnitt förklarar några av algoritmerna som finns -implementerade i spelet i mer detalj. - -\subsubsection{Tråden AnimationThread} - -\subsubsection{Tråden CreditThread} - -\subsubsection{Kollisionshantering} -För att inte enheter ska gå över varandra är kollisionshantering -implementerat. Innan varje enhet rör sig kollas enhetens framtida -position med alla andra enheters nuvarande position för att se om det -kommer att bli någon kollision. - -Om det inträffar en kollision och enheterna har motsatt riktning, det -vill säga ena enheten rör sig med riktning \textit{UP} och andra -\textit{DOWN} eller \textit{LEFT} mot \textit{RIGHT}, sätts båda -enheternas riktning till den motsatta de för närvarande färdas i och -första enheten flyttar sig. Om det inträffa kollision där enheterna -inte har motsatt riktning får enheten som kollen gjordes för inte -förflytta sig denna omgång. - -% TODO ALgoritm besk vis -\subsubsection{Krediträkning} - -\subsubsection{Tornens act()} - -\subsubsection{Enheternas act()} - -\subsubsection{Svängar} - -\subsubsection{Utritning av spelet} -Spelplanen ritas ut på en komponent i \textit{ATDView}. Denna -komponent är en inre klass som utökar Javas \textit{JComponent} och är -döpt till \textit{GameComponent}. När denna komponent skapas hämtas en -bild från \textit{ATDModel} och sparas undan i ett attribut. - -Metoden \textit{paintComponent(Graphics g)} överlagras för att rita ut -spelet i gräns\-snittet. Vid varje uppdatering av spelplanen körs denna -metod enligt kodsnutt \ref{kod:paintComponent}. - -\begin{kod} - \begin{footnotesize} -\begin{verbatim} -public void paintComponent(Graphics g) { - logger.fine("paintComponent: " + Thread.currentThread().toString()); - - // Draw backgroundImage - g.drawImage(backgroundImage, 0, 0, null); - - // Draw gameImage which should contain updated information from - // Controller - g.drawImage(gameImage, 0, 0, null); - - // Clear gameImage image with a big transparent rectangle. - Color transparent = new Color(0, 0, 0, 0); - gameGraphics.setColor(transparent); - gameGraphics.setComposite(AlphaComposite.Src); - gameGraphics.fill(new Rectangle2D.Double(0, 0, width, height)); -} -\end{verbatim} - \end{footnotesize} - \caption{Metoden paintComponent(Graphics g)}\label{kod:paintComponent} -\end{kod} - -För att få en uppdaterad bild där alla enheter ritar ut sig själv -sparas tillhörande \textit{Graphics}-objekt som ett attribut i -\textit{ATDView} som sedan kan hämtas av animationstråden för att låta -varje aktuell instans av \textit{Paintable} (se avsnitt -\ref{sec:Paintable} på sida \pageref{sec:Paintable}) rita ut sig själv -på bilden, se kodsnutt \ref{kod:paint}. Nedersta raden, -\verb!view.repaintGame();!, ritar om hela spelkomponenten, se kodsnutt -\ref{kod:paintComponent}; - -\begin{kod} - \begin{footnotesize} -\begin{verbatim} -// Repaint all agents -Graphics g = view.getGameGraphics(); -for (Unit unit : units) { - unit.paint(g); -} -for (Tower tower : towers) { - tower.paint(g); -} - -// Refresh the game view -view.repaintGame(); -\end{verbatim} - \end{footnotesize} - \caption{Utsnitt ur AnimationThread i ATDController}\label{kod:paint} -\end{kod} +Klassen \textit{XMLUtil} har metoder för att ladda en fil, via \textit{java.net.URL} eller \textit{java.io.File}, och returnera ett dokument, \textit{org.jdom.Document}. \section{Begränsningar}\label{Begransningar} % Vilka problem och begränsningar har din lösning av uppgiften? Hur @@ -629,6 +516,40 @@ När inga fler banor finns att spela får användaren möjlighet att skicka in s Figur \ref{fig:menu_antitd} och figur \ref{fig:menu_help} visar de alternativ som döljer sig i menyraden. I figur \ref{fig:menu_antitd} syns det tredje alternativet \textit{Resume} vilket vid start heter \textit{Paus} men är nu i ett annat tillstånd eftersom applikationen vid detta tillfälle var pausat. Detsamma gäller för fjärde alternativet \textit{unMute} vilket börjar som \textit{Mute}. Figur \ref{fig:menu_help} visar menyalternativen \textit{Help} och \textit{About}. Dessa innehåller en kort beskrivning av spelets regler och mål respektive en kort beskrivning om vilka som skapat applikationen. +\begin{figure}[H] + \begin{center} + \includegraphics[width=110mm]{images/leveleditor1.png} + \caption{Skärmdump ''LevelEditor'', applikationen har just startat} + \label{fig:editor1} + \end{center} +\end{figure} + +\begin{figure}[H] + \begin{center} + \includegraphics[width=110mm]{images/leveleditor2.png} + \caption{Skärmdump ''LevelEditor'', ''MapSquares'' av typen ''BlockedSquare''} + \label{fig:editor2} + \end{center} +\end{figure} + +\begin{figure}[H] + \begin{center} + \includegraphics[width=110mm]{images/leveleditor3.png} + \caption{Skärmdump ''LevelEditor'', ''Mapsquares'' av typen ''PathSquare'', ''StartSquare'' och ''GoalSquare''} + \label{fig:editor3} + \end{center} +\end{figure} + +\begin{figure}[H] + \begin{center} + \includegraphics[width=110mm]{images/leveleditor4.png} + \caption{Skärmdump ''LevelEditor'', ''Mapsquares'' av typen ''TurnSquare''} + \label{fig:editor4} + \end{center} +\end{figure} + +I figur \ref{fig:editor1} till figur \ref{fig:editor4} visas skärmdumpar av testapplikationen för att skapa banor. En hel bana har skapats genom att klicka ut rutor av olika typ. + \section{Diskussion}\label{Diskussion} % Diskutera om laborationen samt allmänt kring Web services och om hur % och när det är användbart (och inte användbart). Saker som kan vara @@ -657,18 +578,6 @@ I nuläget startas första banan direkt när applikationen startar. Att få se e I kontrollpanelen finns stora möjligheter till vidareutveckling då den nuvarande just täcker den funktionalitet som behövs för att köra spelet. Till en början skulle listan med tillgängliga units kunna bytas ut mot ikoner som visar enhetens grafiska representation. För att lättare kunna få en översikt över en enhets egenskaper skulle hälsa och hastighet kunna förmedlas med staplar istället för med text. Om listan byts mot ikoner finns även möjligheten att ta bort knappen \textit{Release Units} och låta användaren skicka ut önskad enhet genom att direkt klicka på enhetens ikon. -\subsubsection{Observer–Obervable} -Eftersom Javas \textit{Observalbe} är en klass som måste utökas för att användas kan inte \textit{MapSquares} klonas utan att alla får en gemensam lista med \textit{Observers}. En egen implementation av \textit{Observer–Observalbe} skulle behövas för att kunna klona kartrutor på ett användbart sätt. Med en sådan implementation hade det varit lättare i ett senare skede läsa in alla konfigurationsdetaljer för att skapa både kartrutor och enheter utifrån XML-dokument. - -\subsubsection{LevelEditor} -Klassen \textit{LevelEditor} hade behövt vidareutvecklas för att kunna användas för att skapa kompletta banor och redigera tillgängliga banor. Några punkter som hade behövts: -\begin{itemize} -\item Möjlighet att sätta riktning på en \textit{StartSquare} -\item Möjlighet att skapa flera banor och spara dem i en gemensam XML-fil. -\item Möjlighet att välja bilder som ska användas för rutorna. -\item Möjlighet att sätta antal enheter som krävs i mål för att vinna en bana. -\item Möjlighet att sätta ut torn. -\end{itemize} \bibliographystyle{alpha} \bibliography{books.bib} @@ -683,6 +592,7 @@ Härefter följer utskrifter från källkoden och andra filer som hör till denna laboration. \newpage -% \subsection{AntiTD.java}\label{AntiTD.java} -% \lstinputlisting{../src/se/umu/cs/dit06ajnajs/AntiTD.java} +\subsection{AntiTD.java}\label{AntiTD.java} +\lstinputlisting{../src/se/umu/cs/dit06ajnajs/AntiTD.java} + \end{document} -- 2.11.4.GIT