Created
March 20, 2019 16:07
-
-
Save andresfelipemendez/2c31204986faee45d7ce49b02d228ae7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include "Game.h" | |
| #include <SDL.h> | |
| const float paddleH = 100.0f; | |
| Game::Game() | |
| :mWindow(nullptr) | |
| ,mRenderer(nullptr) | |
| ,mIsRunning(true) | |
| { | |
| mBallVel.x = -200.0f; | |
| mBallVel.y = 235.0f; | |
| } | |
| bool Game::Initialize() | |
| { | |
| int sdlResult = SDL_Init(SDL_INIT_VIDEO); | |
| if (sdlResult != 0) { | |
| SDL_Log("Unable to initialize SDL: %s", SDL_GetError()); | |
| return false; | |
| } | |
| mWindow = SDL_CreateWindow( | |
| "Game Programming in C++ (Chapter1)", | |
| 100, | |
| 100, | |
| 1024, | |
| 768, | |
| 0 | |
| ); | |
| if (!mWindow) | |
| { | |
| SDL_Log("Failed to create window: %s", SDL_GetError()); | |
| return false; | |
| } | |
| mRenderer = SDL_CreateRenderer(mWindow, -1, SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC); | |
| if (!mRenderer) | |
| { | |
| SDL_Log("Failed to create renderer: &s", SDL_GetError()); | |
| return false; | |
| } | |
| mPaddlePos.x = 10.0f; | |
| mPaddlePos.y = 768.0f / 2.0f; | |
| mBallPos.x = 1024.0f / 2.0f; | |
| mBallPos.y = 768.0f / 2.0f; | |
| return true; | |
| } | |
| void Game::RunLoop() | |
| { | |
| while (mIsRunning) | |
| { | |
| ProcessInput(); | |
| UpdateGame(); | |
| GenerateOutput(); | |
| } | |
| } | |
| void Game::Shutdown() | |
| { | |
| SDL_DestroyWindow(mWindow); | |
| SDL_DestroyRenderer(mRenderer); | |
| SDL_Quit(); | |
| } | |
| Game::~Game() | |
| { | |
| } | |
| void Game::ProcessInput() | |
| { | |
| SDL_Event event; | |
| mPaddleDir = 0; | |
| while (SDL_PollEvent(&event)) | |
| { | |
| switch (event.type) | |
| { | |
| case SDL_QUIT: | |
| mIsRunning = false; | |
| break; | |
| default: | |
| break; | |
| } | |
| } | |
| const Uint8* state = SDL_GetKeyboardState(NULL); | |
| if (state[SDL_SCANCODE_ESCAPE]) | |
| { | |
| mIsRunning = false; | |
| } | |
| if (state[SDL_SCANCODE_W]) | |
| { | |
| mPaddleDir -= 1; | |
| } | |
| if (state[SDL_SCANCODE_S]) | |
| { | |
| mPaddleDir += 1; | |
| } | |
| } | |
| void Game::UpdateGame() | |
| { | |
| while (!SDL_TICKS_PASSED(SDL_GetTicks(), mTicksCount + 16)); | |
| float deltaTime = (SDL_GetTicks() - mTicksCount) / 1000.0f; | |
| if (deltaTime > 0.05f) { | |
| deltaTime = 0.05f; | |
| } | |
| if (mPaddleDir != 0) { | |
| mPaddlePos.y += mPaddleDir * 300.0f*deltaTime; | |
| if (mPaddlePos.y < paddleH / 2.0f + thickness) | |
| { | |
| mPaddlePos.y = paddleH / 2.0f + thickness; | |
| } | |
| else if (mPaddlePos.y > (768.0f - paddleH / 2.0f - thickness)) | |
| { | |
| mPaddlePos.y = 768.0f - paddleH / 2.0f - thickness; | |
| } | |
| } | |
| mBallPos.x += mBallVel.x * deltaTime; | |
| mBallPos.y += mBallVel.y * deltaTime; | |
| if (mBallPos.y <= thickness && mBallVel.y<0.0f) | |
| { | |
| mBallVel.y *= -1; | |
| } | |
| if(mBallPos.y >= 768 - thickness && mBallVel.y > 0.0f) | |
| { | |
| mBallVel.y *= -1; | |
| } | |
| if (mBallPos.x <= 0 && mBallVel.x < 0.0f) | |
| { | |
| mBallVel.x *= -1; | |
| } | |
| if (mBallPos.x >= 1024.0f - thickness && mBallVel.x > 0.0f) | |
| { | |
| mBallVel.x *= -1; | |
| } | |
| mTicksCount = SDL_GetTicks(); | |
| } | |
| void Game::GenerateOutput() | |
| { | |
| SDL_SetRenderDrawColor(mRenderer, 0, 0, 100, 255); | |
| SDL_RenderClear(mRenderer); | |
| SDL_SetRenderDrawColor(mRenderer, 255, 255, 255, 255); | |
| SDL_Rect wall{ | |
| 0,0,1024,thickness | |
| }; | |
| SDL_RenderFillRect(mRenderer, &wall); | |
| wall.y = 768 - thickness; | |
| SDL_RenderFillRect(mRenderer, &wall); | |
| wall.x = 1024 - thickness; | |
| wall.y = 0; | |
| wall.w = thickness; | |
| wall.h = 1024; | |
| SDL_RenderFillRect(mRenderer, &wall); | |
| SDL_Rect paddle{ | |
| static_cast<int>(mPaddlePos.x), | |
| static_cast<int>(mPaddlePos.y-paddleH/2), | |
| thickness, | |
| static_cast<int>(paddleH), | |
| }; | |
| SDL_RenderFillRect(mRenderer, &paddle); | |
| SDL_Rect ball{ | |
| static_cast<int>(mBallPos.x - thickness / 2), | |
| static_cast<int>(mBallPos.y - thickness / 2), | |
| thickness, | |
| thickness | |
| }; | |
| SDL_RenderFillRect(mRenderer, &ball); | |
| SDL_RenderPresent(mRenderer); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment