00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00015 00016 #include "aiCharacter.h" 00017 00018 AICharacter::AICharacter(string model_name, NodePath model_np, double mass, double movt_force, double max_force) { 00019 _name = model_name; 00020 _ai_char_np = model_np; 00021 00022 _mass = mass; 00023 _max_force = max_force; 00024 _movt_force = movt_force; 00025 00026 _velocity = LVecBase3f(0.0, 0.0, 0.0); 00027 _steering_force = LVecBase3f(0.0, 0.0, 0.0); 00028 00029 _steering = new AIBehaviors(); 00030 _steering->_ai_char = this; 00031 } 00032 00033 AICharacter::~AICharacter() { 00034 } 00035 00043 00045 00046 void AICharacter::update() { 00047 00048 if(!_steering->is_off()) { 00049 00050 LVecBase3f old_pos = _ai_char_np.get_pos(); 00051 00052 LVecBase3f steering_force = _steering->calculate_prioritized(); 00053 00054 LVecBase3f acceleration = steering_force / _mass; 00055 00056 _velocity = acceleration; 00057 00058 LVecBase3f direction = _steering->_steering_force; 00059 direction.normalize(); 00060 00061 _ai_char_np.set_pos(old_pos + _velocity) ; 00062 00063 if(steering_force.length() > 0) { 00064 _ai_char_np.look_at(old_pos + (direction * 5)); 00065 _ai_char_np.set_h(_ai_char_np.get_h() + 180); 00066 _ai_char_np.set_p(-_ai_char_np.get_p()); 00067 _ai_char_np.set_r(-_ai_char_np.get_r()); 00068 } 00069 } 00070 else { 00071 _steering->_steering_force = LVecBase3f(0.0, 0.0, 0.0); 00072 _steering->_seek_force = LVecBase3f(0.0, 0.0, 0.0); 00073 _steering->_flee_force = LVecBase3f(0.0, 0.0, 0.0); 00074 _steering->_pursue_force = LVecBase3f(0.0, 0.0, 0.0); 00075 _steering->_evade_force = LVecBase3f(0.0, 0.0, 0.0); 00076 _steering->_arrival_force = LVecBase3f(0.0, 0.0, 0.0); 00077 _steering->_flock_force = LVecBase3f(0.0, 0.0, 0.0); 00078 _steering->_wander_force = LVecBase3f(0.0, 0.0, 0.0); 00079 } 00080 } 00081 00082 LVecBase3f AICharacter::get_velocity() { 00083 return _velocity; 00084 } 00085 00086 void AICharacter::set_velocity(LVecBase3f velocity) { 00087 _velocity = velocity; 00088 } 00089 00090 double AICharacter::get_mass() { 00091 return _mass; 00092 } 00093 00094 void AICharacter::set_mass(double m) { 00095 _mass = m; 00096 } 00097 00098 double AICharacter::get_max_force() { 00099 return _max_force; 00100 } 00101 00102 void AICharacter::set_max_force(double max_force) { 00103 _max_force = max_force; 00104 } 00105 00106 NodePath AICharacter::get_node_path() { 00107 return _ai_char_np; 00108 } 00109 00110 void AICharacter::set_node_path(NodePath np) { 00111 _ai_char_np = np; 00112 } 00113 00114 AIBehaviors * AICharacter::get_ai_behaviors() { 00115 return _steering; 00116 } 00117 00118 void AICharacter::set_char_render(NodePath render) { 00119 _window_render = render; 00120 } 00121 00122 NodePath AICharacter::get_char_render() { 00123 return _window_render; 00124 }