diff options
Diffstat (limited to 'src/libjin/ai')
-rw-r--r-- | src/libjin/ai/je_behavior_tree.h | 2 | ||||
-rw-r--r-- | src/libjin/ai/je_state_machine.cpp | 96 | ||||
-rw-r--r-- | src/libjin/ai/je_state_machine.h | 38 |
3 files changed, 85 insertions, 51 deletions
diff --git a/src/libjin/ai/je_behavior_tree.h b/src/libjin/ai/je_behavior_tree.h index cb518f0..8621696 100644 --- a/src/libjin/ai/je_behavior_tree.h +++ b/src/libjin/ai/je_behavior_tree.h @@ -9,8 +9,6 @@ namespace JinEngine namespace AI { - - /// /// /// diff --git a/src/libjin/ai/je_state_machine.cpp b/src/libjin/ai/je_state_machine.cpp index 8f8bd81..9b766b5 100644 --- a/src/libjin/ai/je_state_machine.cpp +++ b/src/libjin/ai/je_state_machine.cpp @@ -88,7 +88,6 @@ namespace JinEngine mMode = mode; } - //ģʽ״̬ void StateMachine::update() { switch (mMode) @@ -109,10 +108,42 @@ namespace JinEngine Parameter& p = it->second; switch (p.type) { - case ParameterType::Int: return p.value._int == condition.value._int; - case ParameterType::Float: return p.value._float == condition.value._float; - case ParameterType::Bool: return p.value._bool == condition.value._bool; - case ParameterType::Trigger: return p.value._trigger == true; + case ParameterType::Int: + { + int value = p.value._int; + int cvalue = condition.value._int; + bool is = false; + is |= ((condition.expression & ParameterExpression::INT_BIGGER) ? value > cvalue : false); + is |= ((condition.expression & ParameterExpression::INT_EQUAL) ? value == cvalue : false); + is |= ((condition.expression & ParameterExpression::INT_SMALLER) ? value < cvalue : false); + return is; + } + case ParameterType::Float: + { + float value = p.value._float; + float cvalue = condition.value._float; + bool is = false; + is |= ((condition.expression & ParameterExpression::FLOAT_BIGGER) ? value > cvalue : false); + is |= ((condition.expression & ParameterExpression::FLOAT_EQUAL) ? value == cvalue : false); + is |= ((condition.expression & ParameterExpression::FLOAT_SMALLER) ? value < cvalue : false); + return is; + } + case ParameterType::Bool: + { + bool value = p.value._bool; + bool cvalue = condition.value._bool; + bool is = false; + is |= ((condition.expression & ParameterExpression::BOOL_IS) ? value == cvalue : false); + is |= ((condition.expression & ParameterExpression::BOOL_NOT) ? value != cvalue : false); + return is; + } + case ParameterType::Trigger: + { + bool is = p.value._trigger; + // Close trigger. + p.value._trigger = false; + return is; + } } return false; } @@ -197,7 +228,7 @@ namespace JinEngine } } - void StateMachine::addTransitioni(const std::string& stateFrom, const std::string& stateTo, const std::string& name, int value) + void StateMachine::addTransitioni(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression expression, int value) { map<string, State>::iterator it; it = mStates.find(stateFrom); @@ -224,17 +255,18 @@ namespace JinEngine Parameter& parameter = itp->second; if (parameter.type != ParameterType::Int) { - jin_log_error("The type of parameter called %s is %s, but the transition gives a int value.", name, parameterTypeString(parameter.type)); + jin_log_error("The type of parameter %s is %s, but the transition gives a int value.", name, parameterTypeString(parameter.type)); return; } - Transition trasition; - trasition.condition.parameter = name; - trasition.condition.value._int = value; - trasition.state = stateTo; - from.transitions.push_back(trasition); + Transition transition; + transition.condition.parameter = name; + transition.condition.expression = expression; + transition.condition.value._int = value; + transition.state = stateTo; + from.transitions.push_back(transition); } - void StateMachine::addTransitionf(const std::string& stateFrom, const std::string& stateTo, const std::string& name, float value) + void StateMachine::addTransitionf(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression expression, float value) { map<string, State>::iterator it; it = mStates.find(stateFrom); @@ -261,17 +293,18 @@ namespace JinEngine Parameter& parameter = itp->second; if (parameter.type != ParameterType::Float) { - jin_log_error("The type of parameter called %s is %s, but the transition gives a float value.", name, parameterTypeString(parameter.type)); + jin_log_error("The type of parameter %s is %s, but the transition gives a float value.", name, parameterTypeString(parameter.type)); return; } - Transition trasition; - trasition.condition.parameter = name; - trasition.condition.value._float = value; - trasition.state = stateTo; - from.transitions.push_back(trasition); + Transition transition; + transition.condition.parameter = name; + transition.condition.expression = expression; + transition.condition.value._float = value; + transition.state = stateTo; + from.transitions.push_back(transition); } - void StateMachine::addTransitionb(const std::string& stateFrom, const std::string& stateTo, const std::string& name, bool value) + void StateMachine::addTransitionb(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression expression, bool value) { map<string, State>::iterator it; it = mStates.find(stateFrom); @@ -298,14 +331,15 @@ namespace JinEngine Parameter& parameter = itp->second; if (parameter.type != ParameterType::Bool) { - jin_log_error("The type of parameter called %s is %s, but the transition gives a bool value.", name, parameterTypeString(parameter.type)); + jin_log_error("The type of parameter %s is %s, but the transition gives a bool value.", name, parameterTypeString(parameter.type)); return; } - Transition trasition; - trasition.condition.parameter = name; - trasition.condition.value._bool = value; - trasition.state = stateTo; - from.transitions.push_back(trasition); + Transition transition; + transition.condition.parameter = name; + transition.condition.expression = expression; + transition.condition.value._bool = value; + transition.state = stateTo; + from.transitions.push_back(transition); } void StateMachine::addTransitiont(const std::string& stateFrom, const std::string& stateTo, const std::string& name) @@ -335,7 +369,7 @@ namespace JinEngine Parameter& parameter = itp->second; if (parameter.type != ParameterType::Trigger) { - jin_log_error("The type of parameter called %s is %s, but the transition gives a trigger value.", name, parameterTypeString(parameter.type)); + jin_log_error("The type of parameter %s is %s, but the transition gives a trigger value.", name, parameterTypeString(parameter.type)); return; } Transition trasition; @@ -356,7 +390,7 @@ namespace JinEngine Parameter& p = it->second; if (p.type != ParameterType::Int) { - jin_log_error("The type of parameter called %s is %s, but try to assign a int value to it", name, parameterTypeString(p.type)); + jin_log_error("The type of parameter %s is %s, but try to assign a int value to it", name, parameterTypeString(p.type)); return; } p.value._int = value; @@ -373,7 +407,7 @@ namespace JinEngine Parameter& p = it->second; if (p.type != ParameterType::Float) { - jin_log_error("The type of parameter called %s is %s, but try to assign a float value to it", name, parameterTypeString(p.type)); + jin_log_error("The type of parameter %s is %s, but try to assign a float value to it", name, parameterTypeString(p.type)); return; } p.value._float = value; @@ -390,7 +424,7 @@ namespace JinEngine Parameter& p = it->second; if (p.type != ParameterType::Bool) { - jin_log_error("The type of parameter called %s is %s, but try to assign a bool value to it", name, parameterTypeString(p.type)); + jin_log_error("The type of parameter %s is %s, but try to assign a bool value to it", name, parameterTypeString(p.type)); return; } p.value._bool = value; @@ -407,7 +441,7 @@ namespace JinEngine Parameter& p = it->second; if (p.type != ParameterType::Trigger) { - jin_log_error("The type of parameter called %s is %s, but try to assign a trigger value to it", name, parameterTypeString(p.type)); + jin_log_error("The type of parameter %s is %s, but try to assign a trigger value to it", name, parameterTypeString(p.type)); return; } p.value._trigger = true; diff --git a/src/libjin/ai/je_state_machine.h b/src/libjin/ai/je_state_machine.h index 7d638c4..1765e97 100644 --- a/src/libjin/ai/je_state_machine.h +++ b/src/libjin/ai/je_state_machine.h @@ -34,6 +34,23 @@ namespace JinEngine /// /// /// + enum ParameterExpression + { + INT_BIGGER = 0x02, + INT_SMALLER = 0x04, + INT_EQUAL = 0x08, + + FLOAT_BIGGER = 0x10, + FLOAT_SMALLER = 0x20, + FLOAT_EQUAL = 0x40, + + BOOL_IS = 0x80, + BOOL_NOT = 0x100, + }; + + /// + /// + /// typedef void(StateChangeCallback)(void* userdata); /// @@ -104,17 +121,17 @@ namespace JinEngine /// /// /// - void addTransitioni(const std::string& stateFrom, const std::string& stateTo, const std::string& name, int value); + 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, float 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, bool value); + void addTransitionb(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression condition, bool value); /// /// @@ -200,21 +217,6 @@ namespace JinEngine ParameterValue value; }; - enum ParameterExpression - { - // - INT_BIGGER = 0x02, - INT_SMALLER = 0x04, - INT_EQUAL = 0x08, - // - FLOAT_BIGGER = 0x10, - FLOAT_SMALLER = 0x20, - FLOAT_EQUAL = 0x40, - // - BOOL_IS = 0x80, - BOOL_NOT = 0x100, - }; - /// /// Traslation's condition. /// |