123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #region File Description
- //-----------------------------------------------------------------------------
- // ExplosionParticleSystem.cs
- //
- // Microsoft XNA Community Game Platform
- // Copyright (C) Microsoft Corporation. All rights reserved.
- //-----------------------------------------------------------------------------
- #endregion
- #region Using Statements
- using System;
- using System.Collections.Generic;
- using System.Text;
- using Microsoft.Xna.Framework;
- using Microsoft.Xna.Framework.Graphics;
- #endregion
- namespace ParticleSample
- {
- /// <summary>
- /// ExplosionParticleSystem is a specialization of ParticleSystem which creates a
- /// fiery explosion. It should be combined with ExplosionSmokeParticleSystem for
- /// best effect.
- /// </summary>
- public class ExplosionParticleSystem : ParticleSystem
- {
- public ExplosionParticleSystem(ParticleSampleGame game, int howManyEffects)
- : base(game, howManyEffects)
- {
- }
- /// <summary>
- /// Set up the constants that will give this particle system its behavior and
- /// properties.
- /// </summary>
- protected override void InitializeConstants()
- {
- textureFilename = "explosion";
- // 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 = .5f;
- maxLifetime = 1.0f;
- minScale = .3f;
- maxScale = 1.0f;
- // we need to reduce the number of particles on Windows Phone in order to keep
- // a good framerate
- #if WINDOWS_PHONE
- minNumParticles = 10;
- maxNumParticles = 12;
- #else
- minNumParticles = 20;
- maxNumParticles = 25;
- #endif
- minRotationSpeed = -MathHelper.PiOver4;
- maxRotationSpeed = MathHelper.PiOver4;
- // additive blending is very good at creating fiery effects.
- blendState = 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;
- }
- }
- }
|