Detaljbeskrivning av Player

Relevanta dokument
TDP005 Projekt: Objektorienterat system

Designspecifikation den 13 december 2007

TDDI82 - Projekt. Christoffer Holm. Institutionen för datavetenskap (IDA)

Kravspecifikation TDP005 Projekt: Objektorienterat system

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

PROGRAMMERINGSTEKNIK TIN212

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Objektorientering i liten skala

Övningar Dag 2 En första klass

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

Lab5 för prgmedcl04 Grafik

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Classes och Interfaces, Objects och References, Initialization

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

TENTAMEN OOP

Space Shooter. Projektrapport i kursen Avancerad C/C++ (DVA303) vid Mälardalens Högskola av Lars Lindqvist och Niklas Nolte

Space Invaders - Slutrapport

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Föreläsning 13 Innehåll

ID1004 Laboration 4, November 2012

TUTORIAL: KLASSER & OBJEKT

TDDC76 - Programmering och Datastrukturer

Programmering. Scratch - grundövningar

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Malmö högskola 2007/2008 Teknik och samhälle

JavaRats. Kravspecifikation. Version 1.1. Gustav Skoglund Marcus Widblom Senast ändrad: 13 / 05 / 08

Idag: Centrerad utskrift. Granskning. DD1311 Programmeringsteknik med PBL. Granskning Felhantering GUI. Föreläsning 15.

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Fyra i rad Javaprojekt inom TDDC32

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

Parameteröverföring. Exempel. Exempel. Metodkropp

SgLib Simple Graphics Library

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Imperativ programmering. Föreläsning 4

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

Skolan för Datavetenskap och kommunikation. Programmeringsteknik. Föreläsning 16

Inledande programmering med C# (1DV402) Tärningarna ska kastas

3. Välj den sprajt (bild) ni vill ha som fallande objekt, t ex en tårta, Cake. Klicka därefter på OK.

Tentamen i EDAF oktober Skrivtid: Skriv bara på ena sidan av pappret tentorna kommer att scannas in, och endast framsidorna rättas.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

För alla uppgifter på tentan gäller: Man får använda både standard-c++ (som till exempel har pekare som anges med * och objekt som skapas med new) och

ID1004 Laboration 3, 5-6 November 2012

Mikael Bondestam Johan Isaksson. Spelprogrammering. med CDX och OpenGL

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Grundläggande programmering med C# 7,5 högskolepoäng

2D1339 Programkonstruktion för F1, ht 2003

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

TDIU01 Programmering i C++

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Teoretisk del. Facit Tentamen TDDC (6)

JAVA Mer om klasser och objektorientering

Objektorienterad programmering i Java I

Programmera i Block Editor

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

Tentamen OOP

1 Kravspecifikation Snake App

Tentamen, Algoritmer och datastrukturer

Exempel på användning av arv: Geometriska figurer

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Tentamen, EDAA20/EDA501 Programmering

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Övning 4. Arv och andra relationer

Programmering = modellering

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

LÖSNINGSFÖRSLAG TENTAMEN

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Introduktion till arv

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Objektorienterad programmering i Java

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Programmering B med Visual C

Sockets: server. with Ada.Command_Line; use Ada.Command_Line; with Ada.Exceptions; use Ada.Exceptions; with Ada.Text_IO; use Ada.

TENTAMEN I. OBJEKTORIENTERAD PROGRAMMERING för Z1. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Programutveckling för Tekniska Tillämpningar Arbetsblad 5

TDDD78 projekt: Tower Defence

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Presentation av trafiksimuleringsprojektet

1 Klasser och objektorientering Vad är objektorientering?

Laboration 2. returnerar true om det är omöjligt för roboten att göra move() utan att. exekveringsfel erhålls, annars returnera false.

FILSPARNING OCH FILLADDNING MED KLASSEN HIGHSCORE

Programmering i Scratch 2.0

Flaxande Fågel. Introduktion. Level

Transkript:

Detaljbeskrivning av Player Syftet med Playerklassen är att representera det skepp som spelaren styr. Spelarens skepp styrs till skillnad från övriga skepp av spelaren både när det kommer till vilken riktning den kör i och om den skjuter eller ej. Spelarens skepp kan inte heller lämna spelplanen. Player klassen ärver av Ship klassen som i sin tur ärver av Sprite klassen. Players konstruktor tar en pekare till en SDL_Surface som representerar skärmen, en pekare till en SDL_Surface som representerar spelarskeppets bild samt två koordinater x och y. Samtliga parametrar anropar Ships konstruktor. I Players konstruktor sätts antalet liv till 3 samt starthastigheten till 0. Player har en metod, update, som kontrollerar om spelarens nästa position fortfarande är inom skärmens gränser och om den är det så uppdateras positionen. Den kollar även om spelaren har slut på liv, om så är fallet så sätts kill_sign_ till true och spelaren får game over vid nästa kontroll i PlayState. Från Ship ärver Player följande metoder och variabler: void decreasehp() Minskar skeppets hit_points_ med 1. Den kallas på av PlayState om spelaren kolliderar med en fiende eller ett fiendeskott. bool shoot_sign_ En variabel som representerar om skeppet skjuter eller ej. Den kollas av PlayState för att avgöra om nya skott ska läggas till i skottvektorn. int hit_points_ En variabel för att hålla koll på hur mycket liv skeppet har kvar. Om denna någonsin når noll sätts kill_sign_ (från Spriteklassen) till sannt vilket gör så att PlayState kallar på changegamestate (som finns i GameEngine) och byter till GameOverState. double shot_x_speed_ En variabel som anger vilken hastighet skeppet skjuter i x led. Det är något tveksamt att spelaren har denna då den alltid är 0 (se diskussionen om Shipklassen i Beskrivning av designen ). double shot_y_speed_ En variabel som anger vilken hastighet skeppet skjuter i y led. int score_ En variabel som anger hur mycket poäng som skeppet ger när det blir nedskjutet. Det är även tveksamt att spelaren har denna. speed_ Återigen inget spelaren använder då den får sin input från tagentbordet. angle_ Återigen inget spelaren använder då den får sin input från tagentbordet. Ships konstruktor anropar Sprites konstruktor med pekaren till screen och pekaren till image. I konstruktorn så sätter den x_ till x och y_ till y. Konstruktorn är protected då vi endast vill skapa instanser av underklasser till ship. 1

Från Sprite ärver Player följande metoder och variabler: bool collides(sprite const& s) const Returnerar sant om skeppet kolliderar med s. bool outofscreen() const Returnerar sant om skeppet är utanför spelplanen. Spelaren använder inte denna då spelaren aldrig kan åka utanför planen. void draw Ritar ut skeppet på skärmen. double x_ X positionen för det övre vänstra hörnet på skeppet. double y_ Y positionen för det övre vänstra hörnet på skeppet. double x_speed_ Hastigheten i x led. double y_speed_ Hastigheten i y led. SDL_Surface* screen_ En pekare till en skärmyta. SDL_Surface* image_ En pekare till en bildyta. bool kill_sign_ En variabel som avgör om skeppet ska förstöras eller ej vid nästa loopiteration i PlayState. I spelarens fall triggar denna ett byte till GameOverState om den är sann. int width_ Bredden på skeppet. int height_ Höjden på skeppet. Spriteklassen används till att samla alla egenskaper som alla rörliga objekt har i spelet. Spriteklassens konstruktor sätter screen_ till screen, image_ till image, kill_sign_ till false, width_ till image >w och height till image >h. Konstruktorn är protected då vi endast vill skapa instanser av underklasser till ship. Spriteklassen inkluderar main.h för att komma åt SDL och vår utritningsfunktion draw_surface. 2

Detaljbeskrivning av GameEngine GameEngine är den klass som håller koll på vilket stadie spelet befinner sig i. Den innehåller även funktioner som kan påverka alla spelstadier och den kod som ser till att spelet överhuvudtaget körs. Klassen har en kompositionsrelation till IntroState, MenuState, PlayState, HighscoreState och GameOverState (vilka ärver av AbstractGameState) då den innehåller en vektor med instanser av alla dessa klasser (se UML diagram under Beskrivning av designen för en fullständig förklaring av klassförhållandena). De källkodsfiler som hör samman med klassen inkluderar även SDL, SDL_image, SDL_ttf och classes.h (vars syfte är att lösa cirkulärberoenden). GameEngines konstruktor sätter active_state_ till 0, running_ till true och game_on_ till false. Konstruktorn fyller inte vektorn med spelstadier, utan detta görs i run() innan spelloopen börjar. Destruktorn frigör det minne som hör samman med alla spelstadier. GameEngine har följande metoder och variabler: void run() Skapar textfonter, färger, skärmpekaren, event hanterar och lägger in alla spelstadier i en vektor. Initialiserar även SDL och sätter titeln på fönstret till SPACE RANDOM. Efter att allt som behovs har skapats och initialiserats sätter spelloopen igång, vilken körs 100 gånger i sekunden. Denna körs fram tills något spelstadie kallar på funktionen quit(), vilken sätter running_ till false och avslutar loopen. När loopen avslutats frigörs det minne som allokerats i run(). void changegamestate(int to_state) Byter värde på integern aktive_state_ till värdet på parametern. De olika spelstadierna kallar på den här funktionen för att byta spelstadie. void callforreset() Kallar på en funktion i PlayState som ställer om alla värden i PlayState till grundtillståndet för att starta ett nytt spel. void initialize() Kallas på av run() för att initialisera SDL. void quit() Sätter running till false och avslutar spelloopen. int active_state_ ID för nuvarande gamestate. Används i run() för att kalla på draw() och update() funktionerna i rätt stadie. Detta sker genom att run() kallar på funktionerna i fråga i det state som har detta index i vektor. Stadierna har alltid samma index i förhållande till varandra (0 IntroState, 1 MenuState, 2 PlayState, 3 HighscoreState, 4 GameOverState). bool running_ Är vilkoret i spelloopen, så länge den är sann så körs spelet. Om den sätts till false bryts spelloopen. 3

bool game_on_ Är sann om ett aktivt spel körs för tillfället. Denna variabel används för att avgöra om knappen Resume Game ska visas i menyn eller inte. std::vector<abstractgamestate*> states_ Vektorn där vi sparar de gamestates som finns i spelet. Utöver detta skapas ett antal variabler lokalt i run() som används av alla instanser i spelet. Exempel på dessa är SDL färgerna grön och svart, samt TTF fonts. 4

Beskrivning av designen Vår design bygger på en spelmotor som har kontroll över 5 spelstadier, IntroState, MenuState, GameOverState, HighscoreState och PlayState. Stadierna skapas direkt när spelet startas och ligger alltid sparade i en vektor tills programmet avslutas. Detta gör det mycket enkelt att pausa spelet och sedan forsätta exakt där man var innan man pausade. De olika stadierna ärver av klassen AbstractGameState, som innehåller de metoder och attribut som de har gemensamt. Stadierna har även tillgång till ett antal funktioner i GameEngine (de publika), främst för att kunna byta aktivt spelstadie men även för att kunna hålla koll på ett antal variabler som alla stadier måste ha tillgång till (vilket innebär att de inte kan ligga lokalt i ett stadie). Detta sköts genom att alla stadier innehåller en pekare till den GameEngine som skapats. En detaljerad beskrivning av förhållandet mellan klasserna kan ses nedan: 5

Stadierna existerar mestadels oberoende av varandra, förutom GameOverState som innehåller en pekare till PlayState. Denna har syftet att ge GameOverState tillgång till PlayStates publika funktioner för att kunna ta fram poängsumman för att kunna spara denna i highscore filen. Alla Spelobjekt ärver från den abstrakta klassen Sprite som ger dem ett antal gemensamma metoder och attribut. Under spriteklassen finns ännu en abstrakt klass, Ship, som innehåller de saker som delas av spelarskeppen och fiendeskeppen. Denna klass utgör en av designens svagheter då den egentligen kanske borde ha delats upp eftersom den innehåller attribut och metoder som inte används av alla underklasser. Alla sprites i spelet lagras i PlayState, vilken alltid har samma position i den vektor som lagrar alla stadier i GameEngine. Valet av STL container är ett resultat av en felaktig åtgärd till ett segmenteringsfel som var ett problem tidigt i utvecklingen. Inledningsvis lagrades alla stadier i en map, vilket är en överlägsen container då vi inte hade tänkt att ändra på den överhuvudtaget. Vi försökte dock lösa problemet genom att byta till en vektor, och den har stannat i programmet även efter att vi kommit på att det var en felaktig lösning då vi helt enkelt haft annat att göra i utvecklingen än att byta tillbaka till en map. Även de olika Spriteklasserna existerar mestadels oberoende av varandra utom Saucer, som tar en pekare till en Player för att fråga efter dennes position och skjuta mot densamma. Ytterligare en svaghet i designen är det höga beroendet mellan de olika klasserna. Många klasser är tvungna att ta emot pekare till andra klasser vilket innebär att vissa delar av designen flyter ihop till en viss del. Detta gör så att ändringar blir svårare att genomföra då även en liten ändring kan ha en större effekt. Vissa klasser (till exempel PlayState) är väldigt stora och skulle möjligtvis kunna delas upp i mindre beståndsdelar, vilket hade gjort det hela mer lättöverskådligt. 6

Hur Sprite och dess underklasser är uppbyggda kan ses nedan: 7

Hur AbstractGameState och dess underklasser associerar till varandra visas nedan: Innehållet i GameEngine visas nedan: 8

Externa filformat Det enda externa filformatet som används i Space Random är helt enkelt en vanlig textfil(.txt ) som används för att spara highscore listan. Värdena (poäng och namn) separeras med blanktecken och läses in med formatterad inmatning (samt skrivs till fil med formatterad utmatning). Anledningen att inget mer avancerat använts har varit dels att behovet inte varit så stort och dels att tid inte funnits till att implementera någonting mer avancerat. En svaghet med detta är att hanteringen av informationen saknar felhantering fullständigt och att det i nuvarande läge kräver att textfilen är strukturerad på precis rätt sätt (alltså att användaren inte gör dumma ändringar i filen). 9