質問
これは、FSMの状態を組み合わせるために、 "修正" となっていますか?
あなたが持つオブジェクトを持っていると言います
enum State
{
State1 = 1 << 0,
State2 = 1 << 1,
State3 = 1 << 2
} ;
ちょうどので、それはのように、状態を結合することは理にかなっていることが起こる。
State myState = State1 | State2 ;
しかし、FSMの理論的には、この違法なのですか?
これは、より多くのショートカットです。
ランニング、ウォーキング、そしてジャンプ:あなたは3つの状態を持っていると言います。次に、第4の状態の焼成を持っています。
あなたは実行し、火は、歩くと火災、ジャンプや火災できるようにする必要があります。代わりに、6つの状態RunningFiring、WalkingFiring、JumpingFiringを作る、私は(どんなジャンプの状態を実行ウォーキング)
とを組み合わせたの焼成状態したいと思います私はちょうど「第4の状態」のためのBOOLを使用することができます知っているが、それでもwronger思えませんか? 「側の状態を...」を有する。
解決
私は13かそこらと属性をモデル化するために使用されているビットマスクの例を見ていた時に戻ってゲームプログラミングの本を読んで覚えています。
のようなものconst int HAS_WEAPON = 0x1;
const int WEARING_ARMOR = 0x2;
const int IS_ALIENT = 0x4;
のように。そして、あなたはintとしてNPCの属性を表すことができ、あなたはマスクなどの属性を使用して/クリア個々のビットを設定することができます。
さて、もちろん、bitpackingはそれほど一般的なメモリが安くなってきた、そのように私たちはただの属性を表すために、ブール値を使用することができるようです。いずれにせよ、これはあなたが何をしたいかに似ているようだ。
属性は、しかしながら、ステートマシン内の状態と同じではありません。ステートマシンでは、一つの状態であることは、あなたが他の状態である必要はないことを意味します。あなたが相互に排他的ではないもののバッグを持っているのであれば、ステートマシンは、おそらく行く方法ではありません。追加する各バイナリ値を持つ属性は、マシン全体のサイズを2倍になることを考えてみます。
あなたが言うとき、
私はちょうどのためのBOOLを使用することができます知っています 「第4の状態」、それはいないようです でもwronger?上の「状態を有します サイド.. "
それはあなたが表現している情報を考えている方法に問題があるかもしれないことを私に示します。確かに、「焼成」状態の良い候補のように聞こえる、とあなたは常にどちらかの発火や他の何かをやっている場合、それは、ステートマシンとして動作します。しかし、「焼成」は、既存のシステム内のすべての状態と組み合わせることができるならば、それは本当に代わりに属性としてモデル化する任意の害をしますか?
他のヒント
私の意見では、その後、あなたのステートマシンは、あまりにも多くを行うために始めています。あなたは、「親」ステートマシンが別の状態にある間や状態を変更しない場合があり1つのタスクに焦点を当てている別のステートマシンにいくつかの機能/ロジックを移動することを検討する必要がある場合があります。
状態のAND-分解(だけでなく、通常の排他的論理和分解)の一例であるように私には思えます。 UMLモデル直交地域でこのような状況。したがって、この場合には次の2つの直交する領域を有します。最初のものは、通常の実行中または国家、ウォーキング、そしてジャンプが含まれています。他の直交領域は状態の焼成が含まれています。このステートマシンは、次の組み合わせができます。ランニング|焼成、ウォーキング|焼成、及びジャンプ|焼成
次の2台のステートマシン(あなたは2つの状態変数を必要とする)と、このような二つの直交領域を近似することができます。今のところ、焼成のためのステートマシンは、1つの状態のみを持っているが、私はあなたはそれが適切な状態のマシンになりますので、補完的な状態は、「焼成ません」で終わるだろうと確信しています。
ミロSamek、 state-machine.comする