void FSM::setOnEnter(std::string state, std::function<void()> onEnter) { if (isContainState(state)) { _onEnter[state] = onEnter; } else { cocos2d::log("FSM::setOnEnter:no state named %s", state.c_str()); } }
FSM* FSM::addEvent(std::string eventName, std::string from, std::string to) { if ("" == eventName) { cocos2d::log("FSM::addEvent: eventName can't be empty!"); return nullptr; } if (!isContainState(from)) { cocos2d::log("FSM::addEvent: from state %s does not exit.", from.c_str()); return nullptr; } if (!isContainState(to)) { cocos2d::log("FSM::addEvent: to state %s does not exit.", to.c_str()); return nullptr; } std::unordered_map<std::string, std::string>& oneEvent = _events[eventName]; oneEvent[from] = to; return this; }
void FSM::changeToState(std::string state) { if (isContainState(state)) { _previousState = _currentState; _currentState = state; cocos2d::log("FSM::changeToState: %s -> %s.", _previousState.c_str(), _currentState.c_str()); if (_onEnters[state]) _onEnters[state](); } else { cocos2d::log("FSM::changeToState: no such state as %s, state unchanged.", state.c_str()); } }