用于C ++游戏的通用FSM?

时间:2010-04-08 22:35:11

标签: c++ fsm

我想知道是否有一种方法可以为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;
    }
}

如果我想将“操作”和开关设为通用,该怎么办?

这是为了避免为每个GameEntity创建不同的FSM组件类? (gecFSMZombiegecFSMDryadgecFSMBoss等?)。这样我就可以使用“数据驱动”并从文件中构建我的通用FSM。

你们有什么建议?

1 个答案:

答案 0 :(得分:1)

查看Boost状态图库。 (以前称为boost :: fsm) 它附带了一个非常漂亮的照相机示例。