플레이어 공격 1
이번에는 플레이어가 몬스터를 공격하는 작업을 진행했습니다.
네크로댄서는 일반적인 게임과 다르게 충돌체 충돌로 공격을 처리하지 않습니다.
플레이어가 이동키를 입력했을때 이동할 방향에 적이 있으면 이동 대신 공격이 나가는 방식입니다.
플레이어와 적이 직접 충돌하지 않은 상태로 공격을 판정해야 하기 때문에, 입력한 방향에 적이 존재하는지 파악하는 로직이 필요합니다.
가장 먼저 떠오르는 방법은 이동시마다 공격 범위 안에 적이 있는지 모든 적 객체를 순회하며 좌표를 대조해보는 것이었습니다. 하지만 이동시마다 이 작업을 반복하는건 자원 낭비가 심하고 레벨에 몬스터가 많아질수록 아직 화면에 보이지도 않는 적때문에 렉을 유발할 수도 있습니다.
괜찮은 방법을 생각하다 지난번 맵을 구현했던 타일에 자신의 타일위에 있는 액터의 정보를 저장하도록 구현하기로 했습니다. 공격 시에는 공격 범위 안에 있는 타일로 부터 타일에 있는 몬스터 액터를 조사하는 방식으로 구현했습니다.
게임 액터들은 이동시마다 이동한 타일에 SetOnTileActor()함수로 타일 위에 자신이 있음을 저장합니다. (물론 있던 자리를 nullptr로 바꾸는 것을 잊지 말아야 합니다)
Weapon 클래스
플레이어는 공격할때 하나의 무기로만 공격을 합니다. 어떤 무기를 착용하고 있더라도 공격을 호출하는 부분의 구조가 변하지 않도록 무기들의 가장 상위 클래스 Weapon 클래스를 플레이어가 하나 가지고 있도록 했습니다.
Weapon 클래스는 상, 하, 좌, 우 공격 범위를 멤버로 가집니다.
그리고 Weapon 클래스를 상속받는 클래스들은 공격 범위를 초기화 할 수 있도록 순수 가상함수를 사용해 주었습니다.
공격 범위의 초기화는 오른쪽 방향의 공격 방향만 입력해 주면, 나머지 방향은 회전행렬을 이용해 초기화합니다.
게임 시작시 플레이어가 소지하고 시작하는 단검 Dagger클래스의 초기화를 보겠습니다.
이제 특정 방향으로 공격할때 공격범위 내의 타일들에 몬스터가 존재하는지 확인하고 공격을 하면 됩니다.
이것으로 Weapon 클래스의 핵심적인 부분은 구현 완료했습니다.
네크로댄서는 이동과 공격의 입력 키가 같습니다. 이동 시에 적이 공격범위에 있으면 공격을 하고, 적이 없으면 이동을 합니다. 따라서 공격을 했는지 체크하기위해 Attack() 함수가 bool을 반환하도록 했습니다.
실제 공격을 했을때 데미지를 주는 함수인 ApplyDamage 함수는 언리얼 엔진의 방식을 참고해 구현했습니다.
게임 액터를 상속받는 클래스들은 가상함수 TakeDamage 함수를 가지고 있고, ApplyDamage는 데미지를 주고자 하는 액터의 TakeDamage 함수를 호출합니다.
이것으로 플레이어 공격의 핵심 부분들을 구현해 봤습니다.