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