Transcript
Page 1: 유한 상태 기계 클래스 (FSM)

유한 상태 기계 클래스(FSM)

이주영 , 전현수

Page 2: 유한 상태 기계 클래스 (FSM)

목차

I. 유한상태기계란 ?

II. 게임의 AI 에 적용

III. 클래스 정의

IV.<map> 설명

Page 3: 유한 상태 기계 클래스 (FSM)

유한상태기계란 ?

• Finite state machine, FSM

• 유한한 개수의 상태들로 구성된 하나의 간단한 기계

• 하나의 ‘입력’을 받고 그에 의거해서 현재 상태로부터 다른 어떤 상태로 ‘전이’하는 식으로 작동

Page 4: 유한 상태 기계 클래스 (FSM)

게임의 AI 에 적용

흥분 광분

불쾌 분노

보통

플레이어의 공격

플레이어 떠남 또는 몬스터

치료됨플레이어 등장

몬스터 치료됨

플레이어의 공격

몬스터 치료됨

몬스터 다침몬스터 다침

몬스터 치료됨

Page 5: 유한 상태 기계 클래스 (FSM)

클래스 정의

• 구성– FSMstate 하나의 상태를 의미하는 클래스– FSMclass 임의의 개수의 FSMstate 들로

구성된 하나의 상태 기계를 의미하는 클래스

–이 두 클래스가 연동함으로써 하나의 범용적인 유한 상태 기계를 위한 기능성이 만들어진다 .

Page 6: 유한 상태 기계 클래스 (FSM)

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);};

Page 7: 유한 상태 기계 클래스 (FSM)

FSMstate ( 계속 )• FSMstate::m_usNumberOfTransitions

이 상태가 지원할 수 있는 상태 전이들의 개수로 입력과 출력 배열의 크기가 이 변수에 의해 결정된다 .

• FSMstate::m_piInputs상태 전이에 쓰이는 입력값들을 담은 배열이다 .

• FSMstate::piOutputState상태 전이의 결과로 결정되는 출력 상태들을 가리키는 식별자들의 배열이다 .

• FSMstate::m_iStateIDFSMstate 클래스의 이 인스턴스 ( 즉 이 상태 ) 를 식별하는데 쓰이는 고유한 식별자이다 .

Page 8: 유한 상태 기계 클래스 (FSM)

FSMstate ( 계속 )• FSMstate::GetID()

FSMstate 클래스의 이 인스턴스를 가리키는 식별자를 돌려준다 .

• FSMstate::AddTransition()FSMstate 의 이 인스턴스에 새로운 입력값들과 출력 상태 배열들을 추가하기 위한 수단이다 .

• FSMstate::DeleteTransition()기존의 입력값들과 그에 해당하는 출력 상태 식별자를 제거하기 위한 수단이다 .

• FSMstate::GetOutput()입력값을 받아서 상태전이를 수행하고 출력 상태의 식별자를 돌려주는 함수이다 .

Page 9: 유한 상태 기계 클래스 (FSM)

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 );};

Page 10: 유한 상태 기계 클래스 (FSM)

FSMclass ( 계속 )• FSMclass::m_map

FSMstate 객체들의 컬렉션 , STL <map> 으로 구현된다 .

• FSMclass::m_iCurrentStateFSM 의 현재 상태에 해당하는 FSMstate 객체의 상태 식별자이다 .

• FSMclass::GetState()FSMstate 에 담겨 있는 임의의 FSMstate 객체에 대한 포인터를 얻을 때 사용하는 함수이다 .

• FSMclass::GetCurrentState()현재 상태를 가리키는 고유한 식별자를 돌려준다 .

• FSMclass::SetCurrentState()다른 FSMstate 객체의 식별자를 현재 상태 식별자로 설정한다 .

Page 11: 유한 상태 기계 클래스 (FSM)

FSMclass ( 계속 )

• FSMclass::AddState()FSM 의 <map> 컨테이너에 새 FSM 객체 포인터들을 추가할 때 사용하는 함수이다 . 이 함수를 통해서 새로운 상태들을 추가하게 된다 .

• FSMclass::DeleteState()FSM 의 <map> 으로부터 FSM 객체 포인터를 제거하기 위한 수단이다 . 기존의 상태들을 제거할 때 이 함수를 사용한다 .

• FSMclass::StateTransition()주어진 입력값으로 상태 전이를 일으키고 그 결과로 출력 상태 식별자를 얻을 때 사용하는 함수이다 .

Page 12: 유한 상태 기계 클래스 (FSM)

<map>

• Key / value 를 하나의 쌍으로 취급하는 원소를 관리하는 컨테이너( 단 , key 중복은 허용 )

• 이 컨테이너들은 제공된 정렬 기준에 따라 자신의 원소를 자동적으로 key 를 기반으로 정렬하여 관리

Page 13: 유한 상태 기계 클래스 (FSM)

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;}

Page 14: 유한 상태 기계 클래스 (FSM)

FSM 의 예 - 적 상태 1

• 적의 영역에 들어오면 플레이어 따라감

가만히

따라다님

제자리로

적의

영역

안에

들어

플레이어가 적의 영역 안에서 벗어남

제자

리에

도착

Page 15: 유한 상태 기계 클래스 (FSM)

FSM 의 예 - 적 상태 2

• 적의 영역에 들어오면 도망다님

가만히

도망다님

제자리로

적의

영역

안에

들어

플레이어가 적의 영역 안에서 벗어남

제자

리에

도착

Page 16: 유한 상태 기계 클래스 (FSM)

FSM 의 예 - 적 상태 3

• 적의 영역에 들어오면 도망다님

보통 화남플레이어가 적의 영역 안에서 들어왔을

경우 플레이어가 화가 났음

플레이어가 적의 영역 안에서 벗어남

Page 17: 유한 상태 기계 클래스 (FSM)

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

보통

흥분

Page 18: 유한 상태 기계 클래스 (FSM)

• Message 구조체

FSM 의 예

struct MESSAGEOBJECT{

char strMessageName[256]; // 메세지 이름char strSender[256]; // 송신자char strReceiver[256]; // 수신자float fDeliveryTime; // 메시지 보내는 시간D3DXVECTOR3 vPos; // 플레이어 위치D3DXVECTOR3 vDir; // 플레이어의 방향벡터bool bAngry; // 플레이어의 상태

};

Page 19: 유한 상태 기계 클래스 (FSM)

FSM 의 예CCube(Player)

CMessageRouter

CFSMclass(Enemy)

CFSMstateCFrameView

위치데이터받아옴위치데이터가 담긴

메시지 전송

Player 가 위치한 영역에 있는 Enemy에게 “ 따라다니라” 는

메시지 전송

현재 위치한 영역 바로 전에 있던

영역에 있는 Enemy에게 “ 제자리에 가라”

는 메시지 전송

“ 따라다니라” 로 상태 전이

“ 제자리에 가라” 로 상태 전이

Enemy 가 제자리로 이동 중 제자리에 갔으면 “ 가만히

있어라” 로 상태 전이

Player 가 위치한 영역에 있는 Enemy에게 “ 도망다녀라” 는

메시지 전송“ 도망다녀라” 로

상태 전이

Page 20: 유한 상태 기계 클래스 (FSM)

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();

Page 21: 유한 상태 기계 클래스 (FSM)

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();

Page 22: 유한 상태 기계 클래스 (FSM)

THE END


Recommended