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

paddle을 그릴 때, 유의사항이 있다.

a. 왼쪽에 바짝 붙이지 않을 것. 

b. paddle.y값이 paddle의 위쪽을 가리키도록 수정할 것.

drawing 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. 결과

program output

반응형