Мне было интересно, есть ли способ, которым я мог бы написать какой-то «общий» FSM для игры с C++ ?.Общий FSM для игры на C++?
В моей игре есть компонентный дизайн, поэтому я использую компонент 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) Создание fsmTable из xml-файла очень просто, я имею в виду, что это просто куча целых чисел, которые можно загрузить для создания матрицы 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
и т.п?). Это позволило бы мне пойти «Data Driven» и построить, например, мои общие FSM из файлов.
Что вы, люди, предлагаете?
Вы посмотрели на библиотеку авторизованного автомата? –