GameStateManager.cxx 1.5 KB

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