magony.org
http://forum.magony.org/

GameStates über Vererbung
http://forum.magony.org/viewtopic.php?f=19&t=1307
Seite 1 von 1

Autor:  Magony [ Do 11. Jul 2013, 15:28 ]
Betreff des Beitrags:  GameStates über Vererbung

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

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/