封装了一下函数,更好懂了

This commit is contained in:
TrashGod 2024-06-28 19:45:02 +08:00
parent 58d2918d06
commit f48889bf23
3 changed files with 75 additions and 28 deletions

View File

@ -73,37 +73,35 @@ void stepBaseFSM(FSM *pFSM)
if(nextState && curState != nextState){ // 状态切换 if(nextState && curState != nextState){ // 状态切换
// 退子状态机 // 退子状态机
if(childFSMTable[curState] != NULL){ if(hasChildFSM(pFSM, curState)){
FSM *cFSM = childFSMTable[curState]; FSM *cFSM = getChildFSM(pFSM, curState);
int cFSMCurState = cFSM->privateVars->curState; exitFSM(cFSM);
cFSM->privateVars->fcns.exitActionTable[cFSMCurState](cFSM->data);
resetBaseFSM(cFSM);
} }
// 退状态机 // 退状态机
fcns->exitActionTable[curState](data); doExit(pFSM);
// 转移函数 // 转移函数
fcns->transitionTable[index](data); // 有特定的状态转移函数 doTransition(pFSM, index); // 有特定的状态转移函数
fcns->transitionGeneralAction(data); // 通用状态转移函数 doGeneralTransition(pFSM); // 通用状态转移函数
// 进状态机 // 进状态机
fcns->enterActionTable[nextState](data); doEnter(pFSM, nextState);
// 进子状态机,必须从默认状态开始 // 进子状态机,必须从默认状态开始
if(childFSMTable[nextState] != NULL){ if(hasChildFSM(pFSM, nextState)){
FSM *cFSM = childFSMTable[nextState]; FSM *cFSM = getChildFSM(pFSM, nextState);
Step(cFSM); Step(cFSM);
} }
setCurState(pFSM, nextState);
pFSM->privateVars->curState = nextState;
} }
else // 状态机没动 else // 状态机没动
{ {
if(childFSMTable[curState] == NULL){ if(!hasChildFSM(pFSM, curState)){
fcns->duringActionTable[curState](data); doDuring(pFSM);
} }
else{ else{
Step(childFSMTable[curState]); FSM *cFSM = getChildFSM(pFSM, curState);
Step(cFSM);
} }
} }
} }
@ -114,12 +112,6 @@ void stepBaseFSM(FSM *pFSM)
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* public 函数 */ /* public 函数 */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
void resetBaseFSM(FSM *pFSM)
{
pFSM->privateVars->curState = 0;
}
void _stepFSM(FSM *pFSM){ void _stepFSM(FSM *pFSM){
pFSM->publicFcns.step(pFSM); pFSM->publicFcns.step(pFSM);
} }
@ -138,6 +130,8 @@ void registerChildFSM(FSM *parent, FSM *child, int state){
parent->privateVars->childFSMTable[state] = child; parent->privateVars->childFSMTable[state] = child;
} }
const void *_getData(FSM* pFSM){ const void *_getData(FSM* pFSM){
return (const void *)pFSM->data; return (const void *)pFSM->data;
} }
@ -213,7 +207,6 @@ FSM* newBaseFSM(int numState){
pFSM->pureVtbl = pureVtbl; pFSM->pureVtbl = pureVtbl;
pFSM->publicFcns.step = stepBaseFSM; pFSM->publicFcns.step = stepBaseFSM;
pFSM->publicFcns.reset = resetBaseFSM;
return pFSM; return pFSM;
} }

View File

@ -60,7 +60,9 @@ typedef struct FSMPrivateVars
}FSMPrivateVars; }FSMPrivateVars;
/**
* @brief
*/
static void empty_func(){ static void empty_func(){
} }
@ -114,9 +116,61 @@ FSMPrivateVars* newFMSPrivateVars(int numState){
} }
static int hasChildFSM(FSM *pFSM, int state){
/* -------------------------------------------------------------------------- */
/* 以下开始是FSM私有函数 */
/* -------------------------------------------------------------------------- */
static inline FSM * getChildFSM(FSM *pFSM, int state){
return pFSM->privateVars->childFSMTable[state];
}
static inline int hasChildFSM(FSM *pFSM, int state){
return (pFSM->privateVars->childFSMTable[state] != NULL); return (pFSM->privateVars->childFSMTable[state] != NULL);
} }
static inline void setCurState(FSM *pFSM, int state){
pFSM->privateVars->curState = state;
}
static inline int getCurState(FSM *pFSM){
return pFSM->privateVars->curState;
}
static inline void doExit(FSM *pFSM){
pFSM->privateVars->fcns.exitActionTable[getCurState(pFSM)](pFSM->data);
}
static inline void doEnter(FSM *pFSM, int state){
pFSM->privateVars->fcns.enterActionTable[state](pFSM->data);
}
static inline void doDuring(FSM *pFSM){
pFSM->privateVars->fcns.duringActionTable[getCurState(pFSM)](pFSM->data);
}
static inline void doGeneralTransition(FSM *pFSM){
pFSM->privateVars->fcns.transitionGeneralAction(pFSM->data);
}
static inline void doTransition(FSM *pFSM, int index){
pFSM->privateVars->fcns.transitionTable[index](pFSM->data);
}
static void exitFSM(FSM *pFSM)
{
doExit(pFSM);
int curState = getCurState(pFSM);
if(hasChildFSM(pFSM, curState)){
exitFSM(getChildFSM(pFSM, curState));
}
setCurState(pFSM, 0);
}
#endif #endif

View File

@ -134,7 +134,7 @@ typedef struct FSM
void stepBaseFSM(FSM *pFSM); void stepBaseFSM(FSM *pFSM);
void constructFSM(FSM* pFSM); void constructFSM(FSM* pFSM);
FSM* newBaseFSM(int numState); FSM* newBaseFSM(int numState);
void resetBaseFSM(FSM *pFSM); void resetFSM2Idle(FSM *pFSM);
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */