MenuState.cxx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include "MenuState.hxx"
  2. #include "PlayingState.hxx"
  3. #include "GameStateManager.hxx"
  4. #include "../SDLRenderer.hxx"
  5. void MenuState::on_enter(GameStateManager& gsm)
  6. {
  7. game_.reset();
  8. if (auto const parent = gsm.parent(); parent!=nullptr) {
  9. if (auto const game = dynamic_cast<PlayingState*>(parent); game!=nullptr) {
  10. game_ = game;
  11. }
  12. }
  13. new_game_button_.set_on_click([&gsm] {
  14. if (gsm.parent()!=nullptr)
  15. gsm.pop_state();
  16. gsm.replace_state(GameStates::Game);
  17. });
  18. continue_button_.set_on_click([&gsm] {
  19. gsm.pop_state();
  20. });
  21. high_score_button_.set_on_click([&gsm] {
  22. gsm.push_state(GameStates::HighScores);
  23. });
  24. credits_button_.set_on_click([&gsm] {
  25. gsm.push_state(GameStates::Credits);
  26. });
  27. quit_button_.set_on_click([&gsm] {
  28. while (gsm.current()!=nullptr) {
  29. gsm.pop_state();
  30. }
  31. });
  32. SDL_ShowCursor(SDL_ENABLE);
  33. }
  34. void MenuState::on_event(GameStateManager& gsm, SDL_Event const& evt)
  35. {
  36. if (evt.type==SDL_KEYUP) {
  37. switch (evt.key.keysym.scancode) {
  38. default:
  39. break;
  40. case SDL_SCANCODE_PAUSE:
  41. if (gsm.parent()==nullptr)
  42. break;
  43. [[fallthrough]];
  44. case SDL_SCANCODE_ESCAPE:
  45. gsm.pop_state();
  46. break;
  47. }
  48. }
  49. }
  50. void MenuState::update(GameStateManager& gsm, std::chrono::milliseconds delta_time)
  51. {
  52. (void) delta_time;
  53. continue_button_.set_visible(gsm.parent()!=nullptr);
  54. new_game_button_.update();
  55. continue_button_.update();
  56. high_score_button_.update();
  57. credits_button_.update();
  58. quit_button_.update();
  59. }
  60. void MenuState::render(SDLRenderer& renderer)
  61. {
  62. int screen_w, screen_h;
  63. SDL_GetRendererOutputSize(renderer, &screen_w, &screen_h);
  64. int const button_count = continue_button_.is_visible() ? 5 : 4;
  65. int const x = (screen_w-BUTTON_WIDTH)/2;
  66. int y = (screen_h-(button_count*BUTTON_HEIGHT+(button_count-1)*20))/2;
  67. new_game_button_.move(x, y);
  68. if (continue_button_.is_visible()) {
  69. continue_button_.move(x, y += BUTTON_HEIGHT+20);
  70. }
  71. high_score_button_.move(x, y += BUTTON_HEIGHT+20);
  72. credits_button_.move(x, y += BUTTON_HEIGHT+20);
  73. quit_button_.move(x, y+BUTTON_HEIGHT+20);
  74. SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
  75. SDL_RenderClear(renderer);
  76. if (game_.has_value()) {
  77. game_.value()->render_game(renderer, false);
  78. }
  79. SDL_SetRenderDrawColor(renderer, 0, 0, 0, 200);
  80. SDL_RenderFillRect(renderer, nullptr);
  81. new_game_button_.render(renderer);
  82. continue_button_.render(renderer);
  83. high_score_button_.render(renderer);
  84. credits_button_.render(renderer);
  85. quit_button_.render(renderer);
  86. SDL_RenderPresent(renderer);
  87. }
  88. void MenuState::on_leave()
  89. {
  90. SDL_ShowCursor(SDL_DISABLE);
  91. }