Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 6, 2014, 11:07:07 AM (11 years ago)
Author:
muemart
Message:

Move everything back to the Turret class, set the correct team, and (re)arm the turret. Also, hide it from the radar.

Location:
code/branches/turretFS14/src/modules/objects/controllers
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/branches/turretFS14/src/modules/objects/controllers/TurretController.cc

    r10042 r10044  
    3838        {
    3939                RegisterObject(TurretController);
    40                 this->startOrient_ = Quaternion::IDENTITY;
    41         this->startDir_ = Vector3::ZERO;
    42         this->localZ_ = Vector3::UNIT_Z;
    43         this->localY_ = Vector3::UNIT_Y;
    44         this->localX_ = Vector3::UNIT_X;
    45         this->attackRadius_ = 200;
    46         this->maxPitch_ = 90;
    47         this->maxYaw_ = 90;
    48         this->gotOrient_ = false;
     40
     41                this->once_ = false;
     42
    4943        }
    5044
     
    5751        {
    5852        Turret* turret = orxonox_cast<Turret*>(this->getControllableEntity());
    59         if(target_ && this->isInRange(target_->getWorldPosition()))
     53        if(target_ && turret->isInRange(target_->getWorldPosition()))
    6054        {
    6155                return;
     
    6458        {
    6559                this->forgetTarget();
     60                turret->setTarget(0);
    6661        }
    6762
     
    7166        {
    7267                Pawn* parenttarget = orxonox_cast<Pawn*>(parent->getTarget());
    73                 if(parenttarget && this->isInRange(parenttarget->getWorldPosition()))
     68                if(parenttarget && turret->isInRange(parenttarget->getWorldPosition()))
    7469                {
    7570                        this->setTarget(parenttarget);
     
    8277        {
    8378                Pawn* entity = orxonox_cast<Pawn*>(*it);
    84             if (ArtificialController::sameTeam(this->getControllableEntity(), entity, this->getGametype()))
     79            if (this->FormationController::sameTeam(this->getControllableEntity(), entity, this->getGametype()))
    8580                continue;
    8681
    87             if(this->isInRange(entity->getWorldPosition()))
     82            if(turret->isInRange(entity->getWorldPosition()))
    8883            {
    8984                this->setTarget(entity);
     
    9489        }
    9590
    96         bool TurretController::isInRange(const Vector3 &position)
    97     {
    98         //Check distance
    99         Vector3 distance = position - this->getControllableEntity()->getWorldPosition();
    100         if(distance.squaredLength() > (this->attackRadius_ * this->attackRadius_))
    101         {
    102             return false;
    103         }
    104 
    105         //Check pitch
    106         Vector3 dir = getTransformedVector(distance, this->localX_, this->localY_, this->localZ_);
    107         Vector3 dirProjected = dir;
    108         dirProjected.x = 0;
    109         Vector3 startDirProjected = this->startDir_;
    110         startDirProjected.x = 0;
    111         Ogre::Real angle = startDirProjected.angleBetween(dirProjected).valueDegrees();
    112         if(angle > this->maxPitch_)
    113         {
    114             return false;
    115         }
    116 
    117         //Check yaw
    118         dirProjected = dir;
    119         dirProjected.y = 0;
    120         startDirProjected = this->startDir_;
    121         startDirProjected.y = 0;
    122         angle = startDirProjected.angleBetween(dirProjected).valueDegrees();
    123         if(angle > this->maxYaw_)
    124         {
    125             return false;
    126         }
    127         return true;
    128     }
    129 
    130     void TurretController::aimAtPositionRot(const Vector3 &position)
    131     {
    132 
    133         Vector3 currDir = this->getControllableEntity()->getWorldOrientation() * WorldEntity::FRONT;
    134         Vector3 targetDir = position - this->getControllableEntity()->getWorldPosition();
    135 
    136         Quaternion rot = currDir.getRotationTo(targetDir);
    137 
    138         //Don't make the rotation instantaneous
    139         rot = Quaternion::Slerp(0.1, Quaternion::IDENTITY, rot);
    140 
    141         this->getControllableEntity()->rotate(rot, WorldEntity::World);
    142     }
    143    
    144 
    145     void TurretController::aimAtTargetRot()
    146     {
    147         this->aimAtPositionRot(this->target_->getWorldPosition());
    148     }
    149 
    15091    bool TurretController::isLookingAtTargetNew(float angle) const
    15192    {
     
    15596        void TurretController::tick(float dt)
    15697        {
    157                         if(!gotOrient_)
    158                 {
    159                     this->startOrient_ = this->getControllableEntity()->getOrientation();
    160                     this->localXStart_ = this->startOrient_ * this->localX_;
    161                     this->localXStart_.normalise();
    162                     this->localX_ = this->localXStart_;
    163                     this->localYStart_ = this->startOrient_ * this->localY_;
    164                     this->localYStart_.normalise();
    165                     this->localY_ = this->localYStart_;
    166                     this->localZStart_ = this->startOrient_ * this->localZ_;
    167                     this->localZStart_.normalise();
    168                     this->localZ_ = this->localZStart_;
    169 
    170                     //startDir should always be (0,0,-1)
    171                     this->startDir_ = getTransformedVector(this->startOrient_ * WorldEntity::FRONT, this->localX_, this->localY_, this->localZ_);
    172 
    173                     this->gotOrient_ = true;
    174 
    175                 }
    176 
    177                 WorldEntity* parent = this->getControllableEntity()->getParent();
    178                 if(parent)
    179                 {
    180                     Quaternion parentrot = parent->getOrientation();
    181                     this->localX_ = parentrot * this->localXStart_;
    182                     this->localY_ = parentrot * this->localYStart_;
    183                     this->localZ_ = parentrot * this->localZStart_;
    184                 }
     98            if (!this->isActive() || !this->getControllableEntity())
     99                return;
    185100
    186101
     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;
     127        }
    187128
    188                 if (!this->isActive() || !this->getControllableEntity())
    189                     return;
    190 
    191                         this->searchTarget();
    192                         if(target_)
    193                         {
    194                                 this->aimAtTarget();
    195                                 //this->getControllableEntity()->lookAt(this->targetPosition_);
    196                                 //It says move, but really it only turns
    197                                 this->aimAtTargetRot();
    198                                 if(this->isLookingAtTargetNew(Degree(5).valueRadians()))
    199                                 {
    200                                         orxout() << 42 << endl;
    201                                 }
    202                         }
     129                this->searchTarget();
     130                if(target_)
     131                {
     132                        Turret* turret = orxonox_cast<Turret*> (this->getControllableEntity());
     133                        this->aimAtTarget();
     134                        turret->aimAtPosition(target_->getWorldPosition());
     135                        if(this->isLookingAtTargetNew(Degree(5).valueRadians()))
     136                        {
     137                                this->getControllableEntity()->fire(0);
     138                                orxout() << 42 << endl;
     139                        }
     140                }
    203141        }
    204142 }
  • code/branches/turretFS14/src/modules/objects/controllers/TurretController.h

    r10042 r10044  
    4444
    4545                private:
    46             bool gotOrient_;
    47             float attackRadius_;
    48             Ogre::Real maxPitch_;
    49             Ogre::Real maxYaw_;
    50             Quaternion startOrient_;
    51             Vector3 startDir_;
    52             Vector3 localZ_;
    53             Vector3 localZStart_;
    54             Vector3 localY_;
    55             Vector3 localYStart_;
    56             Vector3 localX_;
    57             Vector3 localXStart_;
    5846
    59             void aimAtPositionRot(const Vector3 &position);
    60             void aimAtTargetRot();
    6147                        void searchTarget();
    62                         bool isInRange(const Vector3 &position);
    6348                        bool isLookingAtTargetNew(float angle) const;
     49
     50                        bool once_;
    6451        };
    6552 }
Note: See TracChangeset for help on using the changeset viewer.