- Timestamp:
- Nov 8, 2015, 6:19:12 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/AI_HS15/src/orxonox/controllers/CommonController.cc
r10764 r10780 36 36 #include "worldentities/pawns/SpaceShip.h" 37 37 38 38 #include "Scene.h" 39 #include <OgreRay.h> 40 #include <OgreSceneQuery.h> 41 #include <OgreCamera.h> 42 #include <OgreSceneManager.h> 39 43 namespace orxonox 40 44 { … … 47 51 { 48 52 this->bSetupWorked = false; 53 54 this->targetMask_.exclude(ClassByString("BaseObject")); 55 this->targetMask_.include(ClassByString("WorldEntity")); 56 this->targetMask_.exclude(ClassByString("Projectile")); 49 57 50 58 RegisterObject(CommonController); … … 234 242 } 235 243 } 236 orxout (internal_error) << "MOVING" <<endl ;237 244 238 245 this->getControllableEntity()->moveFrontBack(1.2f*SPEED*factor); … … 255 262 return (this->getControllableEntity()->getPosition().squaredDistance(this->target_->getPosition()) < distance*distance); 256 263 } 257 264 bool CommonController::isLookingAtTarget(float angle) const 265 { 266 if (!this->getControllableEntity()) 267 return false; 268 269 return (getAngle(this->getControllableEntity()->getPosition(), this->getControllableEntity()->getOrientation() * WorldEntity::FRONT, this->targetPosition_) < angle); 270 } 258 271 259 272 bool CommonController::canFire() 260 273 { 261 262 float tolerance = 50.0f; 263 264 //check pointers 265 if (!this->getControllableEntity() || !this->target_ || !this->target_->getControllableEntity()) 274 if ( this->bShooting_ && this->isCloseAtTarget(3000) && this->isLookingAtTarget(math::pi / 20.0f) ) 275 { 276 return true; 277 } 278 else 279 { 266 280 return false; 267 268 //check if this points in the direction of target_ 269 270 Vector3 myPosition = this->getControllableEntity()->getWorldPosition(); 271 Vector3 targetPosition = this->target_->getControllableEntity()->getWorldPosition(); 272 273 Vector3 differenceVector = targetPosition - myPosition; 274 float differenceLength = differenceVector.length(); 275 276 Vector3 myDirection = this->getControllableEntity()->getOrientation() * WorldEntity::FRONT; 277 278 float angle = getAngle (myPosition, myDirection, targetPosition); 279 float heightLength = sin(angle) * differenceLength; 280 281 if (heightLength > tolerance) 282 return false; 283 284 285 286 //check if there are allies on the way 287 Vector3 allyPosition, allyDifference; 288 float allyDifferenceLength, allyAngle, allyHeightLength; 289 290 for (ObjectList<CommonController>::iterator it = ObjectList<CommonController>::begin(); it; ++it) 291 { 292 if (!it->getControllableEntity()) 293 continue; 294 if ((this->getControllableEntity()->getTeam() == (it)->getControllableEntity()->getTeam())) 295 { 296 allyPosition = it->getControllableEntity()->getWorldPosition(); 297 298 allyDifference = allyPosition - myPosition; 299 allyDifferenceLength = allyDifference.length(); 300 301 allyAngle = getAngle (myPosition, myDirection, allyPosition); 302 303 allyHeightLength = sin(allyAngle) * allyDifferenceLength; 304 305 if (allyAngle > math::pi /2) 306 continue; 307 if (allyHeightLength <= tolerance) 308 return false; 309 } 310 } 281 } 282 283 } 284 void CommonController::doFire() 285 { 286 if (!this->target_ || !this->getControllableEntity()) 287 return; 288 static const float hardcoded_projectile_speed = 750; 289 290 this->targetPosition_ = getPredictedPosition(this->getControllableEntity()->getWorldPosition(), hardcoded_projectile_speed, this->target_->getWorldPosition(), this->target_->getVelocity()); 291 this->bHasTargetPosition_ = (this->targetPosition_ != Vector3::ZERO); 311 292 312 293 Pawn* pawn = orxonox_cast<Pawn*>(this->getControllableEntity()); 313 294 if (pawn) 314 pawn->setAimPosition( WorldEntity::FRONT);295 pawn->setAimPosition(this->getControllableEntity()->getWorldPosition() + 4000*(this->getControllableEntity()->getOrientation() * WorldEntity::FRONT)); 315 296 316 return true;317 318 }319 void CommonController::doFire()320 {321 297 this->getControllableEntity()->fire(0); 322 298 }
Note: See TracChangeset
for help on using the changeset viewer.