C ++의 유한 상태 머신


16

따라서 FSM을 사용하여 게임 상태 관리, FSM과 같은 작업 및 스택 또는 상태 집합을 사용하여 빌드하는 방법 에 대해 많이 읽었습니다 . 나는 모든 것을 겪었습니다. 그러나 나는 그 목적을 위해 실제적이고 잘 설계된 FSM 구현을 작성하는 데 붙어 있습니다. 구체적으로, 상태들 사이의 천이 문제를 어떻게 깨끗하게 해결하고, 어떻게 상태가 다른 상태의 데이터를 사용할 수 있어야 하는가 등이다. 누구나 C ++ 또는 더 나은 코드 예제로 구현을 디자인하고 작성하는 데 대한 팁이 있습니까?


: 메타에서이 토론을 기반으로 편집 태그 meta.gamedev.stackexchange.com/questions/103/...
lathomas64

답변:


12

Thor Alexander가 편집 한 "Massively Multiplayer Game Development"의 장을 기반으로 FSM을 작성했습니다. 내부에는 "믿을 수있는 캐릭터를위한 병렬 상태 머신"이라는 레이블이 붙은 장이 있습니다. 이것은 파이썬으로 작성되었지만 개념은 C ++로 쉽게 번역 할 수 있습니다. 게임 상태가 아닌 캐릭터 상태에 관한 것이더라도 이것을 확인하는 것이 좋습니다.

내가 만든 것은 여기에 있습니다 : https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager StateManager에서 구현 세부 사항을 확인하지만 기본적으로 다른 '기본 상태'가 있습니다. 사용하다. 그런 다음 거기에서 캐릭터로 전환하는 특정 상태가 있으므로 모든 상태는 클래스입니다. 그런 다음 한 상태에서 다른 상태로 전환 할 수 있는지 확인한 다음 '입력'하면 스위치를 만들고 상태로 이동 한 후 이벤트를 넣는 것과 같은 작업을 쉽게 수행 할 수 있습니다. 나는 이것이 지금까지 게임에서 실제로 잘 작동한다는 것을 알았습니다.

내가 구현 한 것은이 책이 병렬 상태 머신이라고 부르는 것입니다. 여러 개의 fsm이 함께 작동하는 것이 필수적입니다.이 경우 하나의 상태로 전환하여 다른 모든 상태 (예 : CreatureState_Dead)를 차단할 수 있습니다. 나는 그것이 실제로 당신을 도울 것이라고 생각하지 않기 때문에 너무 자세하게 설명하지 않을 것이지만, 당신이 원한다면 정교해질 수 있습니다.




8

예를 들어 게임 AI 프로그래밍 (http://www.ai-junkie.com/books/toc_pgaibe.html)에는 구현이 간단하고 기본 사항 만 처리하는 구현 예제가 있습니다. 전환은 단일 메서드 호출 (먼저 Enter (), 업데이트 할 때마다 Execute (), 전환 할 때 Exit ())으로 처리됩니다.> 그 외에도 필요한 것이 무엇인지 모르겠습니다. 한 번만 실행하고 다음 상태로 순서대로 이동하도록 설계된 자체 상태로 더 복잡한 전환을 구현합니다.

AI를 위해 FSM을보고 있다고 가정합니다. 행동 트리를 살펴 보는 것이 좋습니다. AIGameDev 에는 훌륭한 기사가 있습니다.


1
이 예제는 그의 사이트에서도 볼 수 있습니다 : ai-junkie.com/architecture/state_driven/tut_state1.html
Zolomon

5

C ++ 템플릿 마법과 잠재적으로 긴 컴파일 시간이 문제가되지 않고 이미 Boost가 설치되어있는 경우 :

Boost는 이제 상태 구조와 별도로 전이 테이블을 설정할 수 있다는 이점 이있는 효율적인 ( 속도 및 크기의 ) 메타 상태 머신 라이브러리 를 가지고 있습니다. 여러 상태에서 다른 상태로 전환 할 때를 설명하는 테이블이 있습니다. . 상태 머신에서 무슨 일이 일어나고 있는지 이해하려면 그것을 읽어야합니다.

또 다른 장점은 고성능 소프트웨어가 포함 된 내장 소프트웨어에서도 여러 기업에서 테스트 한 것입니다 (자세한 내용은 부스트 ​​메일 링리스트 참조). 구현이 이미 있으므로 Just Works (tm) 인 일반 상태 머신 구현이 필요한 경우 좋은 선택 일 수 있습니다.

직교 상태 (병렬 상태) 및 기타 유용한 UML 기반 기능도 지원합니다.

또한 전환 테이블을 표현하는 몇 가지 방법을 제공합니다. 하나는 실험적이지만 표현력 측면에서는 흥미 롭습니다 (현재 컴파일러 성능에 의해 제한 되기는하지만 너무 나쁩니다!)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.