응애맘마조
230620 강의 본문
아직 캐릭터 이동에 대한 것이 다 끝나지 않아서 오늘도 이어서 했습니다. 벽에 끼었을 상황이나 점프를 해서 벽에 닿았을 때 멈추지 않고 벽을 타고 내려오는 것 같은 모습이 구현하는 것이 목표였습니다.
#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으로 캐릭터의 상태에 따라 움직이는 모습을 제어하고 점프나 착지했을 때 스스로 실행하도록 클래스 내에서 구현했습니다. 위의 내용처럼 벽에 끼거나 점프를 해서 벽에 닿았을 때 미끄러지는 모습은 강의 시간 내에 구현이 되지 못했습니다. 내일 해결될 예정입니다.
읽어주셔서 감사합니다.
Comments