728x90
반응형
카메라
2D게임에서의 카메라는 3D환경에서의 카메라와 달리 불러온 이미지에서의 영역을 이동하는것에 불과하다. 예를 들자면 800x600의 게임 화면에서 100만큼 이동시키는것은 (100,100)의 좌표에 있는 것들을 우리 화면(0,0)으로 옮기는것에 불과하다는 뜻이다. 상용엔진에서 카메라는 Component를 만들어 카메라를 관리한다.
카메라 Component 생성
카메라는 게임의 장르에 따라 달라진다. 이 포스트에서는 플레이어를 따라가는 카메라를 구현하고자 한다.
Component에 자신을 붙일 엑터를 가르키는 owner를 만든다.
class Component
{
public:
Actor* GetOwner() { return _owner; }
void SetOwner(Actor* owner) { _owner=owner; }
protected:
Actor* _owner = nullptr;
};
Component를 상속받는 CameraComponent를 생성한다.
class Actor;
class CameraComponent: public Component
{
public:
CameraComponent();
virtual ~CameraComponent();
public:
virtual void BeginPlay()override;
virtual void TickComponent()ovrride;
virtual void Render(HDC hdc)ovrride;
};
자신을 붙인 Actor에게 위치를 알려준다. 이때 위치를 보정하여 이미지를 초과하지 않게 조정한다.
//CameraComponent.cpp
void CameraComponent::TickComponent()
{
if (_owner == nullptr)return;
Vec2 pos = _owner->Getpos();
pos.x = ::clamp(pos.x, 400.f, 3024.f - 400.f);
pos.y = ::clamp(pos.y, 300.f, 2064.f - 300.f);
GET_SINGLE(SceneManager)->SetCameraPos(pos);
}
Component를 붙일수 있게 Actor에서 AddComponent를 생성해준다.
//Actor.h
class Component;
class Actor
{
public:
void AddComponent(Component* component);
void RemoveComponent(Component* component);
protected:
Vec2 _pos = { 0,0 };
vector<Component*>_compo;
};
void Actor::AddComponent(Component* component)
{
if (component == nullptr)return;
component->SetOwner(this);
_compo.push_back(component);
}
void Actor::RemoveComponent(Component* component)
{
auto it = find(_compo.begin(), _compo.end(), component);
if (it == _compo.end())return;
_compo.erase(it);
}
void Actor::BeginPlay()//가지고 있는 모든 Component에 대해 실행시킨다.
{
for (Component* com : _compo)
{
com->BeginPlay();
}
}
void Actor::Tick()
{
for (Component* com : _compo)
{
com->TickComponent();
}
}
void Actor::Render(HDC hdc)
{
for (Component* com : _compo)
{
com->Render(hdc);
}
}
카메라를 플레이어에게 붙여준다.
Player::Player()
{
CameraComponent* camera = new CameraComponent();
AddComponent(camera);
}
카메라의 위치를 Scene에서 관리한다.
//Sence.h
public:
void SetCameraPos(Vec2 pos) { _cameraPos = pos; }
Vec2 GetCameraPos() { return _cameraPos; }
private:
Vec2 _cameraPos = { 0,0 };
카메라가 준비 되었다면 각각의 Actor(배경/캐릭터)에 카메라 위치에 따른 랜더링을 적용한다.
Vec2 Camera=GET_SINGLE(SceneManager)->GetCameraPos();
::TransparentBlt
(
hdc,
(int32)_pos.x-size.x/2-(Camera.x-GWinSizeX/2),
(int32)_pos.y-size.y/2-(Camera.y-GWinSizeY/2),
size.x,
size.y,
_sprite->GetDC(),
_sprite->GetPos().x,
_sprite->GetPos().y,
_sprite->GetSize().x,
_sprite->GetSize().y,
_sprite->GetTransparent()
);
728x90
반응형
'게임엔진 > 윈도우API' 카테고리의 다른 글
윈도우API)18.충돌-1 (0) | 2023.01.25 |
---|---|
윈도우API)17.타일맵 (0) | 2023.01.24 |
윈도우API)13.플립북 애니메이션 (0) | 2022.12.24 |
윈도우API)12. 모작 (1) | 2022.12.23 |
윈도우API)11. 역삼각함수 (0) | 2022.12.23 |
댓글