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