Game.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. * 2D Game Engine
  3. * Game.cpp: Base Game engine class
  4. * Based on pikuma.com 2D game engine in C++ and Lua course
  5. * Copyright (c) 2021 986-Studio. All Right Reserved
  6. *
  7. * Created by Manoël Trapier on 09/02/2021.
  8. */
  9. #include <SDL.h>
  10. #include <SDL_image.h>
  11. #include <glm/glm.hpp>
  12. #include <memory>
  13. #include <Game.h>
  14. #include <Logger.h>
  15. #include <ECS.h>
  16. #include <Components/Transform.h>
  17. #include <Components/RigidBody.h>
  18. #include <Systems/Movement.h>
  19. Game::Game()
  20. {
  21. this->isRunning = false;
  22. this->windowsHeight = 0;
  23. this->windowsWidth = 0;
  24. this->registry = std::make_unique<Registry>();
  25. }
  26. Game::~Game()
  27. {
  28. }
  29. void Game::Initialize()
  30. {
  31. int ret;
  32. SDL_DisplayMode displayMode;
  33. ret = SDL_Init(SDL_INIT_EVERYTHING);
  34. if (ret)
  35. {
  36. Logger::Critical("SDL Initialisation error.");
  37. return;
  38. }
  39. SDL_GetCurrentDisplayMode(0, &displayMode);
  40. this->windowsWidth = displayMode.w;
  41. this->windowsHeight = displayMode.h;
  42. this->window = SDL_CreateWindow(NULL, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
  43. this->windowsWidth, this->windowsHeight, SDL_WINDOW_BORDERLESS);
  44. if (!window)
  45. {
  46. Logger::Critical("SDL window creation error.");
  47. return;
  48. }
  49. this->renderer = SDL_CreateRenderer(window, -1, 0);
  50. if (!renderer)
  51. {
  52. Logger::Critical("SDL renderer creation error.");
  53. return;
  54. }
  55. SDL_SetWindowFullscreen(this->window, SDL_WINDOW_FULLSCREEN);
  56. this->isRunning = true;
  57. }
  58. void Game::Destroy()
  59. {
  60. if (this->renderer)
  61. {
  62. SDL_DestroyRenderer(this->renderer);
  63. }
  64. if (this->window)
  65. {
  66. SDL_DestroyWindow(this->window);
  67. }
  68. SDL_Quit();
  69. }
  70. void Game::Run()
  71. {
  72. this->Setup();
  73. while(this->isRunning)
  74. {
  75. this->ProcessInput();
  76. this->Update();
  77. this->Render();
  78. }
  79. }
  80. void Game::Setup()
  81. {
  82. this->registry->addSystem<MovementSystem>();
  83. Entity tank = this->registry->createEntity();
  84. tank.addComponent<TransformComponent>(glm::vec2(10, 30), glm::vec2(1, 1), 0);
  85. tank.addComponent<RigidBodyComponent>(glm::vec2(50, 0));
  86. }
  87. void Game::Update()
  88. {
  89. int32_t timeToWait = MILLISECS_PER_FRAME - (SDL_GetTicks() - this->millisecsPerviousFrame);
  90. if (timeToWait > 0 && timeToWait <= MILLISECS_PER_FRAME)
  91. {
  92. SDL_Delay(timeToWait);
  93. }
  94. double deltaTime = (SDL_GetTicks() - this->millisecsPerviousFrame) / 1000.0;
  95. this->millisecsPerviousFrame = SDL_GetTicks();
  96. registry->getSystem<MovementSystem>().update(deltaTime);
  97. registry->update();
  98. }
  99. void Game::ProcessInput()
  100. {
  101. SDL_Event event;
  102. while(SDL_PollEvent(&event))
  103. {
  104. switch(event.type)
  105. {
  106. case SDL_QUIT:
  107. this->isRunning = false;
  108. break;
  109. case SDL_KEYDOWN:
  110. if (event.key.keysym.sym == SDLK_ESCAPE)
  111. {
  112. this->isRunning = false;
  113. }
  114. break;
  115. default:
  116. break;
  117. }
  118. }
  119. }
  120. void Game::Render()
  121. {
  122. SDL_SetRenderDrawColor(this->renderer, 21, 21, 21, 255);
  123. SDL_RenderClear(this->renderer);
  124. // Do something here
  125. SDL_RenderPresent(this->renderer);
  126. }