- Timestamp:
- May 15, 2014, 5:10:55 PM (11 years ago)
- Location:
- code/branches/turretFS14/src/modules/objects/controllers
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/turretFS14/src/modules/objects/controllers/TeamTargetProxy.cc
r10049 r10060 28 28 29 29 #include "TeamTargetProxy.h" 30 #include "worldentities/ControllableEntity.h" 30 31 #include "worldentities/pawns/Pawn.h" 31 32 32 33 34 33 namespace orxonox 34 { 35 RegisterClass(TeamTargetProxy); 35 36 36 TeamTargetProxy::TeamTargetProxy(Context* context) : FormationController(context) 37 /** 38 @brief 39 Sets default values for all variables. 40 41 @param context 42 The context 43 */ 44 TeamTargetProxy::TeamTargetProxy(Context* context) : FormationController(context) 37 45 { 38 46 RegisterObject(TeamTargetProxy); … … 41 49 } 42 50 51 /** 52 @brief 53 Destructor. Nothing to see here. 54 */ 43 55 TeamTargetProxy::~TeamTargetProxy() 44 56 { 45 57 } 46 58 59 /** 60 @brief 61 Copies the team and the target from the parent. 62 63 That's all there is. 64 */ 47 65 void TeamTargetProxy::tick(float dt) 48 66 { … … 51 69 52 70 ControllableEntity* parent = orxonox_cast<ControllableEntity*> (this->getControllableEntity()->getParent()); 53 54 71 72 if(this->getTeam() != -1 && !this->once_ && parent) 73 { 74 orxout(internal_warning) << "TeamTargetProxy: Team already set, may result in undesired behaviour. Will get overridden by the parent's team." << endl; 75 } 76 77 if(!this->once_) 78 this->once_ = true; 79 80 //Teams aren't set immediately, after creation, so we have to check every tick... 81 if(parent) 82 { 83 Controller* parentcontroller = parent->getController(); 84 if(parentcontroller) 85 { 86 this->setTeam(parentcontroller->getTeam()); 87 } 88 else 89 { 90 this->setTeam(parent->getTeam()); 91 } 92 this->getControllableEntity()->setTeam(parent->getTeam()); 93 } 55 94 56 95 if(parent) 57 96 { 58 59 if(!this->once_)60 {61 //Set the same team62 if(parent)63 {64 Controller* parentcontroller = parent->getController();65 if(parentcontroller)66 {67 this->setTeam(parentcontroller->getTeam());68 }69 else70 {71 this->setTeam(parent->getTeam());72 }73 this->getControllableEntity()->setTeam(parent->getTeam());74 }75 this->once_ = true;76 }77 78 97 Pawn* parenttarget = orxonox_cast<Pawn*>(parent->getTarget()); 79 98 if(parenttarget) … … 83 102 } 84 103 } 85 86 104 } 87 105 } -
code/branches/turretFS14/src/modules/objects/controllers/TeamTargetProxy.h
r10049 r10060 35 35 namespace orxonox 36 36 { 37 /** 38 @brief 39 A controller, that just copies the team and the target of a parent for itself and it's controllable entity. 40 41 Useful for following (and similar) situations: (-> means attached to) 42 turret (rotates) -> some kind of turret base (looks nice) -> spaceship (flies around) 43 The turret has a controller that wants to copy the spaceship's target and team. In this case it doesn't work though, 44 because the turret isn't directly attached to the spaceship. Here's where this controller comes in. Drawback: the base 45 has to be controllable and ticks every second (performance?) 46 */ 37 47 class _OrxonoxExport TeamTargetProxy : public FormationController, public Tickable 38 48 { … … 44 54 45 55 private: 46 bool once_; 56 bool once_; //!< Flag for executing code in the tick function only once. 47 57 }; 48 58 } -
code/branches/turretFS14/src/modules/objects/controllers/TurretController.cc
r10049 r10060 35 35 RegisterClass(TurretController); 36 36 37 /** 38 @brief 39 Sets default values for all variables. 40 41 @param context 42 The context 43 */ 37 44 TurretController::TurretController(Context* context) : ArtificialController(context) 38 45 { … … 43 50 } 44 51 52 /** 53 @brief 54 Destructor. Nothing to see here. 55 */ 45 56 TurretController::~TurretController() 46 57 { … … 48 59 } 49 60 61 /** 62 @brief 63 Searches a valid target for the turret to aim at. 64 65 Loops through all pawns and tests, if it is in range. Scores every pawn and chooses the best one (the one with the lowest score). 66 If the turret has a parent, try to aim at the same target the parent has, if there is one. 67 68 @see targetScore 69 The function that scores the pawns. 70 */ 50 71 void TurretController::searchTarget() 51 72 { 52 73 Turret* turret = orxonox_cast<Turret*>(this->getControllableEntity()); 53 if(target_ && turret->isInRange(target_->getWorldPosition())) 74 75 //The controller might find a target before teams are set, so we need to check again here. 76 if(this->target_ && turret->isInRange(target_) != -1.f && !FormationController::sameTeam(turret, this->target_, this->getGametype())) 54 77 { 55 78 return; … … 66 89 { 67 90 Pawn* parenttarget = orxonox_cast<Pawn*>(parent->getTarget()); 68 if(parenttarget && turret->isInRange(parenttarget ->getWorldPosition()))91 if(parenttarget && turret->isInRange(parenttarget)) 69 92 { 70 93 this->setTarget(parenttarget); … … 74 97 } 75 98 76 for (ObjectList<Pawn>::iterator it = ObjectList<Pawn>::begin(); it != ObjectList<Pawn>::end(); ++it) 99 float maxScore = 0; 100 float tempScore; 101 Pawn* maxScorePawn = 0; 102 103 for (ObjectList<Pawn>::iterator it = ObjectList<Pawn>::begin(); it != ObjectList<Pawn>::end(); ++it) 77 104 { 78 105 Pawn* entity = orxonox_cast<Pawn*>(*it); 79 if ( this->FormationController::sameTeam(this->getControllableEntity(), entity, this->getGametype()))106 if (!entity || FormationController::sameTeam(this->getControllableEntity(), entity, this->getGametype())) 80 107 continue; 81 82 if(t urret->isInRange(entity->getWorldPosition()))108 tempScore = turret->isInRange(entity); 109 if(tempScore != -1.f) 83 110 { 84 this->setTarget(entity); 85 turret->setTarget(entity); 86 break; 111 if(tempScore > maxScore) 112 { 113 maxScore = tempScore; 114 maxScorePawn = entity; 115 } 87 116 } 88 } 89 } 90 117 } 118 this->setTarget(maxScorePawn); 119 turret->setTarget(maxScorePawn); 120 } 121 122 /** 123 @brief 124 Tests, if the turret is looking at the target, with a specified tolerance 125 126 This uses the world position as opposed to the local position in the old version. 127 128 @param angle 129 The tolerance, in radians 130 */ 91 131 bool TurretController::isLookingAtTargetNew(float angle) const 92 132 { … … 94 134 } 95 135 136 /** 137 @brief 138 Scores a pawn as a target, based on distance and health. 139 140 The more health and distance a pawn has, the higher the score. This means lower equals better target. 141 142 @param pawn 143 The pawn to score 144 145 @param distance 146 The distance. Can be squared or normed, doesn't matter as long as all are treated the same. 147 */ 148 float TurretController::targetScore(Pawn* pawn, float distance) const 149 { 150 return pawn->getHealth()/pawn->getMaxHealth() + distance; 151 } 152 153 /** 154 @brief 155 Does all the controlling of the turret. 156 157 If the turret has a parent, copies the team from there, if it's not already set. 158 Other actions are: Search a target. If a target has been found, aim and shoot at it. 159 */ 96 160 void TurretController::tick(float dt) 97 161 { … … 100 164 101 165 102 if(!this->once_) 103 { 104 if(this->getTeam() != -1) 105 { 106 orxout(internal_warning) << "Turret: Team already set, may result in undesired behaviour" << endl; 107 } 108 else 109 { 110 //Make sure the turret is in the same team as the parent 111 ControllableEntity* parent = orxonox_cast<ControllableEntity*> (this->getControllableEntity()->getParent()); 112 if(parent) 113 { 114 Controller* parentcontroller = parent->getController(); 115 if(parentcontroller) 116 { 117 this->setTeam(parentcontroller->getTeam()); 118 } 119 else 120 { 121 this->setTeam(parent->getTeam()); 122 } 123 this->getControllableEntity()->setTeam(parent->getTeam()); 124 } 125 } 126 this->once_ = true; 166 ControllableEntity* parent = orxonox_cast<ControllableEntity*> (this->getControllableEntity()->getParent()); 167 if(this->getTeam() != -1 && !this->once_ && parent) 168 { 169 orxout(internal_warning) << "TurretController: Team already set, may result in undesired behaviour. Will get overridden by the parent's team." << endl; 170 } 171 172 if(!this->once_) 173 this->once_ = true; 174 175 //Teams aren't set immediately, after creation, so we have to check every tick... 176 if(parent) 177 { 178 Controller* parentcontroller = parent->getController(); 179 if(parentcontroller) 180 { 181 this->setTeam(parentcontroller->getTeam()); 182 } 183 else 184 { 185 this->setTeam(parent->getTeam()); 186 } 187 this->getControllableEntity()->setTeam(parent->getTeam()); 127 188 } 128 189 129 190 this->searchTarget(); 130 if(t arget_)191 if(this->target_) 131 192 { 132 193 Turret* turret = orxonox_cast<Turret*> (this->getControllableEntity()); -
code/branches/turretFS14/src/modules/objects/controllers/TurretController.h
r10049 r10060 57 57 void searchTarget(); 58 58 bool isLookingAtTargetNew(float angle) const; 59 float targetScore(Pawn* pawn, float distance) const; 59 60 60 bool once_; 61 bool once_; //!< Flag for executing code in the tick function only once. 61 62 }; 62 63 }
Note: See TracChangeset
for help on using the changeset viewer.