MyPlayer 클래스의 정의class MyPlayer : public Player
{
using Super = Player;
public:
MyPlayer();
virtual ~MyPlayer() override;
virtual void BeginPlay() override;
virtual void Tick() override;
virtual void Render(HDC hdc) override;
private:
void TickInput();
void TryMove();
virtual void TickIdle() override;
virtual void TickMove() override;
virtual void TickSkill() override;
void SyncToServer();
private:
bool _keyPressed = false;
};
MyPlayer 클래스는 Player 클래스를 상속하여 구현되었습니다.Player에서 처리하던 기능을 Super 키워드를 통해 부모 클래스를 참조하여 확장하거나 커스터마이징했습니다.TickInput() 메서드: 키 입력을 처리합니다.TryMove() 메서드: 플레이어 이동 시 서버 동기화를 고려합니다.SyncToServer() 메서드: 현재 상태를 서버와 동기화합니다.MyPlayer의 생성자와 소멸자MyPlayer::MyPlayer()
{
CameraComponent* camera = new CameraComponent();
AddComponent(camera);
}
MyPlayer::~MyPlayer()
{
}
MyPlayer::MyPlayer()
CameraComponent라는 새로운 컴포넌트를 추가합니다.Player 클래스에는 없던 기능으로, MyPlayer 클래스가 멀티플레이 환경에서 특정 카메라 뷰를 추가하는 역할을 맡습니다.AddComponent()는 Player 클래스에서 상속받은 함수로, 객체의 컴포넌트를 등록하는 메서드입니다.MyPlayer::~MyPlayer()
MyPlayer::BeginPlay 메서드void MyPlayer::BeginPlay()
{
Super::BeginPlay();
}
Super::BeginPlay()를 호출하여 부모 클래스인 Player의 초기화 로직을 먼저 실행합니다.MyPlayer에만 필요한 초기화 로직은 여기에 작성할 수 있습니다.MyPlayer::Tick 메서드void MyPlayer::Tick()
{
Super::Tick();
SyncToServer();
}
Super::Tick() 호출:Player의 틱 메서드를 호출하여 공통적인 틱 로직을 실행합니다.SyncToServer()를 호출하여 현재 플레이어 상태를 서버와 동기화합니다.TickInput() 메서드void MyPlayer::TickInput()
{
_keyPressed = true;
if (GET_SINGLE(InputManager)->GetButton(KeyType::W))
{
SetDir(DIR_UP);
}
else if (GET_SINGLE(InputManager)->GetButton(KeyType::S))
{
SetDir(DIR_DOWN);
}
else if (GET_SINGLE(InputManager)->GetButton(KeyType::A))
{
SetDir(DIR_LEFT);
}
else if (GET_SINGLE(InputManager)->GetButton(KeyType::D))
{
SetDir(DIR_RIGHT);
}
else
{
_keyPressed = false;
}
if (GET_SINGLE(InputManager)->GetButtonDown(KeyType::KEY_1))
{
SetWeaponType(WeaponType::Sword);
}
else if (GET_SINGLE(InputManager)->GetButtonDown(KeyType::KEY_2))
{
SetWeaponType(WeaponType::Bow);
}
else if (GET_SINGLE(InputManager)->GetButtonDown(KeyType::KEY_3))
{
SetWeaponType(WeaponType::Staff);
}
if (GET_SINGLE(InputManager)->GetButton(KeyType::SpaceBar))
{
SetState(SKILL);
}
}
키 입력을 통한 방향 설정:
W, A, S, D 키 입력에 따라 플레이어의 방향을 DIR_UP, DIR_LEFT, DIR_DOWN, DIR_RIGHT로 설정합니다.SetDir() 함수는 부모 클래스인 Player에서 구현되어 있으며, 방향을 변경할 때 애니메이션 업데이트와 동기화 플래그를 갱신합니다.무기 변경 처리:
KEY_1, KEY_2, KEY_3 입력에 따라 무기를 각각 Sword, Bow, Staff로 변경합니다.SetWeaponType()는 무기 타입을 설정하는 메서드로, 내부적으로 애니메이션 변경 로직과 연계됩니다.스킬 상태 전환:
SpaceBar 입력 시 상태를 SKILL로 설정하여 스킬 사용 애니메이션을 트리거합니다.TryMove() 메서드void MyPlayer::TryMove()
{
if (_keyPressed == false)
return;
Vec2Int deltaXY[4] = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };
if (info.dir() == DIR_UP)
{
Vec2Int nextPos = GetCellPos() + deltaXY[info.dir()];
if (CanGo(nextPos))
{
SetCellPos(nextPos);
SetState(MOVE);
}
}
else if (info.dir() == DIR_DOWN)
{
Vec2Int nextPos = GetCellPos() + deltaXY[info.dir()];
if (CanGo(nextPos))
{
SetCellPos(nextPos);
SetState(MOVE);
}
}
else if (info.dir() == DIR_LEFT)
{
Vec2Int nextPos = GetCellPos() + deltaXY[info.dir()];
if (CanGo(nextPos))
{
SetCellPos(nextPos);
SetState(MOVE);
}
}
else if (info.dir() == DIR_RIGHT)
{
Vec2Int nextPos = GetCellPos() + deltaXY[info.dir()];
if (CanGo(nextPos))
{
SetCellPos(nextPos);
SetState(MOVE);
}
}
}
nextPos)를 계산합니다.CanGo(nextPos)를 호출하여 해당 위치로 이동 가능한지 확인합니다.DevScene 클래스의 맵 데이터를 활용합니다.SetCellPos(nextPos)로 위치를 갱신합니다.MOVE로 전환하여 애니메이션을 트리거합니다.상속 및 다형성 활용:
Player를 부모로 삼아 새로운 기능을 MyPlayer로 확장했습니다.MyPlayer 객체는 Player로도 사용 가능하며, 공통 기능을 재사용했습니다.입력 관리:
InputManager를 활용하여 키 입력을 캡처하고 방향, 무기 변경, 상태 전환을 처리했습니다.서버 동기화:
SyncToServer()를 통해 현재 상태를 서버에 실시간으로 전송합니다.애니메이션 시스템 연계:
SetState(), SetDir(), UpdateAnimation() 메서드를 통해 상태와 애니메이션을 연동했습니다.씬 객체 접근:
DevScene 객체를 참조하여 맵 데이터와 충돌 확인, 객체 생성 및 삭제를 처리했습니다.