FILSPARNING OCH FILLADDNING MED KLASSEN HIGHSCORE

Relevanta dokument
Objektorienterad programmering i Java I

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

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Detaljbeskrivning av Player

TENTAMEN OOP

Översikt MERA JAVA OCH ECLIPSE. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning

Obs! Inget ur Javas standardbibliotek får användas i ett svar (om det inte står att man får det).

Tentamen i Introduktion till programmering

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

Användarhandledning Version 1.2

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

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Lösningsförslag tentamen FYTA11 Java

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

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

TUTORIAL: KLASSER & OBJEKT

Saker du ska kunna Föreläsning 13 & 14

729G04 Programmering och diskret matematik

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

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Spelprogrammering med XNA och MonoGame

Tentamen OOP

729G74 - IT och programmering, grundkurs. Dugga.

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

LÖSNINGSFÖRSLAG TENTAMEN

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

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

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Tentamen ID1004 Objektorienterad programmering May 29, 2012

729G04 Programmering och diskret matematik

TENTAMEN OOP

Design av interaktiv multimedia. Läs i förväg om det som övningarna kommer att beröra. Träna hemma både före och efter övningarna.

OOP Objekt-orienterad programmering

Laboration 1 Introduktion till Visual Basic 6.0

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

Objektorienterad programmering Föreläsning 11. Copyright Mahmud Al Hakim

Tentamen i Objektorienterad programmering

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 7 augusti 2015, kl 08:00-12:00

Grundläggande programmering med C# 7,5 högskolepoäng. Provmoment: Ladokkod: Tentamen ges för: TEN1 NGC011 ADAEK17, ASYST17 samt öppen för alla

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

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 9-10 Innehåll

Tentamen, EDAA20/EDA501 Programmering

Objektorientering i liten skala

Övningsuppgifter kapitel 8

TENTAMEN OOP

TENTAMEN MOM1 GRUNDLÄGGANDE PROGRAMMERINGSTEKNIK OCH

Provmoment: TEN1 Ladokkod: NGC011 Tentamen ges för: Omtentamen DE13, IMIT13 och SYST13 samt öppen för alla

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

Polymorfi. Objektorienterad och komponentbaserad programmering

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

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.

Gissa det hemliga talet

Provmoment: TEN1 Ladokkod: NGC011 Tentamen ges för: Tentamen DE14, IMIT14 och SYST14 samt öppen för alla

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

v. 42 Python HT17 En introduktion Oscar Bergqvist

Föreläsning 3-4 Innehåll

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

Datalogi för E Övning 3

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 9 Erik Nilsson, Institutionen för Datavetenskap, LiU

v. 43 Python HT17 En introduktion Oscar Bergqvist

Tentamen i Programmeringsteknik MN

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

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

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

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

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

Frekvenstabell över tärningskast med C#

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

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Designspecifikation den 13 december 2007

Föreläsning 5-6 Innehåll

Visual Basic, en snabbgenomgång

Systemutvecklare SU13, Malmö

Föreläsnings 9 - Exceptions, I/O

Objektorienterad Programkonstruktion. Föreläsning jan 2016

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

Laboration 1 - Grunderna för OOP i Java

Datastrukturer. Föreläsning Innehåll. Program med vektor Exempel. Deklarera vektorer

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Programmering B med Visual C

MicroPython Ett textbaserad programmeringsspråk för Micro:bit

TDDC74 Programmering: Abstraktion och modellering Dugga 3, kl 14 16, 25 mars 2015

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00

PROGRAMMERING A VC# 2008 EXPRESS UTVECKLINGSVERKTYGET VISUAL C#

Tentamen, EDAA10 Programmering i Java

Tentamen i Grundläggande Programvaruutveckling, TDA548

C++ Slumptalsfunktioner + switch-satsen

Objektorienterad programmering Föreläsning 5

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

DAT043 Objektorienterad Programmering

Chapter 4: Writing Classes/ Att skriva egna klasser.

Transkript:

FILSPARNING OCH FILLADDNING MED KLASSEN HIGHSCORE Detta dokument ska läsas för den som vill fördjupa sin förståelse för hur man kan arbeta med filsparning- och filladdning i XNA. Dokumentet kan ses som en utökning av kapitel 9 i boken Programmering 2 med C#. Om du arbetade med övningshäftet för boken Programmering 1, så skapade du kanske klassen HighScore för att arbeta med higscore-listor. Vi ska i det här kapitlet vidareutveckla en sådan klass som jag har skapat och lägga till funktionalitet för filsparning och filladdning. Detta dokument kräver att du använder filen HighScore.cs som finns i csharp2exempel.zip under XNA (Windows-spel) med Visual Studo 2010\Kap 09 (Filer). Problem med tangentinmatning i XNA I XNA finns det inget smidigt inbyggt sätt att skapa rutor för textinmatning från tangentbord. Det känns kanske dumt för oss som programmerar spel för datorer, men de flesta TV-spelskonsoler saknar tangentbord. Även om det finns tangentbord till Xbox 360 är det mycket få som använder det. Detta skapar förstås ett problem för oss som vill ha en highscore-lista. Det finns flera sätt att lösa problemet på. Ett är att använda bibliotek vars syfte är att lösa just dessa problem. Jag väljer dock att skapa en highscore-lista, där man får skriva in sitt namn som gamla traditionella arkad-spel. Det innebär att man har ett namn på tre tecken (t.ex. AAA eller XYV) och bläddrar mellan olika tecken (i den kod jag har skrivit för klassen HighScore bläddrar man med upp- och ner-tangenterna och väljer det aktuella tecknet med ENTER). Så här ser det ut då man väljer namn: 1

Man väljer namn med piltangenterna upp och ned, samt ENTER. Att arbeta med andras klasser Hittills i boken har vi endast arbetat med de klasser och objekt som vi tillsammans har skapat, samt med de klasser och objekt som finns i C#:s standardbibliotek och XNA. Vi (eller kanske snarare du) ska nu arbeta med en klass som jag har skapat. När man arbetar med andras klasser finns det flera olika sätt man gör det på. Ibland kan det vara stora klassbibliotek eller andra projekt som man måste importera. I fallet med klassen HighScore är det dock bara en enda fil som vi ska lägga in i vårt projekt. Ofta arbetar man också i större projekt. Då ansvarar en person för att koda en viss klass medan en annan person ansvarar för att skapa objekt av den i sin klass. En sådan gång är det viktigt att man kan kommunicera mellan varandra. Något som är A och O när man arbetar med andras klasser (liksom standardbibliotek) är att de är väl dokumenterade. Helst ska källkoden vara väl kommenterad men det bör också finnas ett dokument som beskriver klassen, dess metoder och egenskaper. Vad gäller klassen HighScore har jag försökt kommentera den väl. Att använda klassen HighScore Klassen HighScore innehåller alltså följande publika metoder: PrintDraw() 2

EnterUpdate() EnterDraw() SaveToFile() LoadFromFile() Metoderna Highscore.SaveToFile() och Highscore.LoadFromFile() har ingen kropp och det är upp till oss att implemenetera dem. Just nu kan vi dock strunta i dem och bara koncentrera oss på de tre första. Metoden Highscore.PrintDraw() anropas av Draw()-delen av spelloopen och skriver ut highscore-listan på skärmen. Det finns ingen Update()-metod för detta, då igen användarinput förväntas och inget på skärmen ska ändras. Metoderna Highscore.EnterUpdate() och Highscore.EnterDraw() används för att spelaren ska kunna mata in sitt namn (på tre bokstäver) i highscore-listan. Som vi ser på namnet anropas den ena från Update()-delen av spel-loopen medan den andra anropas från Draw()-delen. Nytt projekt: HighScoreExample Låt oss skapa ett helt nytt XNA-projekt där vi använder oss av klassen HighScore. Jag döper det nya projektet till HighScoreExample. Detta kommer vara ett mycket minimalistiskt exempel och den enda grafiken, är text som ritas ut på skärmen. För det behöver vi ladda in en ny font-fil i Content. Vi döper font-filen till myfont.spritefont. För att ladda in font-filen i vår kod, så skapar vi ett SpriteFont-objekt längst upp i Game1: Exempel 0.1 SpriteFont myfont; Sedan laddar vi in Content-objektet myfont i metoden Game1.LoadContent(): Exempel 0.2 myfont = Content.Load<SpriteFont>("myFont"); Klassen HighScore Vi lägger in filen HighScore.cs i vårt projekt och skapar ett objekt av det längst upp i Game1: Exempel 0.3 HighScore highscore; Sedan anropar vi konstruktorn i Game1.Initialize(), jag väljer att ha 10 personer i listan som maxantal: 3

Exempel 0.4 highscore = new HighScore(10); Två states Vi ska nu skapa stöd för två olika states. Vi vill bara kunna skriva ut highscore-listan och skriva in oss i listan. Vi börjar med att göra en enum längst upp i Game1, samt skapar ett objekt av den: Exempel 0.5 enum State PrintHighScore, EnterHighScore ; State currentstate; I Game1.Update() kan vi nu använda dessa två states. I statet EnterHighScore så vill vi anropa metoden HighScore.EnterUpdate() via vårt highscore-objekt, för att vi ska få skriva in oss i listan. Denna metod returnerar true då den är färdig och false medan den inte är färdig (kom ihåg att metoden anropas 30 eller 60 gånger per sekund). När den är färdig vill vi byta state till PrintHighScore. Som argument till HighScore.EnterUpdate() måste vi dels skicka ett GameTime-objekt, men också antalet poäng. Tanken är ju att vi egentligen ska anropa metoden efter att vi har spelat klart ett spel och därmed vet hur många poäng vi har tagit. Här väljer jag istället att alltid skicka in 10 päng (ett tips för att testa är att slumpa ut olika tal och skicka in som poäng, istället för att alltid skicka in 10). default-statet är själva visandet av själva highscorelistan. Det enda vi gör här, är att kontrollera om användaren trycker på e (som i Enter): Exempel 0.6 switch (currentstate) case State.EnterHighScore: // Skriv in oss i listan // Fortsätt så länge HighScore.EnterUpdate() returnerar true: if(highscore.enterupdate(gametime, 10)) currentstate = State.PrintHighScore; default: // Highscore-listan (tar emot en tangent) KeyboardState keyboardstate = Keyboard.GetState(); if(keyboardstate.iskeydown(keys.e)) currentstate = State.EnterHighScore; Vi kan nu lägga till stöd för våra två states i Game1.Draw() och där anropa HighScore.EnterDraw() eller highscore.printdraw() beroende på state: Exempel 0.7 // Använd spritebatch för att rita ut saker på skärmen spritebatch.begin(); 4

switch (currentstate) case State.EnterHighScore: // Skriv in oss i listan highscore.enterdraw(spritebatch, myfont); default: // Rita ut highscore-listan highscore.printdraw(spritebatch, myfont); spritebatch.end(); Så här kan det se ut: HighScore-listan skrivs ut och man kan skriva in sig genom att trycka på E. Att spara listan till fil Något som är lite tråkigt med denna highscorelista är att den återställs varje gång man startar om spelet. Det hela blir föstås betydligt roligare om vi laddar och sparar allt från och till en fil. I klassen HighScore finns metoden som saknar kropp. Låt oss nu tillsammans ge metoden en kropp, samt använda oss av den. Innan vi fortsätter vill vi först bestämma hur vi ska spara innehållet i filen. Jag föreslår att vi sparar varje spelares namn och poäng skiljt åt med ett kolon. Vi sparar också varje spelare och dennes poäng på en enskild rad. Här är ett exempel på hur innehållet i en sådan fil skulle kunna se ut: highscore.txt exempel på sparad fil TNT:10 AAA:10 5

KET:10 Koden för detta är inte speciellt krånglig om man väl har förstått hur det funkar med filsparning. Det enda vi behöver göra är att loopa igenom alla element i highscore-listan och hämta ut namn och päng. För varje element skriver vi in en ny rad i filen (observera att vi också måste lägga till using System.IO längst upp): Exempel 0.8 // SaveToFile(), spara till fil. public void SaveToFile(string filename) StreamWriter sw = new StreamWriter(filename); // Skriv in alla personer i highscore-listan: foreach (HSItem item in highscore) string text = item.name + ":" + item.points; sw.writeline(text); sw.close(); // Stäng filen Vi kan nu välja att anropa denna metod. Frågan är var? Det är upp till speldesignern att bestämma detta. Det är dock mycket viktigt att man inte skriver kod för att spara och ladda filer som en helt vanlig del av spel-loopen. I vårt fall kan vi faktiskt anropa denna i UnloadContent(): Exempel 0.9 highscore.savetofile("highscore.txt"); Om vi nu startar spelt, skriver in oss några gånger i listan och stänger av det, så bör filen highscore.txt ha skapats i samma map som exe-filen till vårt projekt ligger. Titta gärna i filen! Att ladda listan från fil Så långt, så gott. Men nu vill vi ju också kunna ladda listan. Att ladda in listan är lite klurigare, eftersom att vi då måste skapa nya HSItem-objekt för varje rad i filen. Dessutom måste vi plocka ut namnet och poängen som ju är separerade med ett kolontecken. För att separera namn och poäng så kan vi använda metoden String.Split(). Den kan ta emot ett char-tecken som argument och returnera en string-vektor. I vårt fall kommer vektorn bara innehålla två olika värden. Den första innehåller namnet och den andra poängen. Poängen måste vi sedan göra om till ett heltal med Convert.ToInt32(). Så här kan vi koda LoadFromFile(): 6

Exempel 0.10 // LoadFromFile(), ladda från fil. public void LoadFromFile(string filename) StreamReader sr = new StreamReader(filename); // Läs in alla rader till string-objektet row och skriv ut dem: string row; while ((row = sr.readline())!= null) // skapa en vektor som innehåller namn och poäng, // words[0] blir namnet och words[1] är poängen: string[] words = row.split(':'); int points = Convert.ToInt32(words[1]); // Lägg till i listan: HSItem temp = new HSItem(words[0], points); highscore.add(temp); sr.close(); // Stäng filen Läs mer om hur man delar strängar här: http://msdn.microsoft.com/enus/library/ms228388.aspx Vi kan lägga anropet till metoden i Game1.LoadContent(): Exempel 0.11 highscore.loadfromfile("highscore.txt"); Så, nu laddas vår highscore-lista från fil! 7