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;
}
반응형