Jeśli zaczynasz przygodę z GameDevem to rzeczywiście rozwiązanie typu GameState enum może rozwiązać Twój problem. Jeśli jednak myślisz o czymś ambitniejszym proponuje Ci implementację systemu scen.
class Scene : public sf::Drawable
{
protected:
const sf::Time updateLogicTime;
public:
const sf::Time getUpdateLogicTime();
virtual void update(sf::Time) = 0;
virtual void handle(const sf::Event) = 0;
virtual void draw(sf::RenderTarget & target, sf::RenderStates states) const = 0;
Scene(sf::Time);
virtual ~Scene();
};
Wszystkie Twoje sceny czyli de facto: menu, wybór postaci itp. będą dziedziczyć po klasie Scene. Implementujesz sobie klasę Engine albo coś podobnego.
class Engine{
private:
Window window;
sf::Clock timer;
sf::Time fps,
accumulator;
MenuScene menu;
HeroSelectScene heroSelectScene;
GameScene gameScene;
Scene* currentScene;
void handleInputs()
{
sf::Event event;
while(window.pollEvent(event))
{
currentScene->handle(event);
}
}
void update()
{
fps = timer.restart();
accumulator += fps;
if (accumulator >= updateLogicTime)
{
currentScene->update(accumulator);
accumulator = sf::Time::Zero;
}
}
void draw()
{
window.clear(sf::Color::Black);
window.draw(*currentScene);
window.display();
}
void mainLoop()
{
while(/*dostęp do okna*/)
{
handleInputs();
update();
draw();
}
}
public:
void run()
{
mainLoop();
}
Engine()
{
//...
accumulator = sf::Time::Zero;
}
};
Bardzo nieelegancko trzymam sceny w klasie wyżej. Powinieneś napisać sobie jakąś strukturę danych albo trzymać je w mapie. Wtedy jedna scena nie wie nic o drugiej, ale ma możliwość (w prosty i czytelny sposób) wysłania pseudo requesta do klasy Engine o zmianę sceny.
Polecam Ci ten wzorzec, jeśli masz jakieś problemy z implementacją pisz.