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

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

View File

@ -60,7 +60,9 @@ typedef struct FSMPrivateVars
}FSMPrivateVars;
/**
* @brief
*/
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);
}
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

View File

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