C ++の有限状態マシン


16

そのため、FSMを使用してゲームの状態管理を行うこと、FSMとは何か、1つを構築するためにスタックまたは状態のセットを使用することについて多くのことを読みました。私はすべてを経験しました。しかし、私はそのためにFSMの実際の適切に設計された実装を書くことにこだわっています。具体的には、どのようにして状態間を移行する問題をどのようにきれいに解決するのか、(どのように)状態が他の状態からのデータを使用できるようにするのか、などです。C ++で実装を設計および作成するためのヒントや、さらに良いコード例はありますか?


:メタでこの議論に基づいて編集されたタグmeta.gamedev.stackexchange.com/questions/103/...
lathomas64

回答:


12

Thor Alexanderが編集した「Massively Multiplayer Game Development」の章に基づいてFSMを作成しました。内部には、「信じられるキャラクターのための並列状態マシン」というラベルの章があります。これはpythonで書かれていますが、概念はC ++に簡単に翻訳できます。これはゲームの状態ではなくキャラクターの状態に関するものですが、これを確認することを強くお勧めします。

私が作成したものはこちらです:https : //github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager 実装の詳細についてはStateManagerの下を見てください。使用する。その後、そこからキャラクターとして移行する特定の状態が得られるため、すべての状態がクラスになります。次に、ある状態から別の状態に移行できるかどうかを確認し、「Enter」で切り替えを行うと、状態に移行した後にイベントを入れるなどのことも簡単に行えます。これはこれまでのゲームで非常にうまく機能していることがわかりました。

私が実装したのは、本がパラレルステートマシンと呼んでいるものです。これは、複数のfsmが連携して動作するために不可欠です。この場合、1つの状態に遷移できます。私はそれが本当にあなたに役立つとは思わないので、あまり詳細には行きませんが、もしあなたが望むなら、私は詳しく説明することができます。


1
:に移動したコードのように見えるgithub.com/swganh/mmoserver/tree/master/src/ZoneServer/...
DK_


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
ゾロモン

5

C ++テンプレートの魔法と潜在的な長いコンパイル時間が問題ではなく、すでに動作するようにBoostがインストールされている場合

Boostは効率的です(速度とサイズメタステート・マシンライブラリの利点持っているあなたは状態の構造とは別に遷移表を設定せ、あなたが他の状態を魔女しウィッヒ状態から行きたときに説明し、テーブルを持っていました: 。ステートマシンで何が起こっているのかを理解するには、それを読むだけです。

もう1つの利点は、高性能ソフトウェアを備えた組み込みソフトウェアでも、複数の企業によってテストされていることです(詳細については、ブーストメーリングリストを参照してください)。実装はすでに存在しているため、Just Works(tm)である一般的なステートマシンの実装が必要な場合は、適切な選択になる可能性があります。

また、直交状態(パラレル状態)およびその他の便利なUMLベースの機能もサポートしています。

また、遷移表を表現するためのいくつかの方法も提供します。1つは実験的ですが、表現力の面では興味深いものです(ただし、現在のコンパイラのパフォーマンスによって制限されます-あまりにも悪い!)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.