From 9c5dc853ec5ceba809e7f02cdde87c90544a45e1 Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 6 Nov 2018 16:12:56 +0800 Subject: =?UTF-8?q?*=E7=8A=B6=E6=80=81=E6=9C=BA=E6=9D=A1=E4=BB=B6=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=A4=9A=E9=87=8D=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/libjin/ai/je_state_machine.h | 199 +++++++++++++++++++++++++++------------ 1 file changed, 141 insertions(+), 58 deletions(-) (limited to 'src/libjin/ai/je_state_machine.h') 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 #include +#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,11 +40,123 @@ 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 conditions; + }; + /// /// /// typedef void(StateChangeCallback)(void* userdata); + /// + /// + /// + typedef void(StateUpdateCallback)(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. @@ -168,6 +257,11 @@ namespace JinEngine /// void addEnterListener(const std::string& state, StateChangeCallback* callback); + /// + /// Call state update function. + /// + void addUpdateListener(const std::string& state, StateUpdateCallback* callback); + /// /// /// @@ -183,6 +277,11 @@ namespace JinEngine /// void setEnterListener(SingleStateCallback* callback); + /// + /// + /// + void setUpdateListener(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. }; /// @@ -281,6 +354,11 @@ namespace JinEngine /// std::map mOnEnterState; + /// + /// + /// + std::map mOnUpdateState; + /// /// /// @@ -294,8 +372,13 @@ namespace JinEngine /// /// /// - SingleStateCallback* mEnterCallback; - + SingleStateCallback* mEnterCallback; + + /// + /// + /// + SingleStateCallback* mUpdateCallback; + /// /// /// -- cgit v1.1-26-g67d0