- Timestamp:
- May 23, 2015, 7:33:37 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/weaponFS15/src/modules/weapons/projectiles/GravityBombField.cc
r10435 r10455 3 3 * 4 4 * Created on: Apr 2, 2015 5 * Author: meggiman5 * Author: Manuel Eggimann 6 6 */ 7 7 … … 12 12 RegisterClass(GravityBombField); 13 13 14 const float GravityBombField::FORCE_FIELD_LIFETIME = 20; 14 //Change these constants to alter the behaviour of the field. 15 16 const float GravityBombField::FORCE_FIELD_LIFETIME = 15; 15 17 const float GravityBombField::FORCE_SPHERE_START_RADIUS = 250; 16 18 const float GravityBombField::FORCE_SPHERE_START_STRENGTH = -500; 17 const float GravityBombField::PEAK_EXPLOSION_FORCE = 1e6;19 const float GravityBombField::PEAK_EXPLOSION_FORCE = 5e4; 18 20 const float GravityBombField::FORCE_FIELD_EXPLOSION_DAMMAGE = 100; 19 21 const float GravityBombField::EXPLOSION_DURATION = 1; 20 const float GravityBombField::EXPLOSION_RADIUS = 400;22 const float GravityBombField::EXPLOSION_RADIUS = 600; 21 23 const float GravityBombField::PEAK_ANGULAR_VELOCITY = 20; 24 const float GravityBombField::CENTRE_MODEL_END_SIZE = 1.5; 22 25 23 26 GravityBombField::GravityBombField(Context* context) : ForceField(context),RadarViewable(this, static_cast<WorldEntity*>(this)) 24 27 { 25 28 RegisterObject(GravityBombField); 29 //Initialize variable with their initial values. 26 30 lifetime_=FORCE_FIELD_LIFETIME; 27 31 forceStrength_ = FORCE_SPHERE_START_STRENGTH; 28 32 forceSphereRadius_ = FORCE_SPHERE_START_RADIUS; 33 modelScaling_ = 1; 29 34 fieldExploded_ = false; 30 35 … … 34 39 setCollisionResponse(false); 35 40 41 //Make the Field visible on Radar and minimap. 36 42 this->setRadarObjectColour(ColourValue(0.2, 0.2, 1.0,1)); // Blue 37 43 this->setRadarObjectShape(RadarViewable::Dot); 38 44 this->setRadarObjectScale(0.5f); 45 39 46 40 47 //Attach Model 41 48 Model* model = new Model(this->getContext()); 42 49 model->setMeshSource("GravityBomb.mesh"); //Demo Model from SimpleRocket 43 model->scale( 3.0f);50 model->scale(2.5f); 44 51 bombModel_ = new MovableEntity(context); 45 52 bombModel_->attach(model); 46 53 this->attach(bombModel_); 47 54 48 Backlight* centreLight = new Backlight(context); 49 centreLight->setColour(ColourValue(0.9,0.5,0.5,1)); 50 centreLight->setScale(1.0); 51 centreLight->setTrailMaterial("Trail/backlighttrail"); 52 centreLight->setMaterial("Examples/Flare"); 53 centreLight->setLifetime(20); 54 bombModel_->attach(centreLight); 55 //Add a Backlight to the centre. 56 centreLight_ = new Backlight(context); 57 centreLight_->setColour(ColourValue(0.2,0.9,0.2,1)); 58 centreLight_->setScale(0.3); 59 centreLight_->setTrailMaterial("Trail/backlighttrail"); 60 centreLight_->setMaterial("Examples/Flare"); 61 centreLight_->setLifetime(20); 62 bombModel_->attach(centreLight_); 55 63 64 //Let the Bomb Modell in the centre rotate in a random direction. 56 65 Vector3 randomRotation; 57 66 srand(time(NULL)); … … 64 73 //Add Collision Shape 65 74 SphereCollisionShape* collisionShape = new SphereCollisionShape(context); 66 collisionShape->setRadius( 3.0);75 collisionShape->setRadius(10.0); 67 76 this->attachCollisionShape(collisionShape); 68 77 78 //Add particle effect to visualize the force field. 69 79 this->particleSphere_ = new ParticleEmitter(this->getContext()); 70 80 this->attach(this->particleSphere_); 71 81 particleSphere_->setSource("Orxonox/GravityBombField"); 82 83 //Add a sound effect to the field. 84 WorldSound* fieldSound = new WorldSound(context); 85 fieldSound->setSource("sounds/GravityField.ogg"); 86 fieldSound->setLooping(true); 87 fieldSound->setVolume(1.0); 88 this->attach(fieldSound); 89 fieldSound->play(); 72 90 } 73 91 74 92 GravityBombField::~GravityBombField(){} 75 93 94 76 95 void GravityBombField::tick(float dt) 77 96 { … … 79 98 lifetime_-=dt; 80 99 81 if(lifetime_ > EXPLOSION_DURATION) 100 if(lifetime_ > EXPLOSION_DURATION)//If field is still alive, make it smaller and stronger. 82 101 { 102 modelScaling_ += ((CENTRE_MODEL_END_SIZE-1) / FORCE_FIELD_LIFETIME)*dt; 83 103 forceStrength_ *= (1+dt/10); 84 104 forceSphereRadius_ = FORCE_SPHERE_START_RADIUS*(1-((FORCE_FIELD_LIFETIME-lifetime_)/FORCE_FIELD_LIFETIME)*((FORCE_FIELD_LIFETIME-lifetime_)/FORCE_FIELD_LIFETIME)*((FORCE_FIELD_LIFETIME-lifetime_)/FORCE_FIELD_LIFETIME)); … … 86 106 else if(lifetime_ > 0) 87 107 { 88 if (!fieldExploded_) 108 if (!fieldExploded_) // Start the field explosion if it has not been started yet. 89 109 { 90 forceStrength_ = PEAK_EXPLOSION_FORCE;110 forceStrength_ = pow((EXPLOSION_DURATION + lifetime_),4)/EXPLOSION_DURATION * PEAK_EXPLOSION_FORCE; 91 111 fieldExploded_ = true; 92 112 113 //Add particle effect to visualize explosion 93 114 explosionCross_ = new ParticleEmitter(this->getContext()); 115 explosionCross_->setSource("Orxonox/FieldExplosion"); 116 explosionCross_->setOrientation(rand(), rand(), rand(), rand()); 117 explosionCross_->setScale(0.7); 94 118 this->attach(explosionCross_); 95 explosionCross_->setSource("Orxonox/FieldExplosion"); 119 120 //Add explosion sound effect. 121 explosionSound_ = new WorldSound(getContext()); 122 explosionSound_->setSource("sounds/GravityFieldExplosion.ogg"); 123 explosionSound_->setVolume(1.0); 124 explosionSound_->play(); 96 125 } 97 126 127 //Check if any pawn is inside the shockwave and hit it with dammage proportional to the distance between explosion centre and pawn. Make sure, the same pawn is damaged only once. 98 128 for (ObjectList<Pawn>::iterator it = ObjectList<Pawn>::begin(); it != ObjectList<Pawn>::end(); ++it) 99 129 { 100 130 Vector3 distanceVector = it->getWorldPosition()-this->getWorldPosition(); 101 orxout(debug_output) << "Found Pawn:" << it->getWorldPosition() << endl;131 //orxout(debug_output) << "Found Pawn:" << it->getWorldPosition() << endl; 102 132 if(distanceVector.length()< forceSphereRadius_) 103 133 { 104 orxout(debug_output) << "Force sphere radius is: " << forceSphereRadius_ << " Distance to Pawn is: " << distanceVector.length();134 //orxout(debug_output) << "Force sphere radius is: " << forceSphereRadius_ << " Distance to Pawn is: " << distanceVector.length(); 105 135 if (std::find(victimsAlreadyDamaged_.begin(),victimsAlreadyDamaged_.end(),*it) == victimsAlreadyDamaged_.end()) 106 136 { 107 orxout(debug_output) << "Found Pawn to damage: " << it->getWorldPosition() << endl;137 //orxout(debug_output) << "Found Pawn to damage: " << it->getWorldPosition() << endl; 108 138 float damage = FORCE_FIELD_EXPLOSION_DAMMAGE*(1-distanceVector.length()/EXPLOSION_RADIUS); 109 orxout(debug_output) << "Damage: " << damage << endl;139 //orxout(debug_output) << "Damage: " << damage << endl; 110 140 it->hit(shooter_, it->getWorldPosition(), NULL, damage, 0,0); 111 // it->removeHealth(damage);112 141 victimsAlreadyDamaged_.push_back(*it); 113 142 } … … 118 147 explosionCross_->setScale(forceSphereRadius_/FORCE_SPHERE_START_RADIUS); 119 148 } 120 else if (lifetime_ > - 4)149 else if (lifetime_ > -6) //The field has to exist for 6 more seconds for the particles of the particle effect to vanish smoothly. 121 150 { 151 //Make the bomb model invisible, let the strength of the field be zero and remove all particle emitters so the particle effect will slowly vanish. 122 152 bombModel_->setVisible(false); 123 153 this->setRadarVisibility(false); … … 127 157 explosionCross_->getParticleInterface()->removeAllEmitters(); 128 158 } 129 159 130 160 setDiameter(forceSphereRadius_*2); 131 161 setVelocity(forceStrength_); 132 particleSphere_->setScale(forceSphereRadius_/FORCE_SPHERE_START_RADIUS); 162 if(lifetime_>0) particleSphere_->setScale(forceSphereRadius_/FORCE_SPHERE_START_RADIUS); 163 bombModel_->setScale(modelScaling_); 133 164 134 165 if (lifetime_ <= -4) … … 141 172 void GravityBombField::destroy() 142 173 { 143 //Animation144 174 ForceField::destroy(); 145 175 }
Note: See TracChangeset
for help on using the changeset viewer.