응애맘마조

230620 강의 본문

공부/3D강의

230620 강의

TH.Wert 2023. 6. 20. 18:25

아직 캐릭터 이동에 대한 것이 다 끝나지 않아서 오늘도 이어서 했습니다. 벽에 끼었을 상황이나 점프를 해서 벽에 닿았을 때 멈추지 않고 벽을 타고 내려오는 것 같은 모습이 구현하는 것이 목표였습니다.

#pragma once

enum class DeadState
{
	IDLE,
	WALK,
	JUMP
};

class Deadpool
{
	Camera* Cam;
	Actor* dead;

	DeadState state;

	Vector3 inputDir;
	float	speed;
	float	gravity;

public:
	bool isLanding;
	Vector3 lastPos;
	Actor* root;

	void Init();
	void Update();
	void Hi();
	void Render();
	void WASD();
	Ray GetRay()
    {
		Ray Top;
		Top.position = root->GetWorldPos() + Vector3(0, 100, 0);
		Top.direction = Vector3(0, -1, 0);
		return Top;
	}
	void OutOfRange();
	void OnFloor(Vector3 Hit);
	void BackMove() { root->SetWorldPos(lastPos); root->Update(); };
};
#include "stdafx.h"
#include "Deadpool.h"

void Deadpool::Init()
{
    root = Actor::Create();
    root->LoadFile("Root.xml");
    dead = (Actor*)root->Find("Deadpool");
    Cam = (Camera*)root->Find("Camera");
    Camera::main = Cam;
    state = DeadState::IDLE;
    isLanding = true;
    speed = 10.0f;
    gravity = 0.0f;
}

void Deadpool::Update()
{
    if (INPUT->KeyPress(VK_RBUTTON))
    {
        Vector3 Rot;
        Rot.x = INPUT->movePosition.y * 0.001f;
        Rot.y = INPUT->movePosition.x * 0.001f;
        root->rotation.y += Rot.y;
    }
    
    lastPos = root->GetWorldPos();

    if (state == DeadState::IDLE)
    {
        inputDir = Vector3();

        root->Find("Nonran")->rotation.y += DELTA;

        Vector3 ori = Vector3(0, 2.3499999, 0);
        root->Find("Nonran")->SetLocalPos(ori +
            Vector3(RANDOM->Float(-0.3, 0.3),
                RANDOM->Float(-0.3, 0.3),
                RANDOM->Float(-0.3, 0.3)));

        if (INPUT->KeyDown(VK_SPACE))
        {
            gravity = -10.0f;
            isLanding = false;
        }

        //idle to walk
        if (INPUT->KeyDown('W') or
            INPUT->KeyDown('A') or
            INPUT->KeyDown('S') or
            INPUT->KeyDown('D'))
        {
            state = DeadState::WALK;
        }
        //idle to jump
        if (not isLanding)
        {
            state = DeadState::JUMP;
        }
    }
    else if (state == DeadState::WALK)
    {
        WASD();
        //walk to idle
        if (not INPUT->KeyPress('W') and
            not INPUT->KeyPress('A') and
            not INPUT->KeyPress('S') and
            not INPUT->KeyPress('D'))
        {
            state = DeadState::IDLE;
        }
        //walk to jump
        if (not isLanding)
        {
            state = DeadState::JUMP;
        }
       
    }
    else if (state == DeadState::JUMP)
    {
        //jump to idle
        if (isLanding)
        {
            state = DeadState::IDLE;
        }
    }
    
    if (not isLanding)
    {
        gravity += 10.0f * DELTA;
    }

    root->MoveWorldPos(inputDir * speed * DELTA);
    root->MoveWorldPos(-UP * gravity * DELTA);
    root->Update();
}

void Deadpool::Hi()
{
    root->RenderHierarchy();
}

void Deadpool::Render()
{
    root->Render();
}

void Deadpool::WASD()
{
    inputDir = Vector3();

    if (INPUT->KeyPress('W'))
    {
        inputDir += -root->GetForward();
    }
    else if (INPUT->KeyPress('S'))
    {
        inputDir += root->GetForward();
    }
    if (INPUT->KeyPress('A'))
    {
        inputDir += root->GetRight();
    }
    else if (INPUT->KeyPress('D'))
    {
        inputDir += -root->GetRight();
    }
    if (INPUT->KeyDown(VK_SPACE))
    {
        gravity = -10.0f;
        isLanding = false;
    }
}

void Deadpool::OutOfRange()
{
    root->MoveWorldPos(-inputDir * speed * DELTA);

    root->Update();
    inputDir = Vector3();
}

void Deadpool::OnFloor(Vector3 Hit)
{
    isLanding = true;
    gravity = 0.0f;
    root->SetWorldPosY(Hit.y);
    root->Update();
}

클래스로 빼낸 캐릭터의 헤더와 cpp파일입니다. FSM으로 캐릭터의 상태에 따라 움직이는 모습을 제어하고 점프나 착지했을 때 스스로 실행하도록 클래스 내에서 구현했습니다. 위의 내용처럼 벽에 끼거나 점프를 해서 벽에 닿았을 때 미끄러지는 모습은 강의 시간 내에 구현이 되지 못했습니다. 내일 해결될 예정입니다.

 

읽어주셔서 감사합니다.

'공부 > 3D강의' 카테고리의 다른 글

230622 강의  (0) 2023.06.22
230621 강의  (0) 2023.06.21
230616 강의  (0) 2023.06.20
230614 강의  (0) 2023.06.14
230613 강의  (0) 2023.06.13
Comments