GameStateManager.cxx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "GameStateManager.hxx"
  2. GameStateManager::GameStateManager()
  3. :states_{{GameStates::Loading}}
  4. {
  5. loading_.on_enter(*this);
  6. }
  7. GameStateManager::~GameStateManager()
  8. {
  9. while (!states_.empty()) {
  10. pop_state();
  11. }
  12. }
  13. GameState* GameStateManager::enum_to_state(GameStates const state)
  14. {
  15. switch (state) {
  16. default:
  17. return &dummy_; // TODO: handle all game states
  18. case GameStates::Loading:
  19. return &loading_;
  20. case GameStates::Splash:
  21. return &splash_;
  22. case GameStates::MainMenu:
  23. return &menu_;
  24. case GameStates::Game:
  25. return &game_;
  26. case GameStates::GameOver:
  27. return &game_over_;
  28. }
  29. }
  30. GameState* GameStateManager::current()
  31. {
  32. if (states_.empty())
  33. return nullptr;
  34. return enum_to_state(states_.top());
  35. }
  36. GameState* GameStateManager::parent()
  37. {
  38. if (states_.size()<2)
  39. return nullptr;
  40. auto const current = states_.top();
  41. states_.pop();
  42. auto const parent = states_.top();
  43. states_.push(current);
  44. return enum_to_state(parent);
  45. }
  46. void GameStateManager::push_state(GameStates const new_state)
  47. {
  48. states_.push(new_state);
  49. current()->on_enter(*this);
  50. }
  51. void GameStateManager::pop_state()
  52. {
  53. auto const state = current();
  54. if (state!=nullptr) {
  55. state->on_leave();
  56. states_.pop();
  57. }
  58. }
  59. void GameStateManager::replace_state(GameStates const new_state)
  60. {
  61. pop_state();
  62. push_state(new_state);
  63. }