SplashState.cxx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "SplashState.hxx"
  2. #include "AssetManager.hxx"
  3. #include "GameStateManager.hxx"
  4. using namespace std::chrono_literals;
  5. void SplashState::on_event(GameStateManager& gsm, SDL_Event const& evt)
  6. {
  7. switch (evt.type) {
  8. default:
  9. break;
  10. case SDL_KEYUP:
  11. switch (evt.key.keysym.scancode) {
  12. default:
  13. break;
  14. case SDL_SCANCODE_SPACE:
  15. [[fallthrough]];
  16. case SDL_SCANCODE_RETURN:
  17. [[fallthrough]];
  18. case SDL_SCANCODE_ESCAPE:
  19. gsm.replace_state(GameStates::MainMenu);
  20. break;
  21. }
  22. break;
  23. case SDL_CONTROLLERBUTTONUP:
  24. switch (evt.cbutton.button) {
  25. default:
  26. break;
  27. case SDL_CONTROLLER_BUTTON_A:
  28. [[fallthrough]];
  29. case SDL_CONTROLLER_BUTTON_B:
  30. [[fallthrough]];
  31. case SDL_CONTROLLER_BUTTON_START:
  32. gsm.replace_state(GameStates::MainMenu);
  33. break;
  34. }
  35. break;
  36. }
  37. }
  38. void SplashState::update(GameStateManager& gsm, std::chrono::milliseconds delta_time)
  39. {
  40. time_in_state_ += delta_time;
  41. if (time_in_state_>13'000ms)
  42. gsm.replace_state(GameStates::MainMenu);
  43. }
  44. void SplashState::render(SDLRenderer& renderer)
  45. {
  46. if (time_in_state_>=2'000ms && time_in_state_<11'000ms) {
  47. if (time_in_state_<4'000ms) {
  48. auto const progress = static_cast<float>(time_in_state_.count()-2'000)/2'000.0f;
  49. auto const alpha = static_cast<int>(std::lerp(SDL_ALPHA_TRANSPARENT, SDL_ALPHA_OPAQUE, progress));
  50. SDL_SetTextureAlphaMod(logo_, alpha);
  51. }
  52. else if (time_in_state_>=4'000ms && time_in_state_<9'000ms) {
  53. SDL_SetTextureAlphaMod(logo_, SDL_ALPHA_OPAQUE);
  54. }
  55. else if (time_in_state_>=9'000ms) {
  56. auto const progress = static_cast<float>(time_in_state_.count()-9'000)/2'000.0f;
  57. auto const alpha = static_cast<int>(std::lerp(SDL_ALPHA_OPAQUE, SDL_ALPHA_TRANSPARENT, progress));
  58. SDL_SetTextureAlphaMod(logo_, alpha);
  59. }
  60. int screen_w, screen_h;
  61. SDL_GetRendererOutputSize(renderer, &screen_w, &screen_h);
  62. int logo_w, logo_h;
  63. SDL_QueryTexture(logo_, nullptr, nullptr, &logo_w, &logo_h);
  64. float const logo_aspect = static_cast<float>(logo_w)/static_cast<float>(logo_h);
  65. float const screen_aspect = static_cast<float>(screen_w-20)/static_cast<float>(screen_h-20);
  66. int put_w, put_h;
  67. if (logo_aspect>screen_aspect) {
  68. put_w = (screen_w-20);
  69. put_h = static_cast<int>(static_cast<float>(put_w)/logo_aspect);
  70. }
  71. else {
  72. put_h = screen_h-20;
  73. put_w = static_cast<int>(static_cast<float>(put_h)*logo_aspect);
  74. }
  75. SDL_Rect const logo_rect = {
  76. .x = (screen_w-put_w)/2,
  77. .y = (screen_h-put_h)/2,
  78. .w = put_w,
  79. .h = put_h
  80. };
  81. SDL_RenderCopy(renderer, logo_, nullptr, &logo_rect);
  82. }
  83. }
  84. void SplashState::on_enter(GameStateManager& gsm)
  85. {
  86. auto& am = AssetManager::instance();
  87. time_in_state_ = 0ms;
  88. logo_ = am.get_texture_asset("logo.jpg");
  89. SDL_SetTextureBlendMode(logo_, SDL_BLENDMODE_BLEND);
  90. SDL_SetWindowIcon(gsm.window(), am.get_surface_asset("snake-icon.png"));
  91. }