Game Programming in C++

Game Programming in C++ Chapter2 - Sprite Component

skyho 2025. 9. 6. 21:40
반응형

산자이 마드하브 저 / 박주항 역 ❘ 에이콘

 

책의 소스 코드를 직접 작성해보면서 정리한 글입니다. (실습환경: windows)

책 소스 코드: GitHub - gameprogcpp/code: Game Programming in C++ Code


1. Sprite 역할(기능)

Sprite Component는 Component Class를 상속받는다

기능 설명
Actor의 시각적 표현 담당 이미지(텍스처) 그리기

 

2. Sprite 생성 동작

Sprite는 생성될 때, Game Manager와 Actor 양쪽에 모두 등록된다.

이 과정은 Actor, Component를 통해서 이루어진다. 

  • Step 1
    Sprite를 생성하기 위해서는 Sprite를 소유할 Actor가 필요하다.
    따라서 Sprite를 생성할 때, 소유할 Actor를 전달한다.
    Actor는 Game Manager를 가지고 있으므로, 이를 통해 Sprite를 Game Manager에게 등록한다.
SpriteComponent::SpriteComponent(Actor* owner, int draw_order) : Component(owner), _draw_order(draw_order), _texture(nullptr),
	_texture_width(0), _texture_height(0)
{
	_owner->getGameManager()->addSprite(this);
}

 

  • Step 2
    Sprite는 Component를 상속받았다.
    따라서 Sprite를 생성하면, 자동으로 Component를 호출하게 되고, Component를 통해 Actor에게 등록된다.
Component::Component(Actor* owner) : _owner(owner)
{
	_owner->addComponent(this);
}

 

3. SpriteComponent.hpp

#pragma once

#include "SDL3/SDL.h"
#include "Component.hpp"

class SpriteComponent : public Component
{
public:
	// (Lower draw order corresponds with further back)
	SpriteComponent(class Actor* owner, int draw_order = 100);
	~SpriteComponent();

	virtual void setTexture(SDL_Texture* texture);
	virtual void draw(SDL_Renderer* renderer);
	const int getDrawOrder() const;

protected:
	SDL_Texture* _texture;
	float _texture_width;
	float _texture_height;
	int _draw_order;
};

 

4. SpriteComponent.cpp

#include "GameManager.hpp"
#include "Actor.hpp"
#include "SpriteComponent.hpp"

SpriteComponent::SpriteComponent(Actor* owner, int draw_order) : Component(owner), _draw_order(draw_order), _texture(nullptr),
	_texture_width(0), _texture_height(0)
{
	_owner->getGameManager()->addSprite(this);
}

SpriteComponent::~SpriteComponent()
{
	_owner->getGameManager()->removeSprite(this);
}

void SpriteComponent::setTexture(SDL_Texture* texture)
{
	_texture = texture;
	SDL_GetTextureSize(texture, &(_texture_width), &(_texture_height));
}

void SpriteComponent::draw(SDL_Renderer* renderer)
{
	if (!_texture) return;

	SDL_FRect r;
	Vector2 pos = _owner->getPosition();

	// Scale the width/height by owner's scale
	r.w = _texture_width * _owner->getscale();
	r.h = _texture_height * _owner->getscale();
	// Center the rectangle around the position of the owner
	r.x = static_cast<float>(pos.x) - (r.w / 2);
	r.y = static_cast<float>(pos.y) - (r.h / 2);

	// Draw
	SDL_RenderTexture(
		renderer,
		_texture,
		nullptr,
		&r
	);
}

const int SpriteComponent::getDrawOrder() const
{
	return _draw_order;
}

 

반응형