응애맘마조

230706 강의 본문

공부/3D강의

230706 강의

TH.Wert 2023. 7. 6. 20:02

블렌드 애니메이션을 사용하여 움직이는 것을 강의했습니다. 동시에 과제였습니다.

#pragma once

enum class DeadState
{
	IDLE,
	WALK,
	JUMP
};

class VanGuard
{
	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 "VanGuard.h"

void VanGuard::Init()
{
    root = Actor::Create();
    root->LoadFile("VanGuard.xml");
    dead = (Actor*)root->Find("Player");
    Camera::main = Cam;
    state = DeadState::IDLE;
    isLanding = true;
    speed = 10.0f;
    gravity = 0.0f;
    root->anim->ChangeAnimation(AnimationState::LOOP, 0);
}

void VanGuard::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();

        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;
            root->anim->ChangeAnimation(AnimationState::LOOP, 1);
        }
        
        //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;
            root->anim->ChangeAnimation(AnimationState::LOOP, 0);
        }
        
        //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 VanGuard::Hi()
{
}

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

void VanGuard::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 VanGuard::OutOfRange()
{
    //원래 입력 반대방향으로 움직이기
    root->MoveWorldPos(-inputDir * speed * DELTA);

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

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

캐릭터를 클래스로 따로 빼고 움직이는 효과를 나타냈습니다. 나머지는 메인 함수에 클래스를 연결하면 됩니다.

WASD 방향키에 맞춰 움직이는 모습

내일은 배경을 나타내는 맵에 대해서 강의한다고 했습니다.

읽어주셔서 감사합니다.

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

230710 강의  (0) 2023.07.10
230707 강의  (0) 2023.07.07
230705 강의  (0) 2023.07.05
230704 강의  (0) 2023.07.04
230703 강의  (0) 2023.07.03