Auf das Thema antworten  [ 1 Beitrag ] 
GameStates über Vererbung 
Autor Nachricht
Administrator
Benutzeravatar

Registriert: Sa 15. Dez 2012, 19:15
Beiträge: 137
Wohnort: Karlsruhe
Mit Zitat antworten
Hallo Leute!

In einem anderen Forenbeitrag habe ich ein Beispiel für ein GameState-Management über Interfaces vorgestellt. Wer noch nicht weiß, was GameState-Management ist, dem sei dieser Beitrag nochmal wärmstens empfohlen.

Mittlerweile benutze ich ein anderes System für mein GameState-Management. Eines, das über Vererbung funktioniert. Interfaces sind mir noch immer recht suspekt.

Meine statische Klasse GameState:
Code:
 
namespace Ebowl
{
    internal class GameState
    {
        internal static GameState Active = null;
 
        private static GameState _ladeScreen = null;
        internal static GameState LadeScreen { get { if (_ladeScreen == null) _ladeScreen = new GameStates.LadeScreen(); return _ladeScreen; } }
 
        private static GameState _startScreen = null;
        internal static GameState StartScreen { get { if (_startScreen == null) _startScreen = new GameStates.StartScreen(); return _startScreen; } }
 
        private static GameState _spielfeld = null;
        internal static GameState Spielfeld { get { if (_spielfeld == null)_spielfeld = new GameStates.Spielfeld(); return _spielfeld; } }
 
        internal void Run()
        {
            if (Active != null) Active.UnloadContent();
            Active = this; LoadContent();
        }
 
        protected GameState()
        {
            Initialize();
        }
        protected virtual void Initialize() { }
        protected virtual void LoadContent() { }
        protected virtual void UnloadContent() { }
        internal virtual void Update(GameTime gameTime) { }
        internal virtual void Draw(GameTime gameTime, GraphicsDevice device, SpriteBatch sprite) { }
 
        protected static void Draw_Hintergrund(SpriteBatch sprite)
        {
            sprite.Draw(Res.Game_Hintergrund, new Vector2(), Color.White);
        }
 
        internal static void Unload()
        {
            if (Active != null) Active.UnloadContent();
            Active = null;
        }
    }
}
 

Gestartet wird ein GameState über folgenden Code:
Code:
GameState.StartScreen.Run();


Durch den Modifier virtual können die Methoden in der abgeleiteten Klasse überschrieben werden:
Code:
 
namespace Ebowl.GameStates
{
    internal class Spielfeld : GameState
    {
        protected override void Initialize()
        {
            base.Initialize();
        }
 
        protected override void LoadContent()
        {
            Ebowl.Spielfeld.LoadContent();
            base.LoadContent();
        }
 
        protected override void UnloadContent()
        {
            Ebowl.Spielfeld.UnloadContent();
            base.UnloadContent();
        }
 
        internal override void Update(GameTime gameTime)
        {
            Ebowl.Spielfeld.Update(gameTime);
            base.Update(gameTime);
        }
 
        internal override void Draw(GameTime gameTime, GraphicsDevice device, SpriteBatch sprite)
        {
            Ebowl.Spielfeld.Draw(gameTime, device, sprite);
            base.Draw(gameTime, device, sprite);
        }
    }
}
 

Es ist zu beachten, dass die Klassen die von GameState erben sich alle im Namespace Ebowl.Gamestates befinden. Bei diesem GameStates kommt noch hinzu, dass ich eine statische Klasse für das Spielfeld geschrieben habe die von mehreren GameStates angesprochen werden könnte. Deshalb der Verweis hier auf diese Klasse.

Die Instanzen der einzelnen GameStates werden also beim ersten Aufrufen erstellt und zurückgegeben. Über die Methode Run() kann der GameState dann gestartet werden. Dabei wird automatisch der vorherige, sollte es einen geben, entladen. Initialisiert werden die Instanzen alle in der Methode Initialize(). Dort können beispielsweise private Member initialisiert werden, die für die Verwendung des GameStates benötigt werden. In der Methode LoadContent() werden alle abonnierten Events aktiviert und der gewünschte Ausgangszustand hergestellt. Events könnten zum Beispiel die der Klasse MouseEvents sein, aus der Bibliothek magonyORG.Input.MouseEvents, wodurch Events ausgelöst werden, wenn der Benutzer an einer bestimmten Stelle mit der Maus klickt oder einen Bereich betritt, verlässt oder über ihn mit der Maus schwebt.

In der Methode UnloadContent() können diese Abos wieder deaktiviert werden, damit man keine Events in einem falschen GameState auslöst. Die statische Methode Unload() dient dazu, dass man beim Beenden des Programms den aktiven GameState entladen kann. Der Modifier protected ist übrigens wie der Modifier private, nur dass auch abgeleitete Klassen auf den Member zugreifen kann.

Noch Fragen?

Schöne Grüße,
Magony

_________________
Bei Fragen, Lob, Kritik, Vorschläge, hilfreiche Hinweise oder Alternativvorschläge: Beitrag, neues Thema oder PN.
Für Dinge die diskutiert werden sollten, bitte neues Thema im jeweiligen Forum.
Wenn du nicht weißt wohin: Forum Unsortiert.


Do 11. Jul 2013, 15:28
Diesen Beitrag melden
Profil Website besuchen
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Auf das Thema antworten   [ 1 Beitrag ] 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst neue Themen in diesem Forum erstellen.
Du darfst Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software
Deutsche Übersetzung durch phpBB.de

Impressum