Feedback

C# - XNA tastaturabhängige Gamemenüklasse

Veröffentlicht von am 16.11.2009
(2 Bewertungen)
Folgende Klasse erlaubt es ohne große Codeblöcke ein Spielmenü in XNA zu realisieren.

Folgende Namespaces werden benötigt:
Microsoft.Xna.Framework;
Microsoft.Xna.Framework.Graphics;
Microsoft.Xna.Framework.Input;

Benutzen lässt sich die Menüklasse folgendermaßen:

Variablenerstellung (innerhalb der Gameklasse, außerhalb einer Methode):
Menu pauseMenu;


Konstruktoraufruf:
protected override void LoadContent()
{
//Erste Übergabe: Unselektierter Menüpunkt
//Zweite Übergabe: Selektierter Menüpunkt
//Dritte Übergabe: Spritefont (Schriftdatei)
pauseMenu = new Menu(Color.White, Color.LightBlue, Content.Load<SpriteFont>("menu"));
//Menüpunkt hinzufügen
pauseMenu.AddMenuItem("Beenden", new Vector2(100, 100));
}


Menü updaten lassen:
protected override void Update(GameTime gameTime)
{
pauseMenu.Update(gameTime);
base.Update(gameTime);
}

Menü zeichnen lassen:
protected override void Draw(GameTime gameTime)
{
pauseMenu.Draw(spriteBatch, true);
base.Draw(gameTime);
}
GFU-Schulungen  [Anzeige]

VB.NET Aufbau

Sie verfügen nach der Schulung über fundierte Kenntnisse in der Arbeit mit objektorientierten Modellen in VB.NET und können wiederverwendbare Komponenten eigenständig erzeugen.

VB.NET Einführung

Die Schulung zeigt Ihnen, wie Sie einfache, benutzerorientierte Programme, die auf Datenbanken zugreifen, in VB.NET eigenständig entwickeln. 

    class Menu
    {
        private static int maxItems = 20;   //Gibt die maximale Anzahl der Menüeinträge an
        private int menuItemCount;          //Gibt die aktuelle Anzahl aller Menüeinträge an
        private int curMenuItem;            //Gibt den aktuellen Menüeintragindex an
        private string[] menuItems;         //Array mit allen Menünamen
        private Vector2[] pos;              //Array mit allen Menüpositionen
        private double[] scale;             //Array mit allen Skalierungen der Menüeinträge
        private Color unselected;           //Farbe der aktuell nicht ausgewählten Einträge
        private Color selected;             //Farbe des ausgewählten Eintrages
        private SpriteFont font;            //Fontdatei des Menüs

        //Constructor des Menüs
        //Initialisiert Standardwerte
        public Menu(Color unselectedColor, Color selectedColor, SpriteFont font)
        {
            this.font = font;
            this.menuItems = new string[maxItems];
            this.pos = new Vector2[maxItems];
            this.scale = new double[maxItems];
            this.unselected = unselectedColor;
            this.selected = selectedColor;
            this.menuItemCount = 0;
            this.curMenuItem = 0;
        }

        //Methode zum Erstellen eines neuen Menüeintrages
        //Übergibt den Namen und Position
        public void AddMenuItem(string name, Vector2 p)
        {
            //Prüft ob bereits die maximale Anzahl erreicht wurde
            if (menuItemCount < maxItems)
            {
                menuItems[menuItemCount] = name;
                scale[menuItemCount] = 1.0f;
                pos[menuItemCount++] = p;
            }
        }

        //Methode um den nächsten Menüpunkt auszuwählen
        //Nach letztem Menüpunkt zum ersten zurückspringen
        public void SelectNext()
        {
            if (curMenuItem < menuItemCount - 1)
            {
                curMenuItem++;
            }
            else
            {
                curMenuItem = 0;
            }
        }

        //Methode um den letzten Menüpunkt auszuwählen
        //Nach erstem Menüpunkt zum letzten zurückspringen
        public void SelectPrev()
        {
            if (curMenuItem > 0)
            {
                curMenuItem--;
            }
            else
            {
                curMenuItem = menuItemCount - 1;
            }
        }

        //Gibt das Indize des aktuellen Menüpunktes zurück
        public int GetSelectedNum()
        {
            return curMenuItem;
        }

        //Gibt den aktuellen Namen des aktuellen Menüpunktes zurück
        public string GetSelectedName()
        {
            return menuItems[curMenuItem];
        }

        //Updatet das Menü
        public void Update(GameTime gameTime)
        {
            //Durchläuft alle Menüpunkte
            for (int i = 0; i < menuItemCount; i++)
            {
                //Lässt die Skalierung des aktuellen Punktes langsam größer werden
                if (i == curMenuItem)
                {
                    if (scale[i] < 1.5f)
                    {
                        scale[i] += 0.04 + 10.0f * gameTime.ElapsedGameTime.Seconds;
                    }
                }
                //Lässt die Skalierung aller anderen Menüpunkte langsam kleiner werden
                else if (scale[i] > 1.0f && i != curMenuItem)
                {
                    scale[i] -= 0.04 + 10.0f * gameTime.ElapsedGameTime.Seconds;
                }
            }
        }

        //Methode um das komplette Menü zu zeichnen
        //Übergibt die Spritebatch und einen Boolschen Wert der abgibt ob sich das Menü außerhalb von
        //spriteBatch.Begin()/.End() befindet
        public void Draw(SpriteBatch spriteBatch, bool standalone)
        {
            if (standalone)
                spriteBatch.Begin();

            //Durchläuft alle Menüpunkte und zeichnet den Menüpunkt mit den entsprechenden Eigenschaften
            for (int i = 0; i < menuItemCount; i++)
            {
                if (i == curMenuItem)
                {
                    Vector2 p = pos[i];                 //Weist die Position einer temporären Variable zu
                    p.X -= (float)(22 * scale[i] / 2);  //Verschiebt die Position der x-Achse um den Namen mittig anzuzeigen
                    p.Y -= (float)(22 * scale[i] / 2);  //Verschiebt die Position der y-Achse um den Namen mittig anzuzeigen
                    spriteBatch.DrawString(font, menuItems[i], p, selected, 0.0f, new Vector2(0, 0), (float)scale[i], SpriteEffects.None, 0);
                }
                else
                {
                    Vector2 p = pos[i];                 //Weist die Position einer temporären Variable zu
                    p.X -= (float)(22 * scale[i] / 2);  //Verschiebt die Position der x-Achse um den Namen mittig anzuzeigen
                    p.Y -= (float)(22 * scale[i] / 2);  //Verschiebt die Position der y-Achse um den Namen mittig anzuzeigen
                    spriteBatch.DrawString(font, menuItems[i], p, unselected, 0.0f, new Vector2(0, 0), (float)scale[i], SpriteEffects.None, 0);
                }
            }

            if (standalone)
                spriteBatch.End();
        }
    }
Abgelegt unter XNA, Spielmenü, Menü, Gameklasse, Spielklasse.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!