Game Programming in C++
Game Programming in C++ Chapter1 - paddle 및 ball 추가
skyho
2025. 8. 17. 02:20
반응형

책의 소스 코드를 직접 작성해보면서 정리한 글입니다. (실습환경: windows)
책 소스 코드: GitHub - gameprogcpp/code: Game Programming in C++ Code
1. paddle, ball
앞에서 그렸던 wall은 고정된 위치에 그렸었다.
하지만 paddle과 ball은 시시각각 그 위치가 달라질 것이다. 따라서 그 위치(x, y)를 기록할 자료구조가 필요하다.
struct Vector2
{
float x, y;
};
paddle은 세로로 긴 막대 형태이다.
paddle의 높이를 나타내는 변수(_paddle_h)를 추가하고, paddle의 폭은 벽 두께(thickness)와 동일한 값으로 설정한다.

paddle을 그릴 때, 유의사항이 있다.
a. 왼쪽에 바짝 붙이지 않을 것.
b. paddle.y값이 paddle의 위쪽을 가리키도록 수정할 것.

2. Game.hpp
Vector2 구조체를 추가하고, paddle과 ball 위치를 기억할 변수(_paddle_pos, _ball_pos)를 추가한다.
paddle 높이 변수(_paddle_h)를 추가한다.
#include "SDL3/SDL.h"
struct Vector2
{
float x, y;
};
class Game
{
public:
...(생략)...
private:
...(생략)...
Vector2 _paddle_pos; // paddle 위치
Vector2 _ball_pos; // ball 위치
const float _paddle_h; // paddle 높이
};
3. Game.cpp
생성자에서 paddle 높이(_paddle_h) 값을 초기화한다.
Game::Game() : _sdl_window(nullptr), _w(1024), _h(768), _running(true), _sdl_renderer(nullptr),
_thickness(15.0f), _paddle_h(100.0f)
{
}
initialize()에서 paddle과 ball의 위치변수(_paddle_pos, _ball_pos)를 초기화 한다.
초기값은 게임을 시작할 때, paddle과 ball을 그려야할 위치이다.
bool Game::initialize(int w, int h)
{
bool sdl_result = SDL_Init(SDL_INIT_VIDEO);
if (!sdl_result)
{
SDL_Log("Unable to initialize SDL[%d]: [%s]", sdl_result, SDL_GetError());
return false;
}
_sdl_window = SDL_CreateWindow(
"Game Programming in C++ (Chapter 1)", // Window title
w, // Width of window
h, // Height of window
0 // Flags (0 for no flags set)
);
if (_sdl_window == nullptr)
{
SDL_Log("Failed to create window: %s", SDL_GetError());
return false;
}
_sdl_renderer = SDL_CreateRenderer( //SDL_CreateRenderer is changed in SDL3
_sdl_window,
NULL // the name of rendering driver to init, if it is NULL, SDLL will choose one.
);
if (_sdl_renderer == nullptr)
{
SDL_Log("Failed to create renderer: %s", SDL_GetError());
return false;
}
_w = w;
_h = h;
_ball_pos.x = static_cast<float>(w) / 2.0f;
_ball_pos.y = static_cast<float>(h) / 2.0f;
_paddle_pos.x = 10.0f;
_paddle_pos.y = static_cast<float>(h) / 2.0f;
return true;
}
generateOuput()에서 paddle과 ball을 그린다.
void Game::generateOutput()
{
//set draw color to blue
SDL_SetRenderDrawColor(
_sdl_renderer,
0, //R
0, //G
255, //B
SDL_ALPHA_OPAQUE // 투명도(transparency) / 255 = 완전한 색, 0 = 완전히 투명
);
// blue 색상으로 전체를 칠한다
SDL_RenderClear(_sdl_renderer);
//draw color to white
SDL_SetRenderDrawColor(_sdl_renderer, 255, 255, 255, 255);
SDL_FRect wall{
0.0f, //top of left x
0.0f, //top of left y
static_cast<float>(_w), //width
_thickness //high
};
//top wall
SDL_RenderFillRect(_sdl_renderer, &wall);
//bottom wall
wall.y = static_cast<float>(_h) - _thickness;
SDL_RenderFillRect(_sdl_renderer, &wall);
//right wall
wall.x = static_cast<float>(_w) - _thickness;
wall.y = 0;
wall.w = _thickness;
wall.h = static_cast<float>(_h);
SDL_RenderFillRect(_sdl_renderer, &wall);
//paddle
SDL_FRect paddle{
_paddle_pos.x,
_paddle_pos.y - _paddle_h / 2,
_thickness,
_paddle_h
};
SDL_RenderFillRect(_sdl_renderer, &paddle);
//ball
SDL_FRect ball{
_ball_pos.x - _thickness / 2,
_ball_pos.y - _thickness / 2,
_thickness,
_thickness
};
SDL_RenderFillRect(_sdl_renderer, &ball);
//렌더링한 화면을 출력한다.
SDL_RenderPresent(_sdl_renderer);
}
4. 결과

반응형