Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Nov 8, 2015, 6:19:12 PM (9 years ago)
Author:
gania
Message:

fixed firing direction

Location:
code/branches/AI_HS15/src/orxonox
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • code/branches/AI_HS15/src/orxonox/controllers/CommonController.cc

    r10764 r10780  
    3636#include "worldentities/pawns/SpaceShip.h"
    3737
    38 
     38#include "Scene.h"
     39#include <OgreRay.h>
     40#include <OgreSceneQuery.h>
     41#include <OgreCamera.h>
     42#include <OgreSceneManager.h>
    3943namespace orxonox
    4044{
     
    4751    {
    4852        this->bSetupWorked = false;
     53
     54        this->targetMask_.exclude(ClassByString("BaseObject"));
     55        this->targetMask_.include(ClassByString("WorldEntity"));
     56        this->targetMask_.exclude(ClassByString("Projectile"));
    4957
    5058        RegisterObject(CommonController);
     
    234242                }
    235243            }
    236                     orxout (internal_error) << "MOVING" <<endl ;
    237244
    238245            this->getControllableEntity()->moveFrontBack(1.2f*SPEED*factor);
     
    255262            return (this->getControllableEntity()->getPosition().squaredDistance(this->target_->getPosition()) < distance*distance);
    256263    }
    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    }
    258271
    259272    bool CommonController::canFire()
    260273    {
    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        {
    266280            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);
    311292
    312293        Pawn* pawn = orxonox_cast<Pawn*>(this->getControllableEntity());
    313294        if (pawn)
    314             pawn->setAimPosition(WorldEntity::FRONT);
     295            pawn->setAimPosition(this->getControllableEntity()->getWorldPosition() + 4000*(this->getControllableEntity()->getOrientation() * WorldEntity::FRONT));
    315296   
    316         return true;
    317 
    318     }
    319     void CommonController::doFire()
    320     {
    321297        this->getControllableEntity()->fire(0);
    322298    }
  • code/branches/AI_HS15/src/orxonox/controllers/CommonController.h

    r10763 r10780  
    3434#include "worldentities/ControllableEntity.h"
    3535#include "worldentities/pawns/Pawn.h"
     36#include "core/ClassTreeMask.h"
    3637
    3738
     
    164165            ManeuverType::Value maneuverType_;
    165166            Maneuver::Value maneuver_;
     167
     168            ClassTreeMask               targetMask_;
     169
    166170         
    167171        private:
  • code/branches/AI_HS15/src/orxonox/controllers/DivisionController.cc

    r10763 r10780  
    6868            this->moveToTargetPosition();
    6969        }
    70 
     70        if (this->bShooting_)
     71            doFire();
    7172        SUPER(DivisionController, tick, dt);
    7273
     
    9798        }
    9899           */
    99        
    100100        if (canFire())
    101             doFire();
    102      
     101           this->bShooting_ = true;
     102        else
     103            this->bShooting_ = false;
    103104    }
    104105
  • code/branches/AI_HS15/src/orxonox/controllers/SectionController.cc

    r10762 r10780  
    6363            this->moveToTargetPosition();
    6464        }
    65 
     65        if (this->bShooting_)
     66            doFire();
    6667       
    6768        SUPER(SectionController, tick, dt);
     
    8687        if (this->target_ && this->myWingman_)
    8788            this->myWingman_->setTarget(this->target_);
    88 
    8989        if (canFire())
    90             doFire();
     90           this->bShooting_ = true;
     91        else
     92            this->bShooting_ = false;
    9193               
    9294
  • code/branches/AI_HS15/src/orxonox/controllers/WingmanController.cc

    r10762 r10780  
    128128        }
    129129       
    130        
     130        if (this->bShooting_)
     131            doFire();
    131132       
    132133        SUPER(WingmanController, tick, dt);
     
    152153
    153154        }
    154 
    155155        if (canFire())
    156             doFire();
     156           this->bShooting_ = true;
     157        else
     158            this->bShooting_ = false;
     159         
    157160    }
    158161     
  • code/branches/AI_HS15/src/orxonox/worldentities/pawns/Pawn.cc

    r10731 r10780  
    299299    }
    300300
    301 
    302301    void Pawn::kill()
    303302    {
     
    320319    }
    321320
    322 
    323321    void Pawn::death()
    324322    {
     
    326324        if (this->getGametype() && this->getGametype()->allowPawnDeath(this, this->lastHitOriginator_))
    327325        {
    328             // Set bAlive_ to false and wait for PawnManager to do the destruction
     326            // Set bAlive_ to false and wait for destroyLater() to do the destruction
    329327            this->bAlive_ = false;
     328            this->destroyLater();
    330329
    331330            this->setDestroyWhenPlayerLeft(false);
     
    367366            if (GameMode::isMaster())
    368367            {
    369 //                this->deathEffect();
     368                this->deatheffect();
    370369                this->goWithStyle();
    371370            }
     
    387386    {
    388387        // play death effect
    389         {
     388        /*{
    390389            ParticleSpawner* effect = new ParticleSpawner(this->getContext());
    391390            effect->setPosition(this->getPosition());
     
    410409            effect->setSource("Orxonox/sparks");
    411410            effect->setLifetime(4.0f);
    412         }
     411        }*/
     412       
     413       
     414        {
     415            ParticleSpawner* effect = new ParticleSpawner(this->getContext());
     416            effect->setPosition(this->getPosition());
     417            effect->setOrientation(this->getOrientation());
     418            effect->setDestroyAfterLife(true);
     419            effect->setSource("orxonox/explosion_flash2");
     420            effect->setLifetime(5.0f);
     421        }
     422        {
     423            ParticleSpawner* effect = new ParticleSpawner(this->getContext());
     424            effect->setPosition(this->getPosition());
     425            effect->setOrientation(this->getOrientation());
     426            effect->setDestroyAfterLife(true);
     427            effect->setSource("orxonox/explosion_flame2");
     428            effect->setLifetime(5.0f);
     429        }
     430        {
     431            ParticleSpawner* effect = new ParticleSpawner(this->getContext());
     432            effect->setPosition(this->getPosition());
     433            effect->setOrientation(this->getOrientation());
     434            effect->setDestroyAfterLife(true);
     435            effect->setSource("orxonox/explosion_shockwave2");
     436            effect->scale(20);
     437            effect->setLifetime(5.0f);
     438        }{
     439            ParticleSpawner* effect = new ParticleSpawner(this->getContext());
     440            effect->setPosition(this->getPosition());
     441            effect->setOrientation(this->getOrientation());
     442            effect->setDestroyAfterLife(true);
     443            effect->setSource("orxonox/explosion_sparks2");
     444            effect->setLifetime(5.0f);
     445        }
     446        {
     447            ParticleSpawner* effect = new ParticleSpawner(this->getContext());
     448            effect->setPosition(this->getPosition());
     449            effect->setOrientation(this->getOrientation());
     450            effect->setDestroyAfterLife(true);
     451            effect->setSource("orxonox/explosion_streak2");
     452            effect->setLifetime(5.0f);
     453        }
     454        {
     455            ParticleSpawner* effect = new ParticleSpawner(this->getContext());
     456            effect->setPosition(this->getPosition());
     457            effect->setOrientation(this->getOrientation());
     458            effect->setDestroyAfterLife(true);
     459            effect->setSource("orxonox/explosion_afterglow");
     460            effect->scale(20);
     461            effect->setLifetime(5.0f);
     462        }
     463       
     464       
    413465        for (unsigned int i = 0; i < this->numexplosionchunks_; ++i)
    414466        {
     
    418470    }
    419471
     472    /**
     473    @brief
     474        Check whether the Pawn has a @ref Orxonox::WeaponSystem and fire it with the specified firemode if it has one.
     475    */
    420476    void Pawn::fired(unsigned int firemode)
    421477    {
  • code/branches/AI_HS15/src/orxonox/worldentities/pawns/Pawn.h

    r10731 r10780  
    3939
    4040namespace orxonox // tolua_export
    41 { // tolua_export
     41{
     42    /**
     43    @brief
     44        Everything in Orxonoy that has a health attribute is a Pawn. After a Pawn is spawned its health is set to
     45        its initial health. In every call of the Pawns tick function the game checks whether the pawns health is at
     46        or below zero. If it is, the pawn gets killed.
     47
     48        Pawns can carry pickups and fire weapons. The can also have shields.
     49
     50        Notice that every Pawn is a ControllableEntity.
     51    */
     52
     53    // tolua_export
    4254    class _OrxonoxExport Pawn // tolua_export
    4355        : public ControllableEntity, public RadarViewable, public PickupCarrier
Note: See TracChangeset for help on using the changeset viewer.