GameStateManager.cxx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. }
  27. }
  28. GameState* GameStateManager::current()
  29. {
  30. if (states_.empty())
  31. return nullptr;
  32. return enum_to_state(states_.top());
  33. }
  34. GameState* GameStateManager::parent()
  35. {
  36. if (states_.size()<2)
  37. return nullptr;
  38. auto const current = states_.top();
  39. states_.pop();
  40. auto const parent = states_.top();
  41. states_.push(current);
  42. return enum_to_state(parent);
  43. }
  44. void GameStateManager::push_state(GameStates const new_state)
  45. {
  46. states_.push(new_state);
  47. current()->on_enter(*this);
  48. }
  49. void GameStateManager::pop_state()
  50. {
  51. auto const state = current();
  52. if (state!=nullptr) {
  53. state->on_leave();
  54. states_.pop();
  55. }
  56. }
  57. void GameStateManager::replace_state(GameStates const new_state)
  58. {
  59. pop_state();
  60. push_state(new_state);
  61. }