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 }