Bookmark and Share

Svårighetsgrad
Svårighetsgrad
Betyg (0 röster)
BetygBetygBetygBetygBetyg
 

XNA - Meny

Inledning

Vi ska i denna artikel göra ett enklare menysystem. Det skall gå att välja med mus eller med tangentbord. För att göra det lite med intressant så kommer vi att låta meny-systemet ärva av klassen DrawableGameComponent. Förhoppningsvis kan du återanvända komponenten i andra XNA-projekt.

I kommande artiklar är det mycket möjligt att vi själva återanvänder just denna meny-komponent.

Projektet finns som vanligt att ladda ned i slutet av artikeln inklusive all "Content" som använts.

bild

Förberedelser

Vi skapar ett "Windows Game (XNA 4.0)" projekt. Två stycken fonter skall användas; en för omarkerade meny-alternativ och en för markerade.

Vi skapade våra med hjälp av Fancy Bitmap Font Generator. Ett bra verktyg för att skapa snygga fonter. Programmet genererar Bitmap-bilder som läggs till i "Content"-projektet. Viktigt att tänka på är att du sätter rätt "Content Processor" annars blir det en Texture2D och inte en SpriteFont av det hela.

bild

KeyboardComponent - GameComponent

Vi börjar med att presentera en komponent för att enklare hantera tangentbordet; KeyboardComponent. Denna ärver från klassen GameComponent och är inte uppritningsbar.

Via den statiska metoden KeyPressed kan vi nu enklare se när en tangent trycks ned. Tanken med komponenten är att den lever sitt eget liv och håller endast reda på tangentbordet.

Data till Menyn

Vi gör en data-klass för att beskriva ett meny-alternativ. Vad skall vi ha med? En text, position (X, Y) samt en indikation på om meny-alternativet är markerat; Selected.

En HitBox som beskriver det område som meny-alternativet tar upp på skärmen. Användbart för att avgöra om vi har fört muspekaren över alternativet vilket då borde göra alternativet markerat.

Vi använder här klassen Action för att kunna binda en metod till alternativet. Vi vill ju att något skall hända när vi klickar på alternativet med musen alternativt trycker ENTER på tangentbordet.

Nu till själva hjärtat av projektet. Denna gång ärver vi från DrawableGameComponent som till skillnad från GameComponent då är uppritningsbar. Vi har utelämnat några områden av kod (...) som kommer att kompletteras. Själva grunden har vi nedan.

Vi laddar våra fonter samt skapar de meny-alternativ vi vill ha. Vi har också med hanteringen av tangentbordet med hjälv av KeyboardComponent.

Trycker vi ENTER så letar vi reda på det markerade alternativet och kör den Action som finns tilldelad med metoden Invoke. Om du tycker det ser aningen konstigt ut så är det för att vi använder oss av LINQ, vilket i sig är ämne för både en eller flera separata artiklar. Observera att vi alltid har ett meny-alternativ markerat.

Komplettering #1

Vi måste ha metoder på plats som hanterar klicken som görs. Alla meny-alternativ, utom "QUIT", sätter en ny bakgrundsfärg.

Komplettering #2

Positionen samt området (HitBox) för varje alternativ måste beräknas. Vi försöker att centrera varje alternativ på skärmen samtidigt som alternativen separeras i höjdled. För att mäta hur stor en utskrift blir så har vi till hjälp metoden MeasureString från klassen SpriteFont.

Komplettering #3

För att hantera muspekaren så undersöker vi varje alternativ för att se om muspekaren befinner sig i HitBox. I så fall markeras alternativet. Vi passar även på att kolla om vänster musknapp trycks ned och kör då ClickAction.

Komplettering #4

Nästa och föregående alternativ måste hanteras. Trycker vi UPP när vi står överst så hamnar vi på det nedersta alternativet. Trycker vi NED när vi står nederst så hamnar vi på det översta alternativet. För att hitta det markerade alternativet använder vi oss återigen av lite LINQ .

Komplettering #5

Sist men inte minst så ritar vi ut alternativen. Är alternativet markerat så använder vi oss av en annan font. Läs mer om ?-operatorn i 10 Bra programmeringstekniker i C#.

Registrering av komponenter

För att få allt att fungera så behöver endast komponenterna registreras i vår Game-klass. I vårt projekt har vi döpt om den från Game1.cs till MenuTest.cs. Registreringen görs enligt:

Avslutning

Varför använder vi oss av komponenter? Jo det blir en tydligare uppdelning mellan ansvarsområden samt att komponenterna går oftast bra att återanvända om de görs någorlunda generella.

Spel-klassen blir nästan ödsligt tom men då skall man komma ihåg att det faktiskt saknas ett spel också.. I kommande artiklar skall vi se hur bra komponenterna fungerar tillsammans med s.k. "Game States".

Kommentarer

3 inlägg