加入状态机
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
#include <gai_fsm.h>
|
||||
|
||||
static os_int_t FindNextState(gai_fsm_t* self, os_list_t* transitions, void* ud){
|
||||
os_list_node_t * p_node = 0;
|
||||
for(p_node = transitions->next; p_node!=transitions; p_node= p_node->next){
|
||||
gai_fsm_transition_t* p_transition = os_list_member_of(p_node, gai_fsm_transition_t, node);
|
||||
if(p_transition->evaluator(self, p_transition, ud)){
|
||||
return p_transition->to_state_id;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void gai_fsm_update(gai_fsm_t* self, void* userdata){
|
||||
if(!self->current_state_p){
|
||||
return;
|
||||
}
|
||||
gai_action_status_t status = gai_fsm_status(self);
|
||||
if(status==kGaiActionStatus_Running){
|
||||
gai_action_Update(&self->current_state_p->action, userdata);
|
||||
}else if(status==kGaiActionStatus_Terminated){
|
||||
os_int_t to_state_id = FindNextState(self, &self->current_state_p->transition_list, userdata);
|
||||
gai_fsm_state_t* p_next_state = gai_fsm_find_state(self, to_state_id);
|
||||
if(p_next_state){
|
||||
gai_action_Cleanup(&self->current_state_p->action);
|
||||
self->current_state_p = p_next_state;
|
||||
gai_action_Initialize(&self->current_state_p->action);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user