封装了一下函数,更好懂了
This commit is contained in:
parent
58d2918d06
commit
f48889bf23
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
|
Loading…
Reference in New Issue