Here is a resource that I am using currently.
http://gamedevgeek.com/tutorials/managing-game-states-in-c/
There is source code for this article at the bottom.
I don't have it all figured out yet, but there are 3 major components
A base class from which you can virtualize all the functionality of your states from
#pragma once
class GameState
{
public:
virtual void Initialize() = 0; // Load resources here
virtual void Start() = 0; // Make gamestate objects here, register with renderer and physics
virtual void Stop() = 0; // Remove gamestate objects here, unregister with renderer and physics
virtual void Update(float dt) = 0; // Update game objects here
virtual void Pause() = 0; // Stop performing updates
virtual void Unpause() = 0; // Continue performing updates
virtual void Render() = 0; // Update renderer here
virtual void Destroy() = 0; // destroy everything
};
A couple States:
class MainMenu : public GameState
{
public:
MainMenu(Renderer * renderer, ResourceManager * resourcemanager);
void Initialize() override; // Load resources here
void Start() override; // Make gamestate objects here, register with renderer and physics
void Stop() {} // Remove gamestate objects here, unregister with renderer and physics
void Update(float dt) override {} // Update game objects here
void Pause() override {} // Stop performing updates
void Unpause() override {} // Continue performing updates
void Render() override {} // Update renderer here
void Destroy() {} // destroy everything
private:
Renderer * renderer;
ResourceManager * resourcemanager;
std::vector<GameObject*> menuobjects;
};
And...
class Game : public GameState
{
public:
Game(Renderer * renderer, Physics * physics);
void Initialize() override; // Load resources here
void Start() override {} // Make gamestate objects here, register with renderer and physics
void Stop() override {} // Remove gamestate objects here, unregister with renderer and physics
void Update(float dt) override; // Update game objects here
void Pause() override {} // Stop performing updates
void Unpause() override {} // Continue performing updates
void Render() override {} // Update renderer here
void Destroy() override {} // destroy everything
private:
void RegisterGameObject();
void RemoveGameObject(GameObject * object);
std::function<void(PhysicalObject& a, PhysicalObject& b)> OnIntersect;
Renderer * renderer;
Physics * physics;
std::vector<GameObject*> gameobjects;
};
Finally, a state manager:
class StateManager
{
public:
void Initialize();
void Cleanup();
void ChangeState(GameState* state);
void PushState(GameState* state);
void PopState();
void HandleEvents();
void Update(float dt);
void Draw();
bool Running() { return m_running; }
void Quit() { m_running = false; }
private:
// the stack of states
std::vector<GameState*> states;
bool m_running;
};
I am still working on figuring out how to implement the various functions in this framework, but once I do, I think I'll have a working state machine.