main.cxx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "SDL.hxx"
  2. #include "SDLWindow.hxx"
  3. #include "SDLRenderer.hxx"
  4. #include "game/AssetManager.hxx"
  5. #include "game/GameStateManager.hxx"
  6. #include <cstdlib>
  7. void main_loop(SDLWindow& window, SDLRenderer& renderer)
  8. {
  9. using namespace std::chrono;
  10. AssetManager am{renderer};
  11. GameStateManager gsm{window};
  12. auto start = high_resolution_clock::now();
  13. for (;;) {
  14. SDL_Event evt;
  15. while (SDL_PollEvent(&evt)!=0) {
  16. switch (evt.type) {
  17. default:
  18. break;
  19. case SDL_QUIT:
  20. return;
  21. case SDL_CONTROLLERDEVICEADDED:
  22. SDL::instance().add_controller(evt.cdevice.which);
  23. break;
  24. case SDL_CONTROLLERDEVICEREMOVED:
  25. SDL::instance().remove_controller(evt.cdevice.which);
  26. break;
  27. }
  28. if (evt.type==SDL_QUIT)
  29. return;
  30. if (auto const state = gsm.current(); state!=nullptr)
  31. state->on_event(gsm, evt);
  32. else
  33. return;
  34. }
  35. auto const end = high_resolution_clock::now();
  36. auto const delta_time = duration_cast<milliseconds>(end-start);
  37. start = end;
  38. if (auto const state = gsm.current(); state!=nullptr)
  39. state->update(gsm, delta_time);
  40. else
  41. return;
  42. if (auto const state = gsm.current(); state!=nullptr)
  43. state->render(renderer);
  44. else
  45. return;
  46. }
  47. }
  48. int main(int argc, char** argv) try
  49. {
  50. SDL sdl{};
  51. SDLWindow window{
  52. "Snake",
  53. SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
  54. 0, 0,
  55. SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_BORDERLESS
  56. };
  57. SDLRenderer renderer{window};
  58. main_loop(window, renderer);
  59. return EXIT_SUCCESS;
  60. } catch (std::exception const& ex) {
  61. SDL_LogError(SDL_LOG_CATEGORY_ERROR, "%s", ex.what());
  62. return EXIT_FAILURE;
  63. }