Damaged_Monster(대미지를 받은 상태)
Damaged_Monster는 대미지를 받은 상태를 표현하는 클래스이다.
몬스터가 대미지를 받았을 때, CMonster::HandleDamage(CPlayer*, float) 함수가 호출되어 대미지를 처리하게 되는데 이 함수가 호출되었을 때, 엘리트 몬스터가 아니라면 대미지를 받은 상태로 전환되고, 엘리트 몬스터라면 쉴드가 없을 때, 대미지를 받은 상태로 전환된다.
다음은 Damaged_Monster의 virtual void Enter(CMonster *) 함수이다.
몬스터의 이전 상태가 경직 상태가 아니라면 몬스터의 애니메이션을 대미지를 받는 애니메이션으로 설정하고, 대미지를 받는 상태에선 플레이어를 쫓아갈 수 없으므로 m_bCanChase를 false로 초기화시켜준다. 그리고 몬스터가 경직을 받은 적 있는지 확인하는 변수인 m_bStunned를 false로 설정하고, 타격감 표현기법 중 대미지 애니메이션(피격시 뒤로 밀리는 효과)을 구현하기 위해 뒤로 밀린 거리를 표시하는 m_fTotalDamageDistance 변수를 0.0f으로 초기화한다.
다음으로 Damaged_Monster 의 virtual void Execute(CMonster*, float) 함수이다.
Damaged_Monster::Execute() 함수에서는 타격감 설정을 위한 여러가지 작업들을 하지만 이 글에서는 몬스터 FSM을 이용한 AI 구현과 관련된 내용만 작성하고자 한다. 몬스터의 경직 시작 시간보다 몬스터의 애니메이션 출력시간이 더 크고 몬스터가 경직을 받은 적 없다면 몬스터가 경직 받은 상태인 Stun_Monster 상태로 전환한다.
대미지를 받는 애니메이션을 전부 출력했다면, Idle_Monster 상태로 전환한다.
Stun_Monster(경직 받은 상태)
Stun_Monster는 경직 받은 상태를 표현하는 클래스이다.
먼저 Stun_Monster의 virtual void Enter(CMonster *) 함수이다.
Stun_Monster::Enter(CMonster*)에서는 m_bStunned를 true로 설정하고 플레이어를 쫓아갈 수 없으므로 m_bCanChase를 false로 초기화시켜준다. 그리고 경직를 유지한 시간인 m_fStunTime을 0.0f로 설정한다.
다음으로 Stun_Monster 의 virtual void Execute(CMonster*, float)는 함수이다.
경직를 유지한 시간이 몬스터 최대 경직시간보다 작은 동안에는 프레임타임을 경직시간에 합치고, 최대 경직시간을 넘어섰을 경우 몬스터가 대미지 받은 상태인 Damaged_Monster 상태로 전환한다.
경직 상태에서는 애니메이션이 진행 되지 않으므로 Stun_Monster의 virtual void
Animate
(CMonster*, float) 함수에서 몬스터의 애니메이션 실행함수인 Animate()를 호출할 때, 인자값을 0.0f를 넘겨주어 애니메이션이 진행되지 않게 하고, 상태를 빠져나갈 때, m_fStunTime을 0.0f로 설정한다. (이제보니 두 번 초기화를 해주었다..? 생각보다 불필요한 코드가 더 많이 남아있는 것 같다.)
다음은 두 상태를 반복하는 몬스터의 모습이다.
'DirectX 12 프로젝트 > Rampage' 카테고리의 다른 글
Rampage - 타격감 표현기법(2) (0) | 2024.01.16 |
---|---|
Rampage - 타격감 표현기법(1) (0) | 2024.01.16 |
Rampage - FSM을 이용한 몬스터 AI(3) (0) | 2024.01.16 |
Rampage - FSM을 이용한 몬스터 AI(2) (0) | 2024.01.15 |
Rampage - FSM을 이용한 몬스터 AI(1) (1) | 2024.01.15 |