00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00014
00015 #include "aiCharacter.h"
00016
00017 AICharacter::AICharacter(string model_name, NodePath model_np, double mass, double movt_force, double max_force) {
00018 _name = model_name;
00019 _ai_char_np = model_np;
00020
00021 _mass = mass;
00022 _max_force = max_force;
00023 _movt_force = movt_force;
00024
00025 _velocity = LVecBase3f(0.0, 0.0, 0.0);
00026 _steering_force = LVecBase3f(0.0, 0.0, 0.0);
00027
00028 _steering = new AIBehaviors();
00029 _steering->_ai_char = this;
00030
00031 _pf_guide = false;
00032 }
00033
00034 AICharacter::~AICharacter() {
00035 }
00036
00043
00045
00046 void AICharacter::update() {
00047
00048 if(!_steering->is_off(_steering->_none)) {
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 }
00125
00126 void AICharacter::set_pf_guide(bool pf_guide) {
00127 _pf_guide = pf_guide;
00128 }