#region File Description
//-----------------------------------------------------------------------------
// ExplosionParticleSystem.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion
#region Using Statements
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
#endregion
namespace RockRainIphone.Core
{
///
/// ExplosionParticleSystem is a specialization of ParticleSystem which creates a
/// fiery explosion. It should be combined with ExplosionSmokeParticleSystem for
/// best effect.
///
public class ExplosionParticleSystem : ParticleSystem
{
public ExplosionParticleSystem(Game game, int howManyEffects)
: base(game, howManyEffects)
{
Initialize();
}
///
/// Set up the constants that will give this particle system its behavior and
/// properties.
///
protected override void InitializeConstants()
{
textureFilename = "explosion.png";
// high initial speed with lots of variance. make the values closer
// together to have more consistently circular explosions.
minInitialSpeed = 40;
maxInitialSpeed = 500;
// doesn't matter what these values are set to, acceleration is tweaked in
// the override of InitializeParticle.
minAcceleration = 0;
maxAcceleration = 0;
// explosions should be relatively short lived
minLifetime = .2f;
maxLifetime = 0.5f;
minScale = .3f;
maxScale = 1.0f;
minNumParticles = 20;
maxNumParticles = 25;
minRotationSpeed = -MathHelper.PiOver4;
maxRotationSpeed = MathHelper.PiOver4;
// additive blending is very good at creating fiery effects.
spriteBlendMode = BlendState.Additive;
DrawOrder = AdditiveDrawOrder;
}
protected override void InitializeParticle(Particle p, Vector2 where)
{
base.InitializeParticle(p, where);
// The base works fine except for acceleration. Explosions move outwards,
// then slow down and stop because of air resistance. Let's change
// acceleration so that when the particle is at max lifetime, the velocity
// will be zero.
// We'll use the equation vt = v0 + (a0 * t). (If you're not familar with
// this, it's one of the basic kinematics equations for constant
// acceleration, and basically says:
// velocity at time t = initial velocity + acceleration * t)
// We'll solve the equation for a0, using t = p.Lifetime and vt = 0.
p.Acceleration = -p.Velocity / p.Lifetime;
}
}
}