728x90
공격 시스템중, 체인라이트닝을 만들것 이다.
Trail시스템을 사용하여 표현할것 이다.
일단, 객체가 Monster를 따라다니는 방식을 정의하자.
#pragma once
class Trail : public GameObject
{
public:
Trail(wstring imageFile, Transform* start, Transform* end,
UINT width);
~Trail();
void Update();
void Render();
void SetSpeed(float speed) { this->speed = speed; }
private:
void CreateMesh();
private:
Mesh<VertexUV>* mesh;
Transform* start, *end;
UINT width;
float speed = 1.0f;
RasterizerState* rasterizerState[2];
BlendState* blendState[2];
};
Trail이다. 이 객체는 이미지경로와 Transform의 시작지점, Transform의 종료지점을 받아온 다음, vertice의 개수를 width로 받아와서 설정한다.
Start와 End는 각각 좌측끝 우측끝을 정의한다.
speed는 데이터의 전환속도를 정의한다.
#include "Framework.h"
Trail::Trail(wstring imageFile, Transform* start, Transform* end, UINT width)
: start(start), end(end), width(width)
{
material->SetShader(L"Basic/Texture.hlsl");
material->SetDiffuseMap(imageFile);
CreateMesh();
rasterizerState[0] = new RasterizerState();
rasterizerState[1] = new RasterizerState();
rasterizerState[1]->CullMode(D3D11_CULL_NONE);
blendState[0] = new BlendState();
blendState[1] = new BlendState();
blendState[1]->Additive();
}
Trail::~Trail()
{
delete mesh;
delete rasterizerState[0];
delete rasterizerState[1];
delete blendState[0];
delete blendState[1];
}
void Trail::Update()
{
if (!IsActive()) return;
vector<VertexUV>& vertices = mesh->GetVertices();
FOR(width + 1)
{
Vector3 startPos = vertices[i * 2].pos;
Vector3 endPos = vertices[(i * 2) + 1].pos;
Vector3 startDestPos;
Vector3 endDestPos;
if (i == 0)
{
startDestPos = start->GetGlobalPosition();
endDestPos = end->GetGlobalPosition();
startPos = startDestPos;
endPos = endDestPos;
}
else
{
startDestPos = vertices[(i - 1) * 2].pos;
endDestPos = vertices[(i - 1) * 2 + 1].pos;
}
startPos = MATH->Lerp(startPos, startDestPos, speed * DELTA);
endPos = MATH->Lerp(endPos, endDestPos, speed * DELTA);
vertices[i * 2].pos = startPos;
vertices[i * 2 + 1].pos = endPos;
}
mesh->UpdateVertices();
}
void Trail::Render()
{
if (!IsActive()) return;
SetRender();
rasterizerState[1]->SetState();
blendState[1]->SetState();
mesh->Draw();
rasterizerState[0]->SetState();
blendState[0]->SetState();
}
void Trail::CreateMesh()
{
mesh = new Mesh<VertexUV>();
vector<VertexUV>& vertices = mesh->GetVertices();
vertices.reserve((width + 1) * 2);
FOR(width + 1)
{
VertexUV vertex;
vertex.uv = { (float)i / (float)width, 0.0f };
vertices.push_back(vertex);
vertex.uv = { (float)i / (float)width, 1.0f };
vertices.push_back(vertex);
}
vector<UINT>& indices = mesh->GetIndices();
indices.reserve(width * 6);
FOR(width)
{
indices.push_back(i * 2);
indices.push_back(i * 2 + 2);
indices.push_back(i * 2 + 1);
indices.push_back(i * 2 + 1);
indices.push_back(i * 2 + 2);
indices.push_back(i * 2 + 3);
}
mesh->CreateMesh();
}
함수정의부 이다.
객체는 직사각형 형태의 vertice순서를 가지며, 시작지점과 종료지점은 해당 Quad의 좌측끝, 우측끝을 담당한다.
start와 end를 통해 정의된 데이터를 사용해서 객체를 업데이트한다.
Update시 마다 각 Vertex를 선형보간하여 점점 Start와 End로 DELTA와 SPEED의 곱만큼 수렴하게 한다.
728x90
'서울게임아카데미 교육과정 6개월 국비과정' 카테고리의 다른 글
20231212 49일차 RenderTarget (0) | 2023.12.13 |
---|---|
20231211 48일차 AnimationInstancing응용7 (0) | 2023.12.11 |
20231207 46일차 AnimationInstancing응용5 (0) | 2023.12.08 |
20231206 45일차 클래스 개요도, AnimationInstancing응용4 (1) | 2023.12.06 |
20231205 44일차 AnimationInstancing응용3 (0) | 2023.12.05 |