Antwort erstellen 
:
Complete the task
Benutzername:
Betreff:
Nachrichtentext:
Gib deine Nachricht hier ein. Sie darf nicht mehr als 60000 Zeichen enthalten. 

Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :| :mrgreen: :geek: :ugeek: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbdown: :thumbup: :wave: :wtf: :yawn:
Schriftgröße:
Tipp: Formatierungen können schnell auf den markierten Text angewandt werden.  Schriftfarbe
Optionen:
BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist eingeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet
BBCode ausschalten
Smilies ausschalten
URLs nicht automatisch verlinken
   

Die letzten Beiträge des Themas - GameStates über Vererbung 
Autor Nachricht

Mit Zitat antworten Beitrag Verfasst: Do 11. Jul 2013, 15:28
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


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

Impressum