diff options
Diffstat (limited to 'src/libjin/ai/je_state_machine.h')
-rw-r--r-- | src/libjin/ai/je_state_machine.h | 199 |
1 files changed, 141 insertions, 58 deletions
diff --git a/src/libjin/ai/je_state_machine.h b/src/libjin/ai/je_state_machine.h index 1765e97..f53137e 100644 --- a/src/libjin/ai/je_state_machine.h +++ b/src/libjin/ai/je_state_machine.h @@ -7,6 +7,7 @@ #include <map> #include <vector> +#include "../common/je_temporary.h" #include "../common/je_types.h" #include "../common/je_object.h" @@ -14,23 +15,14 @@ namespace JinEngine { namespace AI { + // Grab from Unity. /// /// A single layer statemachine. /// class StateMachine : public Object { - public: - - /// - /// - /// - enum Mode - { - Iterative, ///< Process until reach condition failed.(May cause endless loop) - Stepwise ///< Process one state each update. - }; - + public: /// /// /// @@ -48,6 +40,113 @@ namespace JinEngine BOOL_NOT = 0x100, }; + private: + /// + /// + /// + enum ParameterType + { + Int, ///< A integer value. + Float, ///< A float value. + Bool, ///< A bool value. + Trigger ///< A trigger will be reset to false after activated. + }; + + /// + /// + /// + union ParameterValue + { + int _int; ///< 0 by default. + float _float; ///< 0 by default. + bool _bool; ///< false by default. + bool _trigger; ///< false by default. + }; + + /// + /// Traslation's condition. + /// + struct Condition + { + std::string parameter; + ParameterExpression expression; + ParameterType type; + ParameterValue value; + }; + + public: + /// + /// + /// + enum Mode + { + Iterative, ///< Process until reach condition failed.(May cause endless loop) + Stepwise ///< Process one state each update. + }; + + struct Conditions : Temporary + { + Conditions() + { + } + + Conditions(const Conditions& condition) + { + conditions = condition.conditions; + } + + void operator = (const Conditions& condition) + { + conditions = condition.conditions; + } + + inline Conditions& andi(const std::string& parameter, ParameterExpression expression, int value) + { + Condition condition; + condition.expression = expression; + condition.parameter = parameter; + condition.value._int = value; + condition.type = ParameterType::Int; + conditions.push_back(condition); + return *this; + } + + inline Conditions& andf(const std::string& parameter, ParameterExpression expression , float value) + { + Condition condition; + condition.expression = expression; + condition.parameter = parameter; + condition.value._int = value; + condition.type = ParameterType::Float; + conditions.push_back(condition); + return *this; + } + + inline Conditions& andb(const std::string& parameter, ParameterExpression expression, bool value) + { + Condition condition; + condition.expression = expression; + condition.parameter = parameter; + condition.value._int = value; + condition.type = ParameterType::Bool; + conditions.push_back(condition); + return *this; + } + + inline Conditions& andt(const std::string& parameter) + { + Condition condition; + condition.parameter = parameter; + condition.type = ParameterType::Trigger; + conditions.push_back(condition); + return *this; + } + + private: + friend class StateMachine; + std::vector<Condition> conditions; + }; + /// /// /// @@ -56,6 +155,11 @@ namespace JinEngine /// /// /// + typedef void(StateUpdateCallback)(void* userdata); + + /// + /// + /// typedef void(StateTranslateCallback)(void* userdata); /// @@ -117,26 +221,11 @@ namespace JinEngine /// Add a state. /// void addState(const std::string& name); - - /// - /// - /// - void addTransitioni(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression condition, int value); - - /// - /// - /// - void addTransitionf(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression condition, float value); - - /// - /// - /// - void addTransitionb(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression condition, bool value); - + /// /// /// - void addTransitiont(const std::string& stateFrom, const std::string& stateTo, const std::string& name); + void addTransition(const std::string& from, const std::string& to, const Conditions& conditions); /// /// Set parameter value. @@ -169,6 +258,11 @@ namespace JinEngine void addEnterListener(const std::string& state, StateChangeCallback* callback); /// + /// Call state update function. + /// + void addUpdateListener(const std::string& state, StateUpdateCallback* callback); + + /// /// /// void addExitListener(const std::string& state, StateChangeCallback* callback); @@ -186,6 +280,11 @@ namespace JinEngine /// /// /// + void setUpdateListener(SingleStateCallback* callback); + + /// + /// + /// void setExitListener(SingleStateCallback* callback); /// @@ -195,45 +294,19 @@ namespace JinEngine private: - enum ParameterType - { - Int, ///< A integer value. - Float, ///< A float value. - Bool, ///< A bool value. - Trigger ///< A trigger will be reset to false after activated. - }; - - union ParameterValue - { - int _int; ///< 0 by default. - float _float; ///< 0 by default. - bool _bool; ///< false by default. - bool _trigger; ///< false by default. - }; - struct Parameter { ParameterType type; ParameterValue value; }; - /// - /// Traslation's condition. - /// - struct Condition - { - std::string parameter; - ParameterExpression expression; - ParameterValue value; - }; - /// /// Translate to another state. /// struct Transition { - Condition condition; ///< Condition to active transition. - std::string state; ///< State to translate to. + Conditions conditions; ///< Condition to active transition. + std::string state; ///< State to translate to. }; /// @@ -284,6 +357,11 @@ namespace JinEngine /// /// /// + std::map<std::string, StateUpdateCallback*> mOnUpdateState; + + /// + /// + /// std::map<std::string, StateChangeCallback*> mOnExitState; /// @@ -294,8 +372,13 @@ namespace JinEngine /// /// /// - SingleStateCallback* mEnterCallback; - + SingleStateCallback* mEnterCallback; + + /// + /// + /// + SingleStateCallback* mUpdateCallback; + /// /// /// |