프로그래밍 공부
작성일
2023. 12. 6. 16:04
작성자
WDmil
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