1

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です。( gecFSMZombiegecFSMDryadなどgecFSMBoss?)。これにより、「データ駆動型」になり、たとえばファイルから汎用 FSM を構築できます。

あなたは何を提案しますか?

4

1 に答える 1

1

Boost ステートチャート ライブラリをご覧ください。(以前は boost::fsm と呼ばれていました) 非常に優れた写真カメラの例が付属しています。

于 2010-04-08T23:12:29.180 に答える