1 / 22

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

유한 상태 기계 클래스 (FSM). 이주영 , 전현수. 목차. 유한상태기계란 ? 게임의 AI 에 적용 클래스 정의 <map> 설명. 유한상태기계란 ?. Finite state machine, FSM 유한한 개수의 상태들로 구성된 하나의 간단한 기계 하나의 ‘ 입력 ’ 을 받고 그에 의거해서 현재 상태로부터 다른 어떤 상태로 ‘ 전이 ’ 하는 식으로 작동. 게임의 AI 에 적용. 보통. 플레이어의 공격. 플레이어 떠남 또는 몬스터 치료됨. 광분. 흥분. 몬스터 치료됨. 플레이어 등장.

merle
Télécharger la présentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 유한 상태 기계 클래스(FSM) 이주영, 전현수

  2. 목차 • 유한상태기계란? • 게임의 AI에 적용 • 클래스 정의 • <map> 설명

  3. 유한상태기계란? • Finite state machine, FSM • 유한한 개수의 상태들로 구성된 하나의 간단한 기계 • 하나의 ‘입력’을 받고 그에 의거해서 현재 상태로부터 다른 어떤 상태로 ‘전이’하는 식으로 작동

  4. 게임의 AI에 적용 보통 플레이어의 공격 플레이어 떠남 또는 몬스터 치료됨 광분 흥분 몬스터 치료됨 플레이어 등장 몬스터 다침 몬스터 다침 몬스터 치료됨 분노 불쾌 플레이어의 공격 몬스터 치료됨

  5. 클래스 정의 • 구성 • FSMstate 하나의 상태를 의미하는 클래스 • FSMclass 임의의개수의 FSMstate들로 구성된 하나의 상태 기계를 의미하는 클래스 • 이 두 클래스가 연동함으로써 하나의 범용적인 유한 상태 기계를 위한 기능성이 만들어진다.

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

  7. FSMstate (계속) • FSMstate::m_usNumberOfTransitions이 상태가 지원할 수 있는 상태 전이들의 개수로 입력과 출력 배열의 크기가 이 변수에 의해 결정된다. • FSMstate::m_piInputs상태 전이에 쓰이는 입력값들을 담은 배열이다. • FSMstate::piOutputState상태 전이의 결과로 결정되는 출력 상태들을 가리키는 식별자들의 배열이다. • FSMstate::m_iStateIDFSMstate 클래스의 이 인스턴스(즉 이 상태)를 식별하는데 쓰이는 고유한 식별자이다.

  8. FSMstate (계속) • FSMstate::GetID()FSMstate 클래스의 이 인스턴스를 가리키는 식별자를 돌려준다. • FSMstate::AddTransition()FSMstate의 이 인스턴스에 새로운 입력값들과 출력 상태 배열들을 추가하기 위한 수단이다. • FSMstate::DeleteTransition()기존의 입력값들과 그에 해당하는 출력 상태 식별자를 제거하기 위한 수단이다. • FSMstate::GetOutput()입력값을 받아서 상태전이를 수행하고 출력 상태의 식별자를 돌려주는 함수이다.

  9. FSMclass 클래스 정의 • class FSMclass{ State_Map m_map; // 이 FSM의 모든 상태들을 담은 맵int m_iCurrentState; // 현재 상태의 m_iStateIDpublic: 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 );};

  10. FSMclass (계속) • FSMclass::m_mapFSMstate 객체들의 컬렉션, STL <map>으로 구현된다. • FSMclass::m_iCurrentStateFSM의 현재 상태에 해당하는 FSMstate 객체의 상태 식별자이다. • FSMclass::GetState()FSMstate에 담겨 있는 임의의 FSMstate 객체에 대한 포인터를 얻을 때 사용하는 함수이다. • FSMclass::GetCurrentState()현재 상태를 가리키는 고유한 식별자를 돌려준다. • FSMclass::SetCurrentState()다른 FSMstate 객체의 식별자를 현재 상태 식별자로 설정한다.

  11. FSMclass (계속) • FSMclass::AddState()FSM의 <map> 컨테이너에 새 FSM 객체 포인터들을 추가할 때 사용하는 함수이다. 이 함수를 통해서 새로운 상태들을 추가하게 된다. • FSMclass::DeleteState()FSM의 <map>으로부터 FSM 객체 포인터를 제거하기 위한 수단이다. 기존의 상태들을 제거할 때 이 함수를 사용한다. • FSMclass::StateTransition()주어진 입력값으로 상태 전이를 일으키고 그 결과로 출력 상태 식별자를 얻을 때 사용하는 함수이다.

  12. <map> • Key / value 를 하나의 쌍으로 취급하는 원소를 관리하는 컨테이너(단, key 중복은 허용) • 이 컨테이너들은 제공된 정렬 기준에 따라 자신의 원소를 자동적으로 key를 기반으로 정렬하여 관리

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

  14. FSM의 예 - 적 상태1 • 적의 영역에 들어오면 플레이어 따라감 가만히 제자리에 도착 적의 영역 안에 들어옴 제자리로 따라다님 플레이어가 적의 영역 안에서 벗어남

  15. FSM의 예 - 적 상태2 • 적의 영역에 들어오면 도망다님 가만히 제자리에 도착 적의 영역 안에 들어옴 제자리로 도망다님 플레이어가 적의 영역 안에서 벗어남

  16. FSM의 예 - 적 상태3 • 적의 영역에 들어오면 도망다님 플레이어가 적의 영역 안에서 벗어남 화남 보통 플레이어가 적의 영역 안에서 들어왔을 경우 플레이어가 화가 났음

  17. FSM의 예 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Enemy 24 25 26 27 28 29 ID 0 ~ 35 보통 30 31 32 33 34 35 흥분

  18. FSM의 예 • Message 구조체 struct MESSAGEOBJECT { char strMessageName[256]; // 메세지 이름 char strSender[256]; // 송신자 char strReceiver[256]; // 수신자 float fDeliveryTime; // 메시지 보내는 시간 D3DXVECTOR3 vPos; // 플레이어 위치 D3DXVECTOR3 vDir; // 플레이어의 방향벡터 bool bAngry; // 플레이어의 상태 };

  19. FSM의 예 CCube (Player) CFrameView CMessage Router CFSMclass (Enemy) CFSMstate Player가 위치한 영역에 있는 Enemy에게 “도망다녀라”는 메시지 전송 위치데이터받아옴 위치데이터가 담긴 메시지 전송 “도망다녀라”로 상태 전이 Player가 위치한 영역에 있는 Enemy에게 “따라다니라”는 메시지 전송 “따라다니라”로 상태 전이 현재 위치한 영역 바로 전에 있던 영역에 있는 Enemy에게 “제자리에 가라”는 메시지 전송 “제자리에 가라”로 상태 전이 Enemy가 제자리로 이동 중 제자리에 갔으면 “가만히 있어라”로 상태 전이

  20. FSM의 예 CCube CFSMstate + m_pVB; + m_pIB; + m_pd3dDevice; + m_matWorld; + m_vOriginTrans; + m_vTrans; + m_vTargetTrans; + m_fVelocity; + m_usNumberOfTransitions; + m_pnInouts; + m_pnOutoutState; + m_nStateID; + CCube(); + ~Ccube(); + Create(); + SetLocation(); + FrameMove(); + Render(); + Release(); + CFSMstate(); + ~CFSMstate(); + GetID(); + AddTransition(); + GetOutput();

  21. FSM의 예 CFSMclass CMessageRouter + m_pd3dDevice; + m_StateMap; + m_nCurrentState; + m_Enemy; + m_fVelocity; + m_pd3dDevice + m_nEnemyNum; + m_nBeforeLotID; + m_nCurrentLotID; + CFSMclass(); + ~CFMSclass(); + GetCurrentState(); + SetCurrentState(); + GetState(); + AddState(); + DeleteState(); + StateTransition(); + ReceiveMessage(); + CMessageRouter(); + ~CMessageRouter(); + Create(); + FrameMove(); + GetPlayerLocationID(); + Render(); + Release();

  22. THE END

More Related