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



Relevanta dokument
Space Invaders - Slutrapport

Designspecifikation den 13 december 2007

Att göra spel med Game Maker. Rum. Grundläggande delar. Gamemaker, dagens föreläsning. Programmeringsmodell

Kravspecifikation TDP005 Projekt: Objektorienterat system

Objektorienterad programmering

Post Mortem för Get The Treasure!

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

Detaljbeskrivning av Player

19. Skriva ut statistik

Macromedia. Flash 8 Grundkurs.

Sätt att skriva ut binärträd

Teknikprogrammet, inriktning informations- och medieteknik

Slutrapport för Pacman

Omtentamen i OOSU2, 21 augusti 2014

Nallelek Lärarvägledning

Tentamen i Objektorienterad programmering

1DV433 HT13. I vilken utsträckning har kursens innehåll och uppläggning gett förutsättningar för att du ska ha uppnått respektive lärandemål?

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

Digitalt lärande och programmering i klassrummet. Introduktionsworkshop - Bygg ett akvarium i Scratch

Brädspelet Mulan. Håkan Berggren, Magnus Ellisson, Lars Kristiansson, Cheng-Huei Kuo, Eva Ljunggren, Joakim Viker. Göteborg 1999.

Projektrapport EDA095

TDP005 Projekt: Objektorienterat system

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Varför behövs det? I Allegro finns t.ex. stöd för:

Lära känna skrivbordet

Skapande av en modifikation till Crysis

Peter Ottosson 31/ Introduktionskurs i datateknik II1310

Föreläsning 3.1: Datastrukturer, en översikt

Programmering av stegmotorer ett miniprojekt i samarbete med Svensk Maskinprovning

Region Skåne Verksamhetsledningssystem (VLS)

Introduktion till arv

Föreläsning 8. Designmönster

TDP005 Projekt: Objektorienterat system

HexaFlip. Kravspecifikation

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

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

Handbok Kstuds. Tomasz Boczkowski Granskare: Eugene Trounev Översättare: Stefan Asserhäll

Studentguide Adobe Connect Pro

Laboration 2 Grunderna i Photoshop

OOP Objekt-orienterad programmering

Objektsamlingar i Java

Kravspecifikation. TDP005 Projekt: objektorienterade system. Version 4.0 Datum Anna Ahlberg Johan Almberg

Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet

MagiCAD El & Rör. Varför MagiCAD och varför 2D/3D? Kollisionskontroll. MagiCAD El

Programmering för språkteknologer II, HT2014. Rum

Exempeluppgift i Logikstyrning. 1 Inledning. 2 Insignaler och utsignaler

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Digital Display VDS / Bus2

Övningar Dag 2 En första klass

Department of Information Technology Digitala projekt. SuperKull. Daniel Öhman Alexander Persson

Projektrapport - Live commentary

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Projekt i programmering 1 (ver 2)... 2 Projektidé... 2 Planering... 2 Genomförande... 2 Testning och buggar... 3 Utvärdering... 3 Planering...

Elisabeth Bejefalk IT-Assistent Avesta kommun

Spelet i sig är inte avancerat men projektet ställer en del krav på implementationen bland annat:

Adobe Photoshop CS. Ritprogrammet Photoshop är ett pixelbaserat ritprogram. I botten på bilderna Photoshop åsadkommer finns ett rutmönster av pixels.

Endless shooter neon - Post mortem

D I G I TA LT S K A PA N D E

Hitta ditt vatten. - en handledning. Vatteninformationssystem Sverige. VISS - VattenInformationsSystem Sverige

SLALOMINGÅNGAR hur svårt kan det vara?

Inledande programmering med C# (1DV402) Introduktion till C#

I högskolans nätverk hittar du programmet PowerPoint genom Startmenyn, Huvudmeny XP, Kontorsprogram, Microsoft Office, Microsoft PowerPoint.

Tips och tricks 1 Cadcorp SIS

RAPPORT: ATT UPPLEVA EN UTSTÄLLNING HELT I LJUD. FÖR UTSTÄLLNINGEN VÄRDEFULLT. BAKGRUND..s 2 METOD...s 2 RESULTAT...s 3 9 ANALYS AV WORKSHOP...

InPrint. Grunderna för hur du kommer igång och arbetar med Communicate: InPrint. Habilitering & Hjälpmedel

Handbok Hoppande kuben. Ian Wadham Eugene Trounev Matthias Kiefer Översättare: Stefan Asserhäll

Fotoballonger. Manual

Föreläsning 6: Introduktion av listor

Objektorienterad programmering, analys och design med Java, 5p 2D4135, vt Kursprogram

Objektorienterad programmering D2

Betatestning - Solsystem

Får jag be om ordet!

Projektspecifikation

InkScape. Inkscape är ett gratisprogram för objektgrafik (vektorgrafik) Man använder programmet till att illustrera, rita, skapa logotyper och figurer

Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa

Objektorienterad programmering

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

1.1 Mätning av permittiviteten i vakuum med en skivkondensator

Tentaupplägg denna gång

Slutrapport för JMDB.COM. Johan Wibjer

Consump. Om du kör miljövänligt så visar den grön text och kör du inte miljövänligt så visar rött, kör du något där emellan visar den gult.

Fyra i rad Javaprojekt inom TDDC32

Den här texten ska förhoppningsvis underlätta en del av anpassningarna. Det kan säkert finnas en del fel och annat tok.

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

729G75: Programmering och algoritmiskt tänkande. Tema 1, föreläsning 1 Jody Foo

STÄNG AV FÖNSTER. Regler FLAGGSPECTRUM I FLAGGSPECTRUM II FLAGGSPECTRUM III FLAGGSPECTRUM STJÄRNSPEL

J A G T Ä N K E R, D Ä R F Ö R Ä T E R J A G.

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

Gesäll provet Internetprogrammering I. Författare: Henrik Fridström. Personnummer: Skola: DSV

Min syn på visuella verktyg i produktutvecklingsprocessen

GIT L0002B INTRODUKTION TILL PROGRAMMERING OCH C# Information inför kursstart

Enkel Digital Skyltning. på några minuter...

UMEÅ UNIVERSITET 26 april 2002 Instutionen för datavetenskap. Grafproblem. Laboration 4, Datastrukturer och Algoritmer VT02

Bruksanvisning KABA MAS AUDITCON KABA MAS HAMILTON Modell 100, 200, 400, 50 och 52

LEGO Robot programmering och felsökning Hur svårt ska det vara att följa den svarta linjen?

En beskrivning om den process och det arbete som lades ner på att skapa en sushiförpackning. B SKRIVNING

Tentamen i Realtidsprogrammering

NXT LEGO-robot laboration Programmering och felsökning av en LEGOrobot

Vad roligt att ni har valt att bjuda varandra på den här timmen.

729G75: Programmering och algoritmiskt tänkande. Tema 1. Föreläsning 1 Jody Foo

Transkript:

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

Innehåll: Inledning 3 Metod 4 Utförande 5 Klassdiagram 5 Sprite och underklasser 6 Kollisionshantering 7 Minneshantering 8 Spelmotor 9 Pattern Editor 10 Resultat 11 Diskussion 11 Screenshots 12 Referenser 13 2

Inledning Vi ska i kursen Avancerad C/C++ (DVA303) som projekt göra ett litet spel för att visa vad vi har lärt oss under kursens gång. Vi valde att inte göra det föreslagna textbaserade äventyrsspelet utan istället göra en klassisk Space Shooter. En variant på det gamla spelet Space Invaders (Wikipedia, 2010a; The Dot Eaters, 2010) från 1978. Man styr runt ett litet rymdskepp och skjuter på allt som rör sig och får poäng. Banorna i spelet ska bestå av vågor av fiender som man måste skjuta ner innan nästa våg kommer. Den här rapporten kommer att beskriva hur vi gått till väga och hur vi löst vissa problem. 3

Metod Vi gick till väga med projektet genom diskussion om spelstilen på spelet. Vi var båda överens om att vi ville ha en ganska så retro stil på spelet, så att använda det gamla spelet Space Invaders som inspiration underlättade både vid både design- och programmeringsfrågor. Tillvägagångssättet med projektet bestod av en designdel och en kodnings- och testningsdel. Vår åsikt om dessa delar är i likhet med J. S. Harbours (Harbours, J. S., 2006). Under designdelen ska alla, eller så många som möjligt, objekt och egenskaper om dessa definieras och vara på papper eller i dokument. Nästa steg i utvecklingen var kodningen och testningen. Detta sker parallellt då kodningen är så förändringsbar att det skulle bli kaos om det skedde i för stora hopp. Med små hopp mellan förändringar i koden kundes vi lätt gå tillbaka till en fungerande version av programmet utifall vi upptäckte att det blev fel under testningen. Kodningen har skett helt i Visual Studio 2008. Vi använde sedan ett tredjepartsbibliotek kallat allegro för att rendera grafik. Till en början visualiserade vi klasserna i ett UML-diagram som gjordes i StarUML, men vi gick senare över till den inbyggda klassdiagramsfunktionen i Visual Studio 2008. Grafiken gjordes helt i Adobe Photoshop CS3. 4

Utförande Klassdiagram (fig. 1) 5

Sprite Vårt spel kommer till stor del handla om hantering av bitmappar så vi designade en lämplig klasshierarki för detta. Klassen Sprite består av en bitmap och en position som bitmappen kommer att ritas ut på. Den har även funktioner för att korrekt ladda in en bitmap, rita ut den på skärmen samt förstöra den. Här har vi även en funktion, Intersect, som tar in en annan Sprite som argument och beräknar ifall de överlappar varandra och returnerar en boolean. Det är en algoritm som kollar ifall något av de fyra hörnen på den ena bitmappen finns innanför de fyra hörnen hos den andra bitmappen. Det finns även en överlagring av Intersect som gör att man kan sätta en offset så kollisionsrektangeln blir större eller mindre. Klassen Player ärver publikt (Meyers, 2005; Lippman, Lajoie, Moo, 2005, s571) av Sprite och har utöver det variabler som håller reda på en Players hastighet och riktning, poäng och antal liv, en uppsättning kanoner med mera. Några funktioner i Player är Input, som läser av tangentbordet och Update som uppdaterar position och kanoner, som i sin tur uppdaterar de projektiler som tillhör kanonen. Eftersom vi i spelet kommer ha två typer av objekt man kan skjuta på, fiender och asteroider, som är ganska lika med skillnaden att fiender kommer att röra sig utefter en lista med n antal punkter och när den kommit till sista punkten fortsätta till punkt nummer ett i listan medan en asteroid bara kommer att röra sig mellan två punkter och därefter försvinna, men i övrigt vara ganska lika bestämde vi oss för att göra en mellanklass (NonPlayer) för att lagra de gemensamma variablerna och funktionerna. Klassen Enemy är ganska lik klassen Player med skillnaden att Enemy har en algoritm som räknar ut hur positionen ska uppdateras istället för att läsa av tangentbordet. (Exempel på Sprites som används i spelet. Den rosa färgen blir genomskinlig med hjälp av Allegro.) 6

Kollisionshantering Det här skriver J. S. Harbour om kollisionshantering: The easiest (and most efficient) way to detect when two sprites have collided is to compare their bounding rectangles (Harbour, J. S., 2006). Det passar bra att kollisionen sköts på detta sätt, och som tidigare nämnts så finns det en överlagring för att minska eller öka på storleken på kollisionsrektangeln. Fast som standard utgör bildens storlek också kollisionsrektangeln. Då det finns en typ av kollision, som gäller för alla typer av objekt, så är det lämpligt för denna funktion att vara del av klassen Sprite. Funktionen, som kallas Intersect, tar då en Sprite som parameter. Rollen som CollisionHandler (hädanefter också kallad hanteraren ) har är att inte bara hantera om det blir kollision mellan två objekt utan också hantera resultatet som kollisionen innebär. Hanteraren bestämmer om det blir kollision med hjälp av Sprite.Intersect. I ord kan det sägas att CollisionHandler jämför två objekt, som är eller ärver från Sprite, och frågar någon av de om det kolliderar med det andra objektet. Med denna definition av CollisionHandler så, ur en objekt-orienterad synpunkt, finns det inget som säger att CollisionHandler inte kan komma åt privata medlemmar hos ett objekt. Slutsatsen om hanterarens roll är då att den ses som vän av objekten. Enligt Stephen Prata så bryter denna lösning inte mot inkapsling eller mot objekt-orienteringens punkter om modellering. Författarens analogi om fjärrkontrollen och tv-apparaten stöder beslutet om att hanteraren ska ses som vän av klasserna i Sprite-hierarkin. (Prata, S. 2004) 7

Minneshantering Designen på spelet uppmuntrar att objekt dupliceras, med undantag av bildresurser. Med Spriteklassen som den enda klass som innehåller bilder så används en pekare till minnesplatsen där bilden laddats in. Detta betyder att bilden inte behöver förstöras för varje objekt som använder den, utan bara en gång. Som sagt så uppmuntrar designen att objekt dupliceras. Det betyder att mallar av objekten kommer skapas innan de blir del av spelet. Dessa mallar skapas där det är säkert att de måste laddas in för att fortsätta (någonstans mellan menyn och spelets start) och förstörs där det är säkert att de inte behövs mer, dvs. när användaren går tillbaka till menyn. För att frigöra minnet som bilden upptar så finns då Sprite.Deinit(). 8

Spelmotor När man startar spelet kommer man till en meny där man kan välja om man vill starta ett nytt spel eller avsluta. Funktionen Run i klassen Game innehåller själva spelalgoritmen. Den kallas när man väljer Start Game i menyn. Det första som händer är att vi kallar funktionen Init som i sin tur laddar in grafik som bakgrundsbild, GUI (Wikipedia, 2010b) och teckensnitt. Sedan laddar vi in all grafik för Player, Enemies och Asteroids samt skapar en lista med olika vågor av Enemy Swarms. Efter det kör vi huvud-loopen som körs tills man antingen dör och får slut på liv eller att man trycker på Escknappen för att avsluta. I loopen kallar vi på funktioner hos alla Sprites. Först körs funktionen Update, sedan Draw som ritar ut allt. Efter att man gått ur huvud-loopen kallas destruktorer för alla objekt. (fig. 2) Game-loop 9

Pattern Editor För att underlätta byggandet av banor till spelet kände vi att vi behövde en editor för att skapa de listor av punkter som fiender och asteroider använder sig av för att förflytta sig över spelplanen. Då detta skulle vara en enkel editor och vi inte ville lägga ner alltför mycket tid för att programmera den gjorde vi den med C# och Windows Forms. Med editorn kan man sätta ut punkter som sparas i en länkad lista (Loudon, K. 1999) och sedan simulera en bana som en fiende eller asteroid kommer att förflytta sig efter. Sedan spar vi ner listan av punkter till en fil som vi kan läsa in till vårt spel. Den stora rektangeln på bilden (fig. 3) visar den yta som representerar spelplanen. Alternativet hade varit att hårdkoda alla punkter i någon funktion och det hade varit mycket svårt att förutse hur slutresultatet blir utan att testa om och om igen i spelet. Editorn är helt enkelt ett hjälpmedel för att snabbt och lätt nå ett bra resultat. (fig. 3) Editor 10

Resultat Diskussion Resultatet blev ungefär som vi hade planerat med undantag av att vårt spel är mer dynamiskt än gamla Space Invaders. Med hjälp av vår Pattern Editor kunde vi göra mer varierande rörelsemönster och därmed blir det en bättre spelupplevelse för spelaren. Tack vare vår design på hur vi bygger upp en fiende så kunde vi skapa mer varierande vågor av fiender och asteroider. Som det är nu så har vi kombinerat sju olika fiender med 4 olika kanoner och 3 olika projektiler. I teorin skulle detta ge oss 7x4x3=84 helt unika fiender som man dessutom kan variera mer olika antal och typer av kanoner. Med andra ord har vi gjort en väldigt flexibel och mångsidig design. I ett tidigt skede av utvecklingen tänkte vi att vi skulle ha alla fiender, kanoner, projektiler osv. som statiska funktioner som returnerar en typ men vi övergav den iden när vi insåg att det var mer praktiskt att instansiera dem var och en innan de skulle användas. Det var bra när vi bestämde oss för att ha en mellanklass mellan Sprite och Enemy-Asteroid, som blev klassen NonPlayer. Men en sådan design saknas mellan Sprite och Enemy-Player. En klass, som kanske hetat Ship, skulle i så fall göra koddupliceringen minimal (fastän den redan var det). Anledningen till varför idén aldrig slog igenom är för att vi ville undvika multiple inheritance i vår klasshierarki. Men trots detta är vi nöjd med hierarkin. 11

Screenshots 12

Referenser Harbours, J. S. (2006) Game Programming All In One Third Edition, CENGAGE Learning Lippman, S.B., Lajoie, J., Moo, B. E., (2005) C++ Primer Fourth Edition, Pearson Education, Inc. Stoughton, Massachusetts Loudon, K. (1999) Mastering Algorithms with C, O Reilly Media, Inc. Sebastopol, CA Meyers, S. (2005) Effective C++ Third Edition. 55 Specific Ways to Improve Your Programs and Design. Pearson Education, Inc. Westford, Massachusetts. Prata, S. (2004) C++ Programmering Femte Upplagan, Pagina Förlags AB, Borgå, Finland The Dot Eaters (2010) The Dot Eaters, http://www.thedoteaters.com/p2_stage2.php, 2010-03-01 Wikipedia (2010a) Space Invaders, http://en.wikipedia.org/wiki/space_invaders, 2010-03-01 Wikipedia (2010b) Graphical User Interface, http://en.wikipedia.org/wiki/graphical_user_interface, 2010-03-18 13