00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00014 00015 #include "evade.h" 00016 00017 Evade::Evade(AICharacter *ai_ch, NodePath target_object, double panic_distance, 00018 double relax_distance, float evade_wt) { 00019 _ai_char = ai_ch; 00020 00021 _evade_target = target_object; 00022 _evade_distance = panic_distance; 00023 _evade_relax_distance = relax_distance; 00024 _evade_weight = evade_wt; 00025 00026 _evade_done = true; 00027 _evade_activate_done = false; 00028 } 00029 00030 Evade::~Evade() { 00031 } 00032 00041 00043 00044 LVecBase3f Evade::do_evade() { 00045 assert(_evade_target && "evade target not assigned"); 00046 00047 _evade_direction = _ai_char->_ai_char_np.get_pos(_ai_char->_window_render) - _evade_target.get_pos(_ai_char->_window_render); 00048 double distance = _evade_direction.length(); 00049 00050 _evade_direction.normalize(); 00051 LVecBase3f desired_force = _evade_direction * _ai_char->_movt_force; 00052 00053 if(distance > (_evade_distance + _evade_relax_distance)) { 00054 if((_ai_char->_steering->_behaviors_flags | _ai_char->_steering->_evade) == _ai_char->_steering->_evade) { 00055 _ai_char->_steering->_steering_force = LVecBase3f(0.0, 0.0, 0.0); 00056 } 00057 _ai_char->_steering->evade_off(); 00058 _ai_char->_steering->evade_activate_on(); 00059 _evade_done = true; 00060 return(LVecBase3f(0.0, 0.0, 0.0)); 00061 } 00062 else { 00063 _evade_done = false; 00064 return(desired_force); 00065 } 00066 } 00067 00074 00076 00077 void Evade::evade_activate() { 00078 _evade_direction = (_ai_char->_ai_char_np.get_pos(_ai_char->_window_render) - _evade_target.get_pos(_ai_char->_window_render)); 00079 double distance = _evade_direction.length(); 00080 _evade_activate_done = false; 00081 00082 if(distance < _evade_distance) { 00083 _ai_char->_steering->evade_activate_off(); 00084 _ai_char->_steering->evade_on(); 00085 _evade_activate_done = true; 00086 } 00087 }