C++ を使用したゲーム用にある種の「汎用」FSM をコーディングできる方法があるかどうか疑問に思っていました。
私のゲームはコンポーネント指向の設計なので、FSM コンポーネントを使用します。
私の有限状態マシン (FSM) コンポーネントは、多かれ少なかれこのように見えます。
class gecFSM : public gecBehaviour
{
public:
//Constructors
gecFSM() { state = kEntityState_walk; }
gecFSM(kEntityState s) { state = s; }
//Interface
void setRule(kEntityState initialState, int inputAction, kEntityState resultingState);
void performAction(int action);
private:
kEntityState fsmTable[MAX_STATES][MAX_ACTIONS];
};
この FSM コンポーネントを汎用にする方法について、ご意見/アイデアや提案をお待ちしております。ジェネリックとは、次のことを意味します。
1) xml ファイルから fsmTable を作成するのは非常に簡単です。つまり、MAX_STATESxMAX_ACTION マトリックスを作成するためにロードできる整数の集まりです。
void gecFSM::setRule(kEntityState initialState, int inputAction, kEntityState resultingState)
{
fsmTable[initialState][inputAction] = resultingState;
}
2)しかし、「アクションを実行」メソッドはどうですか?
void gecFSM::performAction(int action)
{
switch( smTable[ ownerEntity->getState() ][ action ] )
{
case WALK:
/*Walk action*/
break;
case STAND:
/*Stand action*/
break;
case JUMP:
/*Jump action*/
break;
case RUN:
/*Run action*/
break;
}
}
「アクション」とスイッチを汎用にしたい場合はどうすればよいですか?
これは、それぞれに対して異なる FSM コンポーネント クラスを作成することを避けるためGameEntity
です。( gecFSMZombie
、gecFSMDryad
などgecFSMBoss
?)。これにより、「データ駆動型」になり、たとえばファイルから汎用 FSM を構築できます。
あなたは何を提案しますか?