Rampage - FSM을 이용한 몬스터 AI(4)

2024. 1. 16. 00:54·DirectX 12 프로젝트/Rampage

몬스터 State Diagram

Damaged_Monster(대미지를 받은 상태)

Damaged_Monster는 대미지를 받은 상태를 표현하는 클래스이다.

몬스터가 대미지를 받았을 때, CMonster::HandleDamage(CPlayer*, float) 함수가 호출되어 대미지를 처리하게 되는데 이 함수가 호출되었을 때, 엘리트 몬스터가 아니라면 대미지를 받은 상태로 전환되고, 엘리트 몬스터라면 쉴드가 없을 때, 대미지를 받은 상태로 전환된다.

CMonster::HandleDamage() 함수의 일부, 엘리트일 경우 쉴드가 없으면 대미지를 받은 상태로 전환한다.
CMonster::HandleDamage() 함수의 일부  엘리트 몬스터가 아니라면 대미지를 받은 상태로 전환한다.

 

다음은 Damaged_Monster의 virtual void Enter(CMonster *) 함수이다.

Damaged_Monster::Enter() 함수

 

몬스터의 이전 상태가 경직 상태가 아니라면 몬스터의 애니메이션을 대미지를 받는 애니메이션으로 설정하고, 대미지를 받는 상태에선 플레이어를 쫓아갈 수 없으므로 m_bCanChase를 false로 초기화시켜준다. 그리고 몬스터가 경직을 받은 적 있는지 확인하는 변수인 m_bStunned를 false로 설정하고, 타격감 표현기법 중 대미지 애니메이션(피격시 뒤로 밀리는 효과)을  구현하기 위해 뒤로 밀린 거리를 표시하는 m_fTotalDamageDistance 변수를 0.0f으로 초기화한다.

 

다음으로 Damaged_Monster 의 virtual void Execute(CMonster*, float) 함수이다.

Damaged_Monster::Execute() 함수의 일부

 

Damaged_Monster::Execute() 함수에서는 타격감 설정을 위한 여러가지 작업들을 하지만 이 글에서는 몬스터 FSM을 이용한 AI 구현과 관련된 내용만 작성하고자 한다. 몬스터의 경직 시작 시간보다 몬스터의 애니메이션 출력시간이 더 크고 몬스터가 경직을 받은 적 없다면 몬스터가 경직 받은 상태인 Stun_Monster 상태로 전환한다. 

 

대미지를 받는 애니메이션을 전부 출력했다면, Idle_Monster 상태로 전환한다.

 

Stun_Monster(경직 받은 상태)

Stun_Monster는 경직 받은 상태를 표현하는 클래스이다.

먼저 Stun_Monster의 virtual void Enter(CMonster *) 함수이다.

Stun_Monster::Enter() 함수

 

Stun_Monster::Enter(CMonster*)에서는 m_bStunned를 true로 설정하고 플레이어를 쫓아갈 수 없으므로 m_bCanChase를 false로 초기화시켜준다. 그리고 경직를 유지한 시간인 m_fStunTime을 0.0f로 설정한다.

 

다음으로 Stun_Monster 의 virtual void Execute(CMonster*, float)는 함수이다.

Stun_Monster::Execute() 함수 일부

 

경직를 유지한 시간이 몬스터 최대 경직시간보다 작은 동안에는 프레임타임을 경직시간에 합치고, 최대 경직시간을 넘어섰을 경우 몬스터가 대미지 받은 상태인 Damaged_Monster 상태로 전환한다.

Stun_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
'DirectX 12 프로젝트/Rampage' 카테고리의 다른 글
  • Rampage - 타격감 표현기법(2)
  • Rampage - 타격감 표현기법(1)
  • Rampage - FSM을 이용한 몬스터 AI(3)
  • Rampage - FSM을 이용한 몬스터 AI(2)
Coding2018180044
Coding2018180044
  • Coding2018180044
    더 멋진 개발자를 꿈꾸는 나
    Coding2018180044
  • 전체
    오늘
    어제
    • 프로젝트 & 공부 기록
      • Unreal Engine 프로젝트
        • 개인 공부 프로젝트(RPG 전투, Multipla..
        • SuperSoldier
        • 파닥파닥 바다로
      • DirectX 12 프로젝트
        • Rampage
      • 공부
        • 코딩 테스트 대비반
        • 멀티코어프로그래밍
        • Unreal C++
  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Coding2018180044
Rampage - FSM을 이용한 몬스터 AI(4)
상단으로

티스토리툴바