Ich mache das ein bischen anders.
Zuerst hat meine "App" Klasse erstmal eine statische Methode die mir einen Zeiger auf das Irrlicht-Device gibt, so kann ich von überall daran ohne Parameter durch zig Methoden zu schleifen.
Als zweites habe ich "GameStateManager" und GameStates
Code:
class IGameState {
private:
public:
~IGameState() {}
virtual void OnEnter()=0;
virtual void OnUpdate(irr::f64 timeElapsed)=0;
virtual void OnRender()=0;
virtual void OnLeave()=0;
virtual bool OnEvent(const irr::SEvent &e)=0;
protected:
IGameState() {}
};
// klasse ohne fehlerhandling und verkürzt.
class GameStateManager {
private:
IGameState *_currentGameState;
public:
void OnUpdate(irr::f64 timeElapsed) {
_currentGameState->OnUpdate(timeElapsed);
}
void OnChangeState(IGameState *newState) {
if (_currentGameState)
_currentGameState->OnLeave();
_currentGameState = newState;
_currentGameState->OnEnter();
}
// weitere methoden für render, events usw. ala OnUpdate
};
Ich hab dann also einen GameState fürs Intro, Menü und einen für das laufende Spiel.
Ressourcen und Spielobjekte die ich benötige habe ich alle so in Klassen verpackt das diese grundsätzlich erstmal alles alleine Laden können.
Wie ich die dann weitergebe bin ich mir aber auch noch nicht zu 100% sicher.
Entweder ich erzeuge eine neue Klasse "Parameter" die zeiger auf alles enthält und die ich dann als Parameter weiterreiche um, eben nicht immer mehr Parameter einbauen zu müssen, oder ich mache aus den globale Klassen Singletons auf die ich dann auch von überall zugreifen kann ohne Parameter-Orgien zu veranstalten.
Die dritte Möglichkeit ist alles was für den jeweiligen GameState benötigt wird in der OnEnter-Methode zu laden, da ich aber keine Ahnung habe wie lange das dauern kann weiss ich noch nicht ob ich das dort machen werde oder nicht.