00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "flee.h"
00017
00018 Flee::Flee(AICharacter *ai_ch, NodePath target_object, double panic_distance,
00019 double relax_distance, float flee_wt){
00020
00021 _ai_char = ai_ch;
00022
00023 _flee_position = target_object.get_pos(_ai_char->_window_render);
00024 _flee_distance = panic_distance;
00025 _flee_weight = flee_wt;
00026 _flee_relax_distance = relax_distance;
00027
00028 _flee_done = false;
00029 _flee_activate_done = false;
00030 }
00031
00032 Flee::Flee(AICharacter *ai_ch, LVecBase3f pos, double panic_distance,
00033 double relax_distance, float flee_wt){
00034
00035 _ai_char = ai_ch;
00036
00037 _flee_position = pos;
00038 _flee_distance = panic_distance;
00039 _flee_weight = flee_wt;
00040 _flee_relax_distance = relax_distance;
00041
00042 _flee_done = false;
00043 _flee_activate_done = false;
00044 }
00045
00046 Flee::~Flee() {
00047 }
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 LVecBase3f Flee::do_flee() {
00061 LVecBase3f dirn;
00062 double distance;
00063 LVecBase3f desired_force;
00064
00065 dirn = _ai_char->_ai_char_np.get_pos(_ai_char->_window_render) - _flee_present_pos;
00066 distance = dirn.length();
00067 desired_force = _flee_direction * _ai_char->_movt_force;
00068
00069 if(distance > (_flee_distance + _flee_relax_distance)) {
00070 if((_ai_char->_steering->_behaviors_flags | _ai_char->_steering->_flee) == _ai_char->_steering->_flee) {
00071 _ai_char->_steering->_steering_force = LVecBase3f(0.0, 0.0, 0.0);
00072 }
00073 _flee_done = true;
00074 _ai_char->_steering->turn_off("flee");
00075 _ai_char->_steering->turn_on("flee_activate");
00076 return(LVecBase3f(0.0, 0.0, 0.0));
00077 }
00078 else {
00079 return(desired_force);
00080 }
00081 }
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 void Flee::flee_activate() {
00093 LVecBase3f dirn;
00094 double distance;
00095
00096 _flee_activate_done = false;
00097
00098 dirn = (_ai_char->_ai_char_np.get_pos(_ai_char->_window_render) - _flee_position);
00099 distance = dirn.length();
00100
00101 if(distance < _flee_distance) {
00102 _flee_direction = _ai_char->_ai_char_np.get_pos(_ai_char->_window_render) - _flee_position;
00103 _flee_direction.normalize();
00104 _flee_present_pos = _ai_char->_ai_char_np.get_pos(_ai_char->_window_render);
00105 _ai_char->_steering->turn_off("flee_activate");
00106 _ai_char->_steering->turn_on("flee");
00107 _flee_activate_done = true;
00108 }
00109 }