유한 상태 기계 클래스 (fsm)
DESCRIPTION
유한 상태 기계 클래스 (FSM). 이주영 , 전현수. 목차. 유한상태기계란 ? 게임의 AI 에 적용 클래스 정의 설명. 유한상태기계란 ?. Finite state machine, FSM 유한한 개수의 상태들로 구성된 하나의 간단한 기계 하나의 ‘ 입력 ’ 을 받고 그에 의거해서 현재 상태로부터 다른 어떤 상태로 ‘ 전이 ’ 하는 식으로 작동. 게임의 AI 에 적용. 보통. 플레이어의 공격. 플레이어 떠남 또는 몬스터 치료됨. 광분. 흥분. 몬스터 치료됨. 플레이어 등장. - PowerPoint PPT PresentationTRANSCRIPT
유한 상태 기계 클래스(FSM)
이주영 , 전현수
목차
I. 유한상태기계란 ?
II. 게임의 AI 에 적용
III. 클래스 정의
IV.<map> 설명
유한상태기계란 ?
• Finite state machine, FSM
• 유한한 개수의 상태들로 구성된 하나의 간단한 기계
• 하나의 ‘입력’을 받고 그에 의거해서 현재 상태로부터 다른 어떤 상태로 ‘전이’하는 식으로 작동
게임의 AI 에 적용
흥분 광분
불쾌 분노
보통
플레이어의 공격
플레이어 떠남 또는 몬스터
치료됨플레이어 등장
몬스터 치료됨
플레이어의 공격
몬스터 치료됨
몬스터 다침몬스터 다침
몬스터 치료됨
클래스 정의
• 구성– FSMstate 하나의 상태를 의미하는 클래스– FSMclass 임의의 개수의 FSMstate 들로
구성된 하나의 상태 기계를 의미하는 클래스
–이 두 클래스가 연동함으로써 하나의 범용적인 유한 상태 기계를 위한 기능성이 만들어진다 .
FSMstate 클래스의 정의• class FSMstate
{ unsigned m_usNumberOfTransitions; int *mpiInputs; int *mpiOutputState; int miStateID;
public: FSMstate(int iStateID, unsigned usTransitions); ~FSMstate(); int GetID() { return miStateID; }
void AddTransition(int iInput, int iOutputID); void DeleteTransition(int iOutputID); int GetOutput(int iInput);};
FSMstate ( 계속 )• FSMstate::m_usNumberOfTransitions
이 상태가 지원할 수 있는 상태 전이들의 개수로 입력과 출력 배열의 크기가 이 변수에 의해 결정된다 .
• FSMstate::m_piInputs상태 전이에 쓰이는 입력값들을 담은 배열이다 .
• FSMstate::piOutputState상태 전이의 결과로 결정되는 출력 상태들을 가리키는 식별자들의 배열이다 .
• FSMstate::m_iStateIDFSMstate 클래스의 이 인스턴스 ( 즉 이 상태 ) 를 식별하는데 쓰이는 고유한 식별자이다 .
FSMstate ( 계속 )• FSMstate::GetID()
FSMstate 클래스의 이 인스턴스를 가리키는 식별자를 돌려준다 .
• FSMstate::AddTransition()FSMstate 의 이 인스턴스에 새로운 입력값들과 출력 상태 배열들을 추가하기 위한 수단이다 .
• FSMstate::DeleteTransition()기존의 입력값들과 그에 해당하는 출력 상태 식별자를 제거하기 위한 수단이다 .
• FSMstate::GetOutput()입력값을 받아서 상태전이를 수행하고 출력 상태의 식별자를 돌려주는 함수이다 .
FSMclass 클래스 정의• class FSMclass
{ State_Map m_map; // 이 FSM 의 모든 상태들을 담은 맵 int m_iCurrentState; // 현재 상태의 m_iStateID
public: FSMclass( int iStateID ); // FSM 의 초기 상태를 설정 ~FSMclass(); // 할당된 메모리를 해제
// 현재 상태 ID 를 돌려준다 . int GetCurrentState() { return m_iCurrentState; } // 현재 상태를 설정한다 . void SetCurrentState( int iStateID ) { m_iCurrentState = iStateID; }
// FSMstate 객체 초인터를 돌려준다 . FSMstate *GetState( int iStateID );
// FSMstate 객체 포인터를 맵에 추가한다 . void AddState ( FSMstate *pState ); // 맵으로부터 FSMstate 객체 포인터를 제거한다 . void DeleteState( int iStateID ); // 입력과 현재 상태에 기반해서 상태 전이를 수행한다 . int StateTransition( int iInput );};
FSMclass ( 계속 )• FSMclass::m_map
FSMstate 객체들의 컬렉션 , STL <map> 으로 구현된다 .
• FSMclass::m_iCurrentStateFSM 의 현재 상태에 해당하는 FSMstate 객체의 상태 식별자이다 .
• FSMclass::GetState()FSMstate 에 담겨 있는 임의의 FSMstate 객체에 대한 포인터를 얻을 때 사용하는 함수이다 .
• FSMclass::GetCurrentState()현재 상태를 가리키는 고유한 식별자를 돌려준다 .
• FSMclass::SetCurrentState()다른 FSMstate 객체의 식별자를 현재 상태 식별자로 설정한다 .
FSMclass ( 계속 )
• FSMclass::AddState()FSM 의 <map> 컨테이너에 새 FSM 객체 포인터들을 추가할 때 사용하는 함수이다 . 이 함수를 통해서 새로운 상태들을 추가하게 된다 .
• FSMclass::DeleteState()FSM 의 <map> 으로부터 FSM 객체 포인터를 제거하기 위한 수단이다 . 기존의 상태들을 제거할 때 이 함수를 사용한다 .
• FSMclass::StateTransition()주어진 입력값으로 상태 전이를 일으키고 그 결과로 출력 상태 식별자를 얻을 때 사용하는 함수이다 .
<map>
• Key / value 를 하나의 쌍으로 취급하는 원소를 관리하는 컨테이너( 단 , key 중복은 허용 )
• 이 컨테이너들은 제공된 정렬 기준에 따라 자신의 원소를 자동적으로 key 를 기반으로 정렬하여 관리
Map ( 계속 )
• 헤더파일 포함#include<map>
• 정의 – 클래스템플릿으로 namespace std 안에 정의namespace std { template< class Key, class T,
class Compare = less<key>,class Allocator = allocator
<pair<const Key, T>>> class map;}
FSM 의 예 - 적 상태 1
• 적의 영역에 들어오면 플레이어 따라감
가만히
따라다님
제자리로
적의
영역
안에
들어
옴
플레이어가 적의 영역 안에서 벗어남
제자
리에
도착
FSM 의 예 - 적 상태 2
• 적의 영역에 들어오면 도망다님
가만히
도망다님
제자리로
적의
영역
안에
들어
옴
플레이어가 적의 영역 안에서 벗어남
제자
리에
도착
FSM 의 예 - 적 상태 3
• 적의 영역에 들어오면 도망다님
보통 화남플레이어가 적의 영역 안에서 들어왔을
경우 플레이어가 화가 났음
플레이어가 적의 영역 안에서 벗어남
FSM 의 예0
6
12
18
24
30
1
7
13
19
25
31
2
8
14
20
26
32
3
9
15
21
27
33
4
10
16
22
28
34
5
11
17
23
29
35
Enemy
0 ~ 35 ID
보통
흥분
• Message 구조체
FSM 의 예
struct MESSAGEOBJECT{
char strMessageName[256]; // 메세지 이름char strSender[256]; // 송신자char strReceiver[256]; // 수신자float fDeliveryTime; // 메시지 보내는 시간D3DXVECTOR3 vPos; // 플레이어 위치D3DXVECTOR3 vDir; // 플레이어의 방향벡터bool bAngry; // 플레이어의 상태
};
FSM 의 예CCube(Player)
CMessageRouter
CFSMclass(Enemy)
CFSMstateCFrameView
위치데이터받아옴위치데이터가 담긴
메시지 전송
Player 가 위치한 영역에 있는 Enemy에게 “ 따라다니라” 는
메시지 전송
현재 위치한 영역 바로 전에 있던
영역에 있는 Enemy에게 “ 제자리에 가라”
는 메시지 전송
“ 따라다니라” 로 상태 전이
“ 제자리에 가라” 로 상태 전이
Enemy 가 제자리로 이동 중 제자리에 갔으면 “ 가만히
있어라” 로 상태 전이
Player 가 위치한 영역에 있는 Enemy에게 “ 도망다녀라” 는
메시지 전송“ 도망다녀라” 로
상태 전이
FSM 의 예
CCube
+ m_pVB;+ m_pIB;+ m_pd3dDevice;+ m_matWorld;+ m_vOriginTrans;+ m_vTrans;+ m_vTargetTrans;+ m_fVelocity;
+ CCube();+ ~Ccube();+ Create();+ SetLocation();+ FrameMove();+ Render();+ Release();
CFSMstate
+ m_usNumberOfTransitions;+ m_pnInouts;+ m_pnOutoutState;+ m_nStateID;
+ CFSMstate();+ ~CFSMstate();+ GetID();+ AddTransition();+ GetOutput();
FSM 의 예
CFSMclass
+ m_pd3dDevice;+ m_StateMap;+ m_nCurrentState;+ m_Enemy;+ m_fVelocity;
+ CFSMclass();+ ~CFMSclass();+ GetCurrentState();+ SetCurrentState();+ GetState();+ AddState();+ DeleteState();+ StateTransition();+ ReceiveMessage();
CMessageRouter
+ m_pd3dDevice+ m_nEnemyNum;+ m_nBeforeLotID;+ m_nCurrentLotID;
+ CMessageRouter();+ ~CMessageRouter();+ Create();+ FrameMove();+ GetPlayerLocationID();+ Render();+ Release();
THE END