GameStateManager.cxx 1.5 KB

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