123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- #region File Description
- //-----------------------------------------------------------------------------
- // ParticleEffectManager.cs
- //
- // Microsoft XNA Community Game Platform
- // Copyright (C) Microsoft Corporation. All rights reserved.
- //-----------------------------------------------------------------------------
- #endregion
- #region Using Statements
- using System;
- using System.IO;
- using System.Collections.Generic;
- using Microsoft.Xna.Framework;
- using Microsoft.Xna.Framework.Graphics;
- using Microsoft.Xna.Framework.Content;
- #endregion
- namespace NetRumble
- {
- public class ParticleEffectManager
- {
- #region Effect Collection Data
- /// <summary>
- /// Cache of registered particle effects.
- /// </summary>
- private Dictionary<ParticleEffectType, List<ParticleEffect>> particleEffectCache
- = new Dictionary<ParticleEffectType,List<ParticleEffect>>();
- /// <summary>
- /// Active particle effects.
- /// </summary>
- private BatchRemovalCollection<ParticleEffect> activeParticleEffects =
- new BatchRemovalCollection<ParticleEffect>();
- #endregion
- #region Graphics Data
- /// <summary>
- /// The content manager used to load textures in the particle systems.
- /// </summary>
- private ContentManager contentManager;
- #endregion
- #region Initialization Methods
- /// <summary>
- /// Construct a new particle-effect manager.
- /// </summary>
- public ParticleEffectManager(ContentManager contentManager)
- {
- // safety-check the parameters
- if (contentManager == null)
- {
- throw new ArgumentNullException("contentManager");
- }
- this.contentManager = contentManager;
- }
- #endregion
- #region Updating Methods
-
- /// <summary>
- /// Update the particle-effect manager.
- /// </summary>
- /// <param name="elapsedTime">The amount of elapsed time, in seconds.</param>
- public void Update(float elapsedTime)
- {
- for (int i = 0; i < activeParticleEffects.Count; ++i)
- {
- if (activeParticleEffects[i].Active)
- {
- activeParticleEffects[i].Update(elapsedTime);
- if (!activeParticleEffects[i].Active)
- {
- activeParticleEffects.QueuePendingRemoval(
- activeParticleEffects[i]);
- }
- }
- }
- activeParticleEffects.ApplyPendingRemovals();
- }
- #endregion
- #region Drawing Methods
- /// <summary>
- /// Draw all of the particle effects in the manager.
- /// </summary>
- /// <param name="spriteBatch">The SpriteBatch object used to draw.</param>
- /// <param name="blendMode">Filters the systems drawn in this pass.</param>
- public virtual void Draw(SpriteBatch spriteBatch, SpriteBlendMode blendMode)
- {
- for (int i = 0; i < activeParticleEffects.Count; ++i)
- {
- if (activeParticleEffects[i].Active)
- {
- activeParticleEffects[i].Draw(spriteBatch, blendMode);
- }
- }
- }
- #endregion
- #region Particle-Effect Creation Methods
- /// <summary>
- /// Spawn a new particle effect at a given location
- /// </summary>
- /// <param name="effectType">The effect in question.</param>
- /// <param name="position">The position of the effect.</param>
- /// <returns>The new particle effect.</returns>
- public ParticleEffect SpawnEffect(ParticleEffectType effectType,
- Vector2 position)
- {
- return SpawnEffect(effectType, position, null);
- }
- /// <summary>
- /// Spawn a new particle effect at a the position of a given gameplay object
- /// </summary>
- /// <param name="effectType">The effect in question.</param>
- /// <param name="actor">The gameplay object.</param>
- /// <returns>The new particle effect.</returns>
- public ParticleEffect SpawnEffect(ParticleEffectType effectType,
- GameplayObject gameplayObject)
- {
- // safety-check the parameter
- if (gameplayObject == null)
- {
- throw new ArgumentNullException("gameplayObject");
- }
- return SpawnEffect(effectType, gameplayObject.Position, gameplayObject);
- }
- /// <summary>
- /// Spawn a new particle effect at a given location and gameplay object
- /// </summary>
- /// <param name="effectType">The effect in question.</param>
- /// <param name="position">The position of the effect.</param>
- /// <param name="actor">The gameplay object.</param>
- /// <returns>The new particle effect.</returns>
- public ParticleEffect SpawnEffect(ParticleEffectType effectType,
- Vector2 position, GameplayObject gameplayObject)
- {
- ParticleEffect particleEffect = null;
- if (particleEffectCache.ContainsKey(effectType) == true)
- {
- List<ParticleEffect> availableSystems = particleEffectCache[effectType];
- for (int i = 0; i < availableSystems.Count; ++i)
- {
- if (availableSystems[i].Active == false)
- {
- particleEffect = availableSystems[i];
- break;
- }
- }
- if (particleEffect == null)
- {
- particleEffect = availableSystems[0].Clone();
- particleEffect.Initialize(contentManager);
- availableSystems.Add(particleEffect);
- }
- }
- if (particleEffect != null)
- {
- particleEffect.Reset();
- particleEffect.GameplayObject = gameplayObject;
- particleEffect.Position = position;
- activeParticleEffects.Add(particleEffect);
- }
- return particleEffect;
- }
- #endregion
- #region Registration Methods
- /// <summary>
- /// Register a new type of particle effect with the manager.
- /// </summary>
- /// <param name="effectType">The enumeration associated with this type.</param>
- /// <param name="filename">The path to the XML file to be deserialized.</param>
- /// <param name="initialCount">How many of these to pre-create.</param>
- public void RegisterParticleEffect(ParticleEffectType effectType,
- string filename, int initialCount)
- {
- if (!particleEffectCache.ContainsKey(effectType))
- {
- string filepath = Path.Combine(contentManager.RootDirectory, filename);
- ParticleEffect particleEffect = ParticleEffect.Load(filepath);
- particleEffect.Initialize(contentManager);
- particleEffect.Stop(true);
- particleEffectCache.Add(effectType, new List<ParticleEffect>());
- particleEffectCache[effectType].Add(particleEffect);
- for (int i = 1; i < initialCount; i++)
- {
- ParticleEffect cloneEffect = particleEffect.Clone();
- cloneEffect.Initialize(contentManager);
- cloneEffect.Stop(true);
- particleEffectCache[effectType].Add(cloneEffect);
- }
- }
- }
- /// <summary>
- /// Remove the given particle-effect type from the maanger.
- /// </summary>
- /// <param name="effectType">The enumeration to be cleared against.</param>
- public void UnregisterParticleEffect(ParticleEffectType effectType)
- {
- if (particleEffectCache.ContainsKey(effectType) == true)
- {
- for (int i = 0; i < particleEffectCache[effectType].Count; ++i)
- {
- activeParticleEffects.Remove(particleEffectCache[effectType][i]);
- }
- particleEffectCache.Remove(effectType);
- }
- }
- #endregion
- }
- }
|