Tetris Dreams – Del 1

Inledning

När man känner att man börjar behärska c# är det naturligt att försöka ge sig på lite större projekt. Den här artikel serien kommer att ta upp just detta på ett övergripande sätt. Istället för att gå igenom rad för rad kommer vi att titta på utvalda delar och vad man bör tänka på i olika scenarior. Givetvis kommer källkoden att publiceras i sin helhet. Projektet vi valt är ännu en gång ett spel då man där får hantera mycket av det som vi har i vanliga applikationer, dvs input, output i ett klassiskt model view perspektiv.

Samtidigt går vi vidare och tittar på hur XNA samt visual studio kan användas för att publicera vårt spel på andra plattformar än PC. I vårt fall Xbox 360 i synnerhet. Windows Phone tas inte upp specifikt men arbetssättet att samtidigt utveckla för flera plattformar är snarlikt och det vi lär oss här kan vi ta med oss när vi fortsätter med mobilutveckling. Utöver detta kommer vi att tipsa om andra nätsidor som kan underlätta för en nybliven utvecklare samt köra en kort genomgång av några bra gratis verktyg som kan göra stor skillnad och snabba upp arbetet.

Slutligen är syftet med serien att ge inspiration att komma igång med ett större projekt som man kan arbeta och vidareutveckla under en längre tid då det kräver att man tänker igenom och planerar sin kod från början utan att ta genvägar. Låt oss komma igång.

Projektet

Spelet vi väljer att utveckla är en gammal klassiker, nämligen Tetris. Tänk på att Tetris är ett skyddad varumärke tillhörande TTC (The Tetris Company) och spel baserade på orginalet får inte användas i kommersiella syften. Vårt projekt skall därför endast användas i studiesyfte för personligt bruk. Spelet kommer att utvecklas på PC och Xbox parallellt med hjälp av XNA och Microsoft Visual Studio, i fortsättningen kallat VS.

bild

Screenshot av Tetris för IBM PC 1986.

Tips: Även vid ett lite större projekt bör man begränsa omfånget på funktionalitet så mycket det går. Det är lätt att sväva iväg och plötsligt har man en design som mer liknar ett episkt MMORPG än den lilla sidoscrollande rymdshooter man började skissa på.

Microsoft Gamestate Demo

Ramverk, spelmotor, kärt barn har många namn. Nu när vi ska göra ett större projekt är det dags att från början skapa några klasser som sköter grundläggande och återkommande funktionalitet. Vi väljer att använda en färdig grund från msdn.

Game State Management

Med hjälp av dessa klasser har vi direkt färdiga rutiner för input, menyer, fönsterhantering med transitions m.m. Najs! Vi väljer att ta bort en del småsaker från koden såsom texturer och annat och vips har vi en ett eget ramverk att utgå ifrån och vi kan direkt börja jobba med mer spännande saker.

Tips: Ladda gärna ner ramverket på egen hand och prova det utanför vårt tetris projekt. Då blir det lättare att se vad som hänger ihop utan en massa tetris klasser som rör till det.

Tips: När man använt ovan ramverk några gånger kan det vara en bra idé att börja skriva ett eget, skräddarsytt och anpassat för ens egna behov.

bild

Ramverksklasser:

class GameStateManagementGame : Microsoft.Xna.Framework.Game

Vår basklass som startar spelet. Vi registrerar vår Screenmanager genom att lägga till den som en komponent till XNA's ramverk.

Components.Add(screenManager);

class ScreenManager : DrawableGameComponent

Vår screenmanager ärver från en s.k DrawableGameComponent. Det gör att vi sen kan implementera våra egna Update,Draw och Initialize metoder. ScreenManager har hand om alla våra Fönster (Screens) och ser till att dom renderas i rätt ordning och att t.ex input skickas till rätt fönster.

abstract class GameScreen

Våra Fönster ärver alla från den här basklassen. Gamescreen hanterar grundläggande fönsterfunktionalitet, t.ex om fönstret är synligt eller om det håller på att sakta dimmas fram (transitions).

Vi delar alltså upp vårt spel i fönster. Screens eller scenes kan också vara bra ord för detta. Tanken är i alla fall att skapa ett fönster för varje del av spelet. Fönster kan sedan läggas ovanpå varandra för att skapa olika effekter.

I vårt ramverk har vi även klasser som sköter meny hantering.

class MenuScreen : GameScreen

MenuScreen är ett speciall fall av en GameScreen och ritar upp en meny med valmöjligheter. Enskilda meny alternativ består utav class MenuEntry som sköter själva meny alternativets text och position.

class InputState

Är en hjälpklass som tar hand om all input till vårt spel. Klassen har utökats med två metoder som hanterar långa knapptryckningar.

IsLongKeyPress (PC)

IsLongButtonPress (XBox360)

Tetrisklasser:

class TetrisBlock

Representerar ett fallande tetrisblock. Finns 7 olika typer och dessa kan alla roteras 4 ggr. Alla block representeras även av ett skuggblock som beskrivs i de matriser som vi genererar våra block ifrån.

class TetrisBlockQueue

En enkel kö som hela tiden levererar ett nytt block till vårt spelfält och samtidigt fyller på så att kön alltid består utan 4 nya block.

class TetrisModel

Här sköts all spelmekanik. Hanterar fallande block. Deras rotation, om dom har plats på spelplanen m.m.

class TetrisSaveData

För att spara våra highscore så använder vi denna klassen för att spara vår data och sen serialiserar vi ner allt som XML på fil.

PC

c:\Users\dinanvändare\Documents\SavedGames\TetrisDreams\TetrisDreams\Player1\savedata.xml.

Xbox360

userprofile\TetrisDreams\savedata.xml.

class BackgroundScreen

En bakgrundseffekt i 3D som piffar upp våra menyer.

class CreditsScreen

Ett exempel på en snygg credits skärm.

class GameBoardScreen

Här ritar vi upp vårt spelfält och hanterar input från spelaren..

class HighscoreScreen

Om man sätter nytt highscore så hamnar man här efter spelet är slut. Listar de 10 bästa poängen.

class OptionMenuScreen

Ljudinställningar.

bild

CreditsScreen, HighscoreScreen

OptionMenuScreen, GameBoardScreen

Xbox 360:

om förväntat när man utvecklar för Xbox360 istället för till PC så innebär det en del förändringar i arbetssätt. För att snabba upp programkod och göra den mindre resurskrävande så används en optimerad version av .NET framework. Detta gäller även för Winows phone utveckling.

Compact .Net framework.

.NET Compact Framework (.NCF) är designad för optimal prestanda för enheter med mindre resurser. .NCF består av en begränsad del av .NET Framework och lägger dessutom till en del egen funktionalitet speciellt utformad för de nya behov som kan uppstå. Byte av ramverk görs automatisk när man skapar ett projekt för Xbox 360 eller Windows Phone.

Skapa ett Xbox 360 projekt.

Vi startade vårt projekt som en vanlig PC applikation. Tanken är att vi ska utveckla vår tv-spels version parallellt med PC. För att göra detta i VS markerar vi vårt Tetris Projekt och väljer ”Create Copy of Project for Xbox 360”.

bild

Vi har nu ett nytt Xbox 360 projekt. Bägge våra projekt delar gemensamt på vårt Content, alltså våra texturer, modeller, font filer och annat. Källkods filerna är också gemensamma så gör man en ändring där så gäller den båda våra projekt. Det som skiljer är att eftersom vi har två stycken projekt har vi separata inställningsmöjligheter per projekt när man går in i Properties. Vi kan alltså ha olika inställningar för t.ex vilka optimeringar, varningar m.m vi vill använda oss av när vi bygger våra projekt. Tittar vi nu i vårt filsystem så syns nu en ny katalog i TetrisDreams\Bin. Bredvid den vanliga [x86] har det lagts till en ny, [Xbox 360]. Här hamnar de binärer vi skapar för debug och release precis som vi förväntar oss.

bild

Rätta till eventuella fel.

I och med att vi delar källkod mellan våra projekt kan det ibland uppstå konfilkter. Det kan vara så att vi vill ha en separat och unik hantering för en viss enhet. Lösningen är att använda sig av speciella macro i VS som gör just detta.

TetrisModel.cs

switch (saveState)
	{
	case SavingState.NotSaving:
	case SavingState.ReadyToSelectStorageDevice:
	#if XBOX
		if (!Guide.IsVisible)
	#endif
		{
		asyncResult = StorageDevice.BeginShowSelector(PlayerIndex.One, null, null);
		saveState = SavingState.SelectingStorageDevice;
		}
		break;

Vi har här ett special fall när vi ska spara resultat till fil. Vi är på väg att öppna upp en dialog där man väljer var man vill spara och därför så måste vi först kontrollera att vi inte redan har en annan dialog som visas. Koden mellan #if och #endif exekveras alltså endast för det projekt som är angett. I vårt fall XBOX.

Exempel

#if WINDOWS
// Kör kod som är specifik för Windows
elif XBOX
// Kör kod som är specifik för Xbox 360
#elif WINDOWS_PHONE
// Kör kod som är specifik för Windows Phone
#else
// Skriv ut ett felmeddelanade vid kompilering
error	Plattformen är inte specifiserad eller så är den inte tillåten i detta spel.
#endif

For mer information se Cross-Platform Conditional Compilation Symbols

Tips: Om du bestämmer dig för att utveckla för flera platformar samtidigt. Skapa respektive kopior direkt från start och kompilera även dina sido projekt då och då och inte bara för den miljö som du just för tillfället utvecklar och testar i. Är det så att du råkat använda ett API som inte stöds på en annan platform upptäcker du detta snabbt och kan du då göra en anpassning som fungerar på alla platformar så tjänar du en massa tid.

Nödvändiga verktyg

  • Arbetsstation med Visual Studio
  • En vanlig Xbox360 med hårdisk som är uppkopplad till Xbox Live och tillänglig på det interna nätverket. Man behöver alltså ingen speciell utvecklingsmaskin, en s.k dev-kit.
  • App hub medlemskap.

App Hub membership

För att kunna utveckla på Xbox 360 så krävs att man registrerar sig som utvecklare. Detta kostar $100, cirka 700kr per år. Det finns även gratis medlemskap om man är student och skolan man studerar på har ett s.k Dreamspark medlemsskap. MSDN App Hub

Medlemsskapet innebär följande.

  • Möjlighet att utveckla och debugga direkt på din Xbox.
  • Släppa 10st Xbox LIVE Indie Games och ta betalt. (Gäller ej dreamspark medlemsskap)
  • Max storlek per spel är för närvarande 500mb.

App Hub membership

Installera xna på boxen

Att få igång XNA på krysslådan i korthet.

1. Använd dina apphub medlems uppgifter och skapa en ny profil i dashboarden.

2. Ladda hem XNA Game Studio Connect.

3. Registrera din Xbox i VS.

Connecting to Your Xbox 360 with XNA Game Studio 4.0 Refresh

Deploy

1. Bocka för []Build och []Deploy i solution explorer för Xbox360 projektet.

2. Välj [Build]->[Build solution]

3. Starta XNA Game Studio Connect (Waiting for computer connection)

4. älj [Build]->[Deploy Xbox 360 Copy of (ditt projekt)]

5. Vänta på att filerna först över. Klart! Spelet är redo att köras och ligger i [my games]

Deploying an Xbox 360 Game

Debug

1. Bocka för []Build och []Deploy i solution explorer för Xbox360 projektet.

2. Välj [Build]->[Build solution]

3. Starta XNA Game Studio Connect (Waiting for computer connection)

4. Välj [Debug]->[Start Debugging] (F5)

Debugging an Xbox 360 Game

Demo projekt

Slutligen finns ett demo projekt att ladda hem

bild

Screenshot av TetrisDreams huvudmeny.

Övningar

Övning 1

Utöka GameBoardScreen.cs och fyll i bästa poäng från hiscore i fältet [GOAL]

(svårighetsgrad 1)

Övning 2

Implementera functionalitet för [HOLD] dvs, man ska kunna spara det kommande blocket från blockkön för att vid valfritt läge kunna lägga tillbaka det i kön

(svårighetsgrad 3)

Övning 3

Lägg till ett nytt spel mode. T.ex att klara 40 rader på tid. Utöka meny systemet med en submeny för att välja mode efter att man valt [Play Game]. Lägg även till en separat Hiscore lista för denna mode.

(svårighetsgrad 4)

Övning 4

Implementera functionalitet för att droppa block som blivit ”hängande” efter att man tagit bort en hel rad. http://en.wikipedia.org/wiki/Tetris

http://en.wikipedia.org/wiki/Flood_fill

(svårighetsgrad 5)

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Scroll to top