GameStateManager.cxx 1.4 KB

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