GameOverState.cxx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "GameOverState.hxx"
  2. #include "GameStateManager.hxx"
  3. #include "HighScoreManager.hxx"
  4. #include "../SDLRenderer.hxx"
  5. GameOverState::GameOverState()
  6. :font_{"kenney_pixel.ttf"}
  7. {
  8. }
  9. void GameOverState::on_enter(GameStateManager& gsm)
  10. {
  11. SDL_ShowCursor(SDL_ENABLE);
  12. if (HighScoreManager::instance().has_new_score()) {
  13. name_input_.set_focus(true);
  14. name_input_.set_value("Anon");
  15. name_input_.set_visible(true);
  16. }
  17. else {
  18. name_input_.set_focus(false);
  19. name_input_.set_value("");
  20. name_input_.set_visible(false);
  21. }
  22. ok_button_.set_on_click([&gsm, this] {
  23. HighScoreManager::instance().provide_name_for_new_score(name_input_.value());
  24. gsm.replace_state(GameStates::MainMenu);
  25. });
  26. }
  27. void GameOverState::on_leave()
  28. {
  29. SDL_StopTextInput();
  30. SDL_ShowCursor(SDL_DISABLE);
  31. }
  32. void GameOverState::on_event(GameStateManager& gsm, SDL_Event const& evt)
  33. {
  34. name_input_.on_event(evt);
  35. if (evt.type==SDL_KEYUP) {
  36. switch (evt.key.keysym.scancode) {
  37. default:
  38. break;
  39. case SDL_SCANCODE_RETURN:
  40. HighScoreManager::instance().provide_name_for_new_score(name_input_.value());
  41. [[fallthrough]];
  42. case SDL_SCANCODE_ESCAPE:
  43. gsm.replace_state(GameStates::MainMenu);
  44. break;
  45. }
  46. }
  47. }
  48. void GameOverState::update(GameStateManager& gsm, std::chrono::milliseconds const delta_time)
  49. {
  50. ok_button_.update();
  51. name_input_.update(delta_time);
  52. }
  53. void GameOverState::render(SDLRenderer& renderer)
  54. {
  55. int width, height;
  56. SDL_GetRendererOutputSize(renderer, &width, &height);
  57. SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
  58. SDL_RenderClear(renderer);
  59. int base_y;
  60. if (HighScoreManager::instance().has_new_score()) {
  61. auto const score_text = std::format("Congratulations, you made it to the top 10!\nPlease enter your name:");
  62. SDL_Surface* text_surface = TTF_RenderText_Solid_Wrapped(font_, score_text.c_str(),
  63. {255, 255, 255, SDL_ALPHA_OPAQUE}, 0);
  64. SDL_Texture* text = SDL_CreateTextureFromSurface(renderer, text_surface);
  65. SDL_FreeSurface(text_surface);
  66. int text_width, text_height;
  67. SDL_QueryTexture(text, nullptr, nullptr, &text_width, &text_height);
  68. // some up-scaling
  69. text_width *= 2;
  70. text_height *= 2;
  71. base_y = (height-(text_height+name_input_.get_bounding_box().h+ok_button_.get_bounding_box().h+30))/2;
  72. SDL_Rect render_quad = {(width-text_width)/2, base_y, text_width, text_height};
  73. SDL_RenderCopy(renderer, text, nullptr, &render_quad);
  74. SDL_DestroyTexture(text);
  75. name_input_.move((width-name_input_.get_bounding_box().w)/2, base_y += (text_height+20));
  76. name_input_.render(renderer);
  77. base_y += name_input_.get_bounding_box().h+10;
  78. }
  79. else {
  80. auto const score_text = std::format("Game over!");
  81. SDL_Surface* text_surface = TTF_RenderText_Solid_Wrapped(font_, score_text.c_str(),
  82. {255, 255, 255, SDL_ALPHA_OPAQUE}, 0);
  83. SDL_Texture* text = SDL_CreateTextureFromSurface(renderer, text_surface);
  84. SDL_FreeSurface(text_surface);
  85. int text_width, text_height;
  86. SDL_QueryTexture(text, nullptr, nullptr, &text_width, &text_height);
  87. // some up-scaling
  88. text_width *= 2;
  89. text_height *= 2;
  90. base_y = (height-(text_height+ok_button_.get_bounding_box().h+20))/2;
  91. SDL_Rect render_quad = {(width-text_width)/2, base_y, text_width, text_height};
  92. SDL_RenderCopy(renderer, text, nullptr, &render_quad);
  93. SDL_DestroyTexture(text);
  94. base_y += text_height+20;
  95. }
  96. ok_button_.move((width-ok_button_.get_bounding_box().w)/2, base_y);
  97. ok_button_.render(renderer);
  98. SDL_RenderPresent(renderer);
  99. }