1. 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() 메서드: 현재 상태를 서버와 동기화합니다.

2. MyPlayer의 생성자와 소멸자

코드 분석

MyPlayer::MyPlayer()
{
	CameraComponent* camera = new CameraComponent();
	AddComponent(camera);
}

MyPlayer::~MyPlayer()
{

}
  • MyPlayer::MyPlayer()

    • CameraComponent라는 새로운 컴포넌트를 추가합니다.
    • 이는 Player 클래스에는 없던 기능으로, MyPlayer 클래스가 멀티플레이 환경에서 특정 카메라 뷰를 추가하는 역할을 맡습니다.
    • AddComponent()Player 클래스에서 상속받은 함수로, 객체의 컴포넌트를 등록하는 메서드입니다.
  • MyPlayer::~MyPlayer()

    • 소멸자에서는 별다른 추가 작업을 수행하지 않습니다.

3. MyPlayer::BeginPlay 메서드

코드 분석

void MyPlayer::BeginPlay()
{
	Super::BeginPlay();
}
  • Super::BeginPlay()를 호출하여 부모 클래스인 Player의 초기화 로직을 먼저 실행합니다.
  • 추가로 MyPlayer에만 필요한 초기화 로직은 여기에 작성할 수 있습니다.

4. MyPlayer::Tick 메서드

코드 분석

void MyPlayer::Tick()
{
	Super::Tick();
	SyncToServer();
}
  • Super::Tick() 호출:
    • 부모 클래스 Player의 틱 메서드를 호출하여 공통적인 틱 로직을 실행합니다.
  • 추가된 로직:
    • SyncToServer()를 호출하여 현재 플레이어 상태를 서버와 동기화합니다.

5. 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);
	}
}
  1. 키 입력을 통한 방향 설정:

    • W, A, S, D 키 입력에 따라 플레이어의 방향을 DIR_UP, DIR_LEFT, DIR_DOWN, DIR_RIGHT로 설정합니다.
    • SetDir() 함수는 부모 클래스인 Player에서 구현되어 있으며, 방향을 변경할 때 애니메이션 업데이트와 동기화 플래그를 갱신합니다.
  2. 무기 변경 처리:

    • KEY_1, KEY_2, KEY_3 입력에 따라 무기를 각각 Sword, Bow, Staff로 변경합니다.
    • SetWeaponType()는 무기 타입을 설정하는 메서드로, 내부적으로 애니메이션 변경 로직과 연계됩니다.
  3. 스킬 상태 전환:

    • SpaceBar 입력 시 상태를 SKILL로 설정하여 스킬 사용 애니메이션을 트리거합니다.

6. 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로 전환하여 애니메이션을 트리거합니다.

7. 변경된 주요 기술 및 활용된 기술

  1. 상속 및 다형성 활용:

    • 기존 Player를 부모로 삼아 새로운 기능을 MyPlayer로 확장했습니다.
    • 다형성을 통해 MyPlayer 객체는 Player로도 사용 가능하며, 공통 기능을 재사용했습니다.
  2. 입력 관리:

    • InputManager를 활용하여 키 입력을 캡처하고 방향, 무기 변경, 상태 전환을 처리했습니다.
  3. 서버 동기화:

    • SyncToServer()를 통해 현재 상태를 서버에 실시간으로 전송합니다.
    • 클라이언트-서버 구조를 고려한 설계가 포함되었습니다.
  4. 애니메이션 시스템 연계:

    • SetState(), SetDir(), UpdateAnimation() 메서드를 통해 상태와 애니메이션을 연동했습니다.
  5. 씬 객체 접근:

    • DevScene 객체를 참조하여 맵 데이터와 충돌 확인, 객체 생성 및 삭제를 처리했습니다.

profile
李家네_공부방

0개의 댓글