Skip to content

Instantly share code, notes, and snippets.

@andresfelipemendez
Created March 20, 2019 16:07
Show Gist options
  • Select an option

  • Save andresfelipemendez/2c31204986faee45d7ce49b02d228ae7 to your computer and use it in GitHub Desktop.

Select an option

Save andresfelipemendez/2c31204986faee45d7ce49b02d228ae7 to your computer and use it in GitHub Desktop.
#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