액터 정의:
Object와의 비교:
Init과 Update:
실수 교훈:
SpriteActor란?
필요성:
클래스 구조:
SpriteActor는 Actor 클래스를 상속받아 필요한 기능을 추가.렌더링 처리:
_pos.x - size.x / 2 등)은 정확한 배치를 위해 필수적.개발 씬 역할:
Init에서 Actor 추가:
Update 처리:
배경화면 렌더링:
_background라는 이름으로 SpriteActor를 생성하여 Stage01 파일을 로드.렌더링 로직:
결과:
문제:
해결 방법:
Component란?
Component의 부모 클래스:
05.Component라는 이름으로 클래스 작성.기본 구현:
컴포넌트와 GameObject의 관계:
컴포넌트 추가 로직:
SpriteRenderer:
구현 내용:
GameObject 생성:
렌더링:
결과:
Actor 클래스Actor.hclass Actor
{
public:
Actor();
virtual ~Actor();
virtual void BeginPlay();
virtual void Tick();
virtual void Render(HDC hdc);
void SetPos(Vec2 pos) { _pos = pos; }
Vec2 GetPos() { return _pos; }
protected:
Vec2 _pos = { 0,0 };
};
Actor는 언리얼 엔진의 Actor를 모방하여 구현된 클래스.BeginPlay: 객체가 생성된 후 초기화를 처리.Tick: 매 프레임 갱신 로직을 정의.Render: 화면에 객체를 렌더링._pos: 2D 벡터로 표현되는 객체의 위치.Actor.cppActor::Actor() {}
Actor::~Actor() {}
void Actor::BeginPlay() {}
void Actor::Tick() {}
void Actor::Render(HDC hdc) {}
BeginPlay, Tick, Render는 기본적으로 비어 있으며, 파생 클래스에서 구체적인 동작을 오버라이드하도록 설계.SpriteActor 클래스SpriteActor.hclass SpriteActor : public Actor
{
using Super = Actor;
public:
SpriteActor();
virtual ~SpriteActor();
virtual void BeginPlay() override;
virtual void Tick() override;
virtual void Render(HDC hdc) override;
void SetSprite(Sprite* sprite) { _sprite = sprite; }
protected:
Sprite* _sprite = nullptr;
};
SpriteActor는 Actor를 상속받아, 스프라이트를 렌더링하는 기능을 추가._sprite는 렌더링할 스프라이트를 저장.SetSprite를 통해 스프라이트를 설정.SpriteActor.cppvoid SpriteActor::Render(HDC hdc)
{
Super::Render(hdc);
if (_sprite == nullptr) return;
Vec2Int size = _sprite->GetSize();
::BitBlt(
hdc,
(int32)_pos.x - size.x / 2,
(int32)_pos.y - size.y / 2,
size.x,
size.y,
_sprite->GetDC(),
_sprite->GetPos().x,
_sprite->GetPos().y,
SRCCOPY
);
}
Actor)의 Render를 호출._sprite가 설정되어 있지 않으면 렌더링을 생략.BitBlt 함수:hdc)에 스프라이트를 렌더링._pos를 기준으로 스프라이트를 중앙에 배치.Player 클래스Player.hclass Player : public SpriteActor
{
using Super = SpriteActor;
public:
Player();
virtual ~Player() override;
virtual void BeginPlay() override;
virtual void Tick() override;
virtual void Render(HDC hdc) override;
};
Player는 SpriteActor를 상속받아 플레이어의 동작을 정의.BeginPlay, Tick, Render는 플레이어 객체의 초기화, 갱신, 렌더링을 처리.Player.cppvoid Player::Tick()
{
Super::Tick();
// TODO: 플레이어 이동 및 미사일 발사 기능 구현
}
SpriteActor)의 Tick 호출 후, 플레이어 전용 로직을 추가.GameObject와 ComponentGameObject 클래스GameObject.hclass GameObject
{
public:
void AddComponent(Component* component);
protected:
vector<Component*> _components;
};
GameObject는 유니티의 GameObject와 유사한 역할.AddComponent 함수는 컴포넌트를 추가.GameObject.cppvoid GameObject::Update()
{
for (Component* component : _components)
{
component->Update();
}
}
Update를 호출.Component 클래스Component.hclass Component
{
public:
virtual void Start();
virtual void Update();
virtual void Render(HDC hdc);
};
Component는 GameObject에 부착 가능한 부품으로, 행동 단위를 정의.SpriteRenderer와 PlayerMoveScriptSpriteRenderervoid SpriteRenderer::Render(HDC hdc)
{
if (_sprite == nullptr) return;
Vec2Int size = _sprite->GetSize();
::BitBlt(
hdc,
0,
0,
size.x,
size.y,
_sprite->GetDC(),
_sprite->GetPos().x,
_sprite->GetPos().y,
SRCCOPY
);
}
PlayerMoveScriptvoid PlayerMoveScript::Update()
{
// TODO: 플레이어 이동 로직 추가
}
DevScene 클래스Init 메서드Sprite* sprite = GET_SINGLE(ResourceManager)->GetSprite(L"Stage01");
SpriteActor* background = new SpriteActor();
background->SetSprite(sprite);
_background = background;
Stage01 스프라이트를 로드하고 배경으로 설정._background->Tick();
_player->Tick();
_go->Update();
_background->Render(hdc);
_player->Render(hdc);
_go->Render(hdc);