Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.25 KB | None | 0 0
  1. #include "Game.h"
  2. #include <SDL.h>
  3.  
  4. const float paddleH = 100.0f;
  5.  
  6. Game::Game()
  7. :mWindow(nullptr)
  8. ,mRenderer(nullptr)
  9. ,mIsRunning(true)
  10.  
  11. {
  12. mBallVel.x = -200.0f;
  13. mBallVel.y = 235.0f;
  14. }
  15.  
  16. bool Game::Initialize()
  17. {
  18. int sdlResult = SDL_Init(SDL_INIT_VIDEO);
  19. if (sdlResult != 0) {
  20. SDL_Log("Unable to initialize SDL: %s", SDL_GetError());
  21. return false;
  22. }
  23.  
  24. mWindow = SDL_CreateWindow(
  25. "Game Programming in C++ (Chapter1)",
  26. 100,
  27. 100,
  28. 1024,
  29. 768,
  30. 0
  31. );
  32.  
  33. if (!mWindow)
  34. {
  35. SDL_Log("Failed to create window: %s", SDL_GetError());
  36. return false;
  37. }
  38.  
  39. mRenderer = SDL_CreateRenderer(mWindow, -1, SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC);
  40. if (!mRenderer)
  41. {
  42. SDL_Log("Failed to create renderer: &s", SDL_GetError());
  43. return false;
  44. }
  45.  
  46. mPaddlePos.x = 10.0f;
  47. mPaddlePos.y = 768.0f / 2.0f;
  48.  
  49. mBallPos.x = 1024.0f / 2.0f;
  50. mBallPos.y = 768.0f / 2.0f;
  51.  
  52. return true;
  53. }
  54.  
  55. void Game::RunLoop()
  56. {
  57. while (mIsRunning)
  58. {
  59. ProcessInput();
  60. UpdateGame();
  61. GenerateOutput();
  62. }
  63. }
  64.  
  65. void Game::Shutdown()
  66. {
  67. SDL_DestroyWindow(mWindow);
  68. SDL_DestroyRenderer(mRenderer);
  69. SDL_Quit();
  70. }
  71.  
  72. Game::~Game()
  73. {
  74. }
  75.  
  76. void Game::ProcessInput()
  77. {
  78. SDL_Event event;
  79. mPaddleDir = 0;
  80. while (SDL_PollEvent(&event))
  81. {
  82. switch (event.type)
  83. {
  84. case SDL_QUIT:
  85. mIsRunning = false;
  86. break;
  87. default:
  88. break;
  89. }
  90. }
  91. const Uint8* state = SDL_GetKeyboardState(NULL);
  92. if (state[SDL_SCANCODE_ESCAPE])
  93. {
  94. mIsRunning = false;
  95. }
  96. if (state[SDL_SCANCODE_W])
  97. {
  98. mPaddleDir -= 1;
  99. }
  100. if (state[SDL_SCANCODE_S])
  101. {
  102. mPaddleDir += 1;
  103. }
  104.  
  105. }
  106.  
  107. void Game::UpdateGame()
  108. {
  109. while (!SDL_TICKS_PASSED(SDL_GetTicks(), mTicksCount + 16));
  110.  
  111. float deltaTime = (SDL_GetTicks() - mTicksCount) / 1000.0f;
  112.  
  113. if (deltaTime > 0.05f) {
  114. deltaTime = 0.05f;
  115. }
  116.  
  117. if (mPaddleDir != 0) {
  118. mPaddlePos.y += mPaddleDir * 300.0f*deltaTime;
  119. if (mPaddlePos.y < paddleH / 2.0f + thickness)
  120. {
  121. mPaddlePos.y = paddleH / 2.0f + thickness;
  122. }
  123. else if (mPaddlePos.y > (768.0f - paddleH / 2.0f - thickness))
  124. {
  125. mPaddlePos.y = 768.0f - paddleH / 2.0f - thickness;
  126. }
  127. }
  128.  
  129. mBallPos.x += mBallVel.x * deltaTime;
  130. mBallPos.y += mBallVel.y * deltaTime;
  131.  
  132. if (mBallPos.y <= thickness && mBallVel.y<0.0f)
  133. {
  134. mBallVel.y *= -1;
  135. }
  136.  
  137. if(mBallPos.y >= 768 - thickness && mBallVel.y > 0.0f)
  138. {
  139. mBallVel.y *= -1;
  140. }
  141.  
  142. if (mBallPos.x <= 0 && mBallVel.x < 0.0f)
  143. {
  144. mBallVel.x *= -1;
  145. }
  146.  
  147. if (mBallPos.x >= 1024.0f - thickness && mBallVel.x > 0.0f)
  148. {
  149. mBallVel.x *= -1;
  150. }
  151.  
  152.  
  153. mTicksCount = SDL_GetTicks();
  154. }
  155.  
  156. void Game::GenerateOutput()
  157. {
  158. SDL_SetRenderDrawColor(mRenderer, 0, 0, 100, 255);
  159.  
  160. SDL_RenderClear(mRenderer);
  161.  
  162. SDL_SetRenderDrawColor(mRenderer, 255, 255, 255, 255);
  163.  
  164. SDL_Rect wall{
  165. 0,0,1024,thickness
  166. };
  167. SDL_RenderFillRect(mRenderer, &wall);
  168.  
  169. wall.y = 768 - thickness;
  170. SDL_RenderFillRect(mRenderer, &wall);
  171.  
  172. wall.x = 1024 - thickness;
  173. wall.y = 0;
  174. wall.w = thickness;
  175. wall.h = 1024;
  176. SDL_RenderFillRect(mRenderer, &wall);
  177.  
  178. SDL_Rect paddle{
  179. static_cast<int>(mPaddlePos.x),
  180. static_cast<int>(mPaddlePos.y-paddleH/2),
  181. thickness,
  182. static_cast<int>(paddleH),
  183. };
  184. SDL_RenderFillRect(mRenderer, &paddle);
  185.  
  186. SDL_Rect ball{
  187. static_cast<int>(mBallPos.x - thickness / 2),
  188. static_cast<int>(mBallPos.y - thickness / 2),
  189. thickness,
  190. thickness
  191. };
  192.  
  193. SDL_RenderFillRect(mRenderer, &ball);
  194.  
  195.  
  196. SDL_RenderPresent(mRenderer);
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement