728x90
클래스 개요도 란, 코드의 객체 설계도와 같다고 생각하면 된다.
손으로 프로그램을동작시킨다면 어떻게 동작할까? 라는 생각으로 작성하면 쉽게 작성할 수 있다.
객체의 응용에서, 데이터의 주고받음에 따라 에니메이션을 다르게 송출해보았다.
이제. 몬스터의 객체 위에 HP바를 띄우고, 공격받을 때 마다 HP를 조절하여 표시하게 해보자.
class ProgressBar : public Quad
{
public:
ProgressBar(wstring frontImageFile, wstring backImageFile);
~ProgressBar();
void Render();
void SetAmount(float value);
private:
Texture* backImage;
FloatValueBuffer* valueBuffer;
};
HPbar를 표시할 객체이다.
객체는 Quad형태로 출력하며, 이름과 현재 객체의 %를 측정하고 uv값을 조정할 UdpateHPBar를 사용한다.
#include "Framework.h"
ProgressBar::ProgressBar(wstring frontImageFile, wstring backImageFile)
: Quad(frontImageFile)
{
material->SetShader(L"UI/ProgressBar.hlsl");
backImage = Texture::Add(backImageFile);
valueBuffer = new FloatValueBuffer();
valueBuffer->GetData()[0] = 1.0f;
}
ProgressBar::~ProgressBar()
{
delete valueBuffer;
}
void ProgressBar::Render()
{
valueBuffer->SetPS(10);
backImage->PSSet(10);
Quad::Render();
}
void ProgressBar::SetAmount(float value)
{
valueBuffer->GetData()[0] = value;
}
현재 객체를 cpp로 가져오면 위와 같다.
생성시, 뒷 이미지와, 앞 이미지를 두개 가지고 시작한다.
뒷 이미지는 그대로 표현되나, 앞 이미지는 표현되는 과정에서 uv값을 조정하여 표시하게 함으로. 사이즈가 조정됨을 유념하자.
SetAmount는
객체의 uv%를 받아와서 현 uv를 조정해주는 역할을 한다. float값으로 현재 Obejct의 %를 받아와서 조정하고 Buffer를 수정해준다.
이것을 응용하면, 인스턴싱도 가능하나.
어차피 인스턴싱을 사용하지 않아도 Quad의 Render Draw Call은 큰 리소스를 잡아먹지 않음으로 자유롭게 조정해볼 수 있다.
ProgressBar* hpBar;
이러한 형태를 Monster의 내부에 선언하여 생성해주자.
hpBar = new ProgressBar(L"Textures/UI/HPBar/enemy_hp_bar.png", L"Textures/UI/HPBar/enemy_hp_bar_BG.png");
hpBarOffset.y = 2.0f;
위와같이 생성해주고 HPBar는 따로 Update를 통해 최대HP와 현재 HP를 확인하여 비율을 전달하고 Update할것 이다.
void TopViewMonster::Hit(float input)
{
curHP -= input;
hpBar->SetAmount(curHP / maxHP);
if (maxHP <= 0)
{
curState = DIE;
maxHP = 100;
}
}
위와같이 선언하여 몬스터가 Hit하였을 경우, 해당 함수를 실행하게 해보자.
#include "Framework.h"
#include "MonsterHit.h"
MonsterHit::MonsterHit(TopViewMonster* monster)
: MonsterAction(monster)
{
}
void MonsterHit::Update()
{
if (HitTime > MAXHITDELAY) {
monster->SetAction(TopViewMonster::TRACE);
HitTime = 0;
}
HitTime += DELTA;
monster->SetColor(Float4(1, 0, 0, 1));
}
void MonsterHit::Start()
{
monster->Hit(10);
}
이렇게 조정하면 된다.
728x90
'서울게임아카데미 교육과정 6개월 국비과정' 카테고리의 다른 글
20231208 47일차 AnimationInstancing응용6 (0) | 2023.12.09 |
---|---|
20231207 46일차 AnimationInstancing응용5 (0) | 2023.12.08 |
20231205 44일차 AnimationInstancing응용3 (0) | 2023.12.05 |
20231204 43일차 중간점검 (0) | 2023.12.04 |
20231201 42일차 AnimationInstancing응용2 (0) | 2023.12.01 |