#region File Description //----------------------------------------------------------------------------- // Projectile.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #endregion #region Using Statements using System; using Microsoft.Xna.Framework; #endregion namespace Particle3DSample { /// /// This class demonstrates how to combine several different particle systems /// to build up a more sophisticated composite effect. It implements a rocket /// projectile, which arcs up into the sky using a ParticleEmitter to leave a /// steady stream of trail particles behind it. After a while it explodes, /// creating a sudden burst of explosion and smoke particles. /// class Projectile { #region Constants const float trailParticlesPerSecond = 200; const int numExplosionParticles = 30; const int numExplosionSmokeParticles = 50; const float projectileLifespan = 1.5f; const float sidewaysVelocityRange = 60; const float verticalVelocityRange = 40; const float gravity = 15; #endregion #region Fields ParticleSystem explosionParticles; ParticleSystem explosionSmokeParticles; ParticleEmitter trailEmitter; Vector3 position; Vector3 velocity; float age; static Random random = new Random(); #endregion /// /// Constructs a new projectile. /// public Projectile(ParticleSystem explosionParticles, ParticleSystem explosionSmokeParticles, ParticleSystem projectileTrailParticles) { this.explosionParticles = explosionParticles; this.explosionSmokeParticles = explosionSmokeParticles; // Start at the origin, firing in a random (but roughly upward) direction. position = Vector3.Zero; velocity.X = (float)(random.NextDouble() - 0.5) * sidewaysVelocityRange; velocity.Y = (float)(random.NextDouble() + 0.5) * verticalVelocityRange; velocity.Z = (float)(random.NextDouble() - 0.5) * sidewaysVelocityRange; // Use the particle emitter helper to output our trail particles. trailEmitter = new ParticleEmitter(projectileTrailParticles, trailParticlesPerSecond, position); } /// /// Updates the projectile. /// public bool Update(GameTime gameTime) { float elapsedTime = (float)gameTime.ElapsedGameTime.TotalSeconds; // Simple projectile physics. position += velocity * elapsedTime; velocity.Y -= elapsedTime * gravity; age += elapsedTime; // Update the particle emitter, which will create our particle trail. trailEmitter.Update(gameTime, position); // If enough time has passed, explode! Note how we pass our velocity // in to the AddParticle method: this lets the explosion be influenced // by the speed and direction of the projectile which created it. if (age > projectileLifespan) { for (int i = 0; i < numExplosionParticles; i++) explosionParticles.AddParticle(position, velocity); for (int i = 0; i < numExplosionSmokeParticles; i++) explosionSmokeParticles.AddParticle(position, velocity); return false; } return true; } } }