Changeset 10226 in orxonox.OLD for branches/ai/src/ai/ai_swarm.cc
- Timestamp:
- Jan 10, 2007, 6:31:30 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ai/src/ai/ai_swarm.cc
r10177 r10226 15 15 #define DEBUG_SPECIAL_MODULE DEBUG_MODULE_AI 16 16 #include "ai_swarm.h" 17 #include "ai_module.h" 18 #include "movement_module.h" 19 #include "attack_module.h" 17 20 #include "debug.h" 18 21 #include <stdio.h> 22 #include "aabb.h" 19 23 20 24 AISwarm::AISwarm() … … 27 31 void AISwarm::process(float dt) 28 32 { 29 if(tickCount>=randomFreq && movement.len()<60){ 33 std::map<WorldEntity*,AIModule*>::iterator it; 34 35 Vector swarmPosition=this->getPosition(); 36 Vector targetPosition=target->getAbsCoor(); 37 float distanceToTarget=(swarmPosition-targetPosition).len(); 38 39 float aMax=70.0f; 40 float vMax=1000.0f; 41 float deltaDistance=30; 42 float attackDistance=100; 43 44 45 46 if(distanceToTarget+deltaDistance<=attackDistance && status!=ATTACKING){ 47 for (it= members.begin(); it!= members.end(); it++ ){ 48 AIModule* oldAI = it->second; 49 AIModule* newAI = new AttackModule(); 50 newAI->getAttributesFrom(oldAI); 51 it->second=newAI; 52 delete oldAI; 53 status=ATTACKING; 54 } 55 }else if(distanceToTarget-deltaDistance>=attackDistance && status!=MOVING){ 56 for (it= members.begin(); it!= members.end(); it++ ){ 57 AIModule* oldAI = it->second; 58 AIModule* newAI = new MovementModule(); 59 newAI->getAttributesFrom(oldAI); 60 it->second=newAI; 61 delete oldAI; 62 status=MOVING; 63 } 64 } 65 66 67 68 if(status!=ATTACKING && tickCount>=randomFreq){ 30 69 tickCount=0; 31 int x = (rand()%141)+10; //10-150 70 //int x = (rand()%141)+10; //10-150 71 int x = (rand()%241)-120; //-120-120 32 72 int z = (rand()%241)-120; //-120-120 33 73 randomVector=Vector(x,0,z); 34 74 35 std::cout << "change to: ||" << randomVector.x << " ==" << randomVector.z << "\n";75 //std::cout << "change to: ||" << randomVector.x << " ==" << randomVector.z << "\n"; 36 76 } 37 77 tickCount++; 38 78 39 79 40 std::set<AIModule*>::iterator it;41 Vector swarmPosition=this->getPosition();42 //std::cout << swarmPosition.x << " " << swarmPosition.z << "\n";43 44 float aMax=70.0f;45 float vMax=1000.0f;46 80 47 81 Vector correction=(destination+randomVector-swarmPosition)-movement; … … 58 92 59 93 60 for (it= swarmMembers.begin(); it!= swarmMembers.end(); it++ ){ 61 (*it)->setDestination(swarmPosition); 62 (*it)->setDestinationMovement(movement); 63 (*it)->setEnemyList(enemyList); 64 (*it)->process(dt); 94 95 for (it= members.begin(); it!= members.end(); it++ ){ 96 it->second->setDestination(swarmPosition); 97 it->second->setDestinationMovement(movement); 98 it->second->setTarget(target); 99 it->second->process(dt); 65 100 } 66 101 } 67 102 68 103 69 void AISwarm::addAI(AIModule* aiModule) 104 105 void AISwarm::addAI(WorldEntity* npc) 70 106 { 71 swarmMembers.insert(aiModule); 107 std::pair< std::map<WorldEntity*,AIModule*>::iterator , bool > p; 108 AIModule* newAIModule=new MovementModule(npc); 109 p=members.insert(std::make_pair(npc,newAIModule)); 110 if(!p.second)delete newAIModule; 72 111 } 73 112 74 113 75 void AISwarm::removeAI( AIModule* aiModule)114 void AISwarm::removeAI(WorldEntity* npc) 76 115 { 77 std::set<AIModule*>::iterator it=swarmMembers.find(aiModule); 78 if(it==swarmMembers.end())return; 79 delete (*it); 116 std::map<WorldEntity*,AIModule*>::iterator it = members.find(npc); 117 if(it==members.end())return; //npc not found 118 delete it->second; //delete AIModule 119 members.erase(it); //remove AIModule from members 80 120 } 81 121 … … 84 124 { 85 125 Vector center=Vector(0,0,0); 86 std:: set<AIModule*>::iterator it;87 for (it= swarmMembers.begin(); it!= swarmMembers.end(); it++ )88 center=center+ (*it)->getPosition();126 std::map<WorldEntity*,AIModule*>::iterator it; 127 for (it= members.begin(); it!= members.end(); it++ ) 128 center=center+it->second->getPosition(); 89 129 90 return center/ swarmMembers.size();130 return center/members.size(); 91 131 } 132 133 float AISwarm::getRadius(WorldEntity* object) 134 { 135 AABB* aabb = object->getModelAABB(); 136 if( aabb == NULL)return -1; 137 138 float a = aabb->halfLength[0]; 139 float b = aabb->halfLength[1]; 140 float c = aabb->halfLength[2]; 141 142 if(a>b){ 143 return (c>a)?c:a; 144 }else{ 145 return (c>b)?c:b; 146 } 147 }
Note: See TracChangeset
for help on using the changeset viewer.