프로그래밍 공부
작성일
2024. 5. 12. 17:23
작성자
WDmil
728x90

 

외곽 파란구체 Collider에 접촉하면 플레이어의 마지막 접촉위치까지 monster가 쫒아옵니다.

 

Player가 파란구체에 접촉하지 않은 상태로 2초가 지나면, Attack상태가 풀리면서. 이동을 종료합니다.

 

Monster는 플레이어의 마지막 위치까지 이동하여 확인합니다.

 

#pragma once

class UIRenderMaster : public Singleton<UIRenderMaster>
{
private:
    friend class Singleton;

    UIRenderMaster();
    ~UIRenderMaster();

public:
    void InputUI2D(string UI);
    void InputUI2D(string UI, wstring Route);
    Quad* GetUI2D(string UI);
    void DeleteUI2D(string UI);

public:
    void InputUI3D(string UI);
    void InputUI3D(string UI, wstring Route);
    Quad* GetUI3D(string UI);
    void DeleteUI3D(string UI);

public:
    void Set2DUIScaleAtSort(string UI, UINT sort, float x, float y, Vector3 DefaltPos, Vector3 DefaltScale);
    void Set3DUIScaleAtSort(string UI, UINT sort, float x, float y, Vector3 DefaltPos, Vector3 DefaltScale);

    void Update();
    void Update2D();
    void Update3D();

    void Render();
    void PostRender();
    void GUIRender();

private:
    unordered_map<string, Quad*> _3DUImap;
    unordered_map<string, Quad*>::iterator _3DUImapIter;

    unordered_map<string, Quad*> UImap;
    unordered_map<string, Quad*>::iterator UImapIter;
};
 

UI렌더용 Singleton을 따로 만들어서 관리했습니다.

 

이제 UI를 출력하고 싶다면, 그냥 UI를 master에 만들어주고,

 

수정하고 싶다면 Master에서 받아서 수정해주면 됩니다.

 

2D와 3D가 나뉘는 이유는, 플레이어의 체력바는 UI에 표시되나, 몬스터의 체력바는 필드위에 3D객체로 존재하여, Obejct의 위쪽에 떠있어야 하기 떄문에 분리하여 관리합니다.

    if (curState == ATTACK) return;
    if (PlayerLastPos == Vector3::Zero()) {
        veloctiy = Vector3::Zero();
        return;
    }

    // Rot
    Vector3 PtoMro = PlayerLastPos - GetGlobalPosition();
    Vector3 MonsterForward = GetForward();

    float Rdot = Vector3::Dot(PtoMro, MonsterForward);

    float rad = (float)acos(Rdot);

    // 유저가 좌측인이 우측인지.
    float rotate = Vector3::Dot(GetRight(), PtoMro);
    rotate < 0 ? rotate = 1 : rotate = -1;
    PtoMdir.y = rotate;

    // Move
    if (PlayerLastPos != Vector3::Zero())
    {
        veloctiy.z += accelation * DELTA;
    }

    if (veloctiy.Length() > 1.0f)
        veloctiy.Normalized();


    if (rotate == 0) return;
    Rotate(Vector3(0, rotate * rotSpeed * DELTA, 0));
 

Monster가 플레이어의 방향을 확인하고 해당방향이 좌측인지 우측인지 판별합니다.

 

ptoMro는, Player와 Monster의 방향벡터입니다.

 

Object의 오른쪽과 방향벡터를 내적하여, 플레이어와 Object의 방향벡터와 현재 Object의 오른쪽 벡터의 각도를 확인합니다.

 

rotate가 0보다 작으면 1 0보다 크면 1로 정규화합니다.

 

그리고, 그 방향대로 돌려버리면 됩니다.

 

움직임 벡터는 플레이어의 움직임을 활용했습니다.

 

728x90

'작업사항 정리 > DIrectX3D' 카테고리의 다른 글

Animation  (0) 2024.05.13
DirectX3D 작업물 몰아넣은 Git  (0) 2024.05.13
인스턴싱 & 무한  (0) 2024.05.12
상점기능 구현  (0) 2024.05.12
간단 PacMan  (0) 2024.05.12