+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace SuperPolarity
+{
+ class ParticleEngine
+ {
+ private Random random;
+ public Vector2 EmitterLocation { get; set; }
+ public Color Color; //TODO: Color list for random colors.
+ public int TTL;
+ public int TTLRandomFactor;
+ public int ScatterFactor;
+ public int ParticleCount;
+ public float StretchFactor;
+ private List<Particle> particles;
+ private List<Texture2D> textures;
+
+ public ParticleEngine(List<Texture2D> textures, Vector2 location)
+ {
+ EmitterLocation = location;
+ this.textures = textures;
+ this.particles = new List<Particle>();
+ random = new Random();
+ Color = Color.Red;
+ TTL = 20;
+ TTLRandomFactor = 40;
+ StretchFactor = 1;
+ }
+
+ private Particle GenerateNewParticle()
+ {
+ Texture2D texture = textures[random.Next(textures.Count)];
+ Vector2 position = EmitterLocation;
+ Vector2 velocity = new Vector2(
+ 1f * (float)(random.NextDouble() * 2 - 1),
+ 1f * (float)(random.NextDouble() * 2 - 1));
+
+ float angle = 0;
+ float angularVelocity = 0.1f * (float)(random.NextDouble() * 2 - 1);
+ Color color = Color;
+ float size = (float)random.NextDouble() * StretchFactor;
+
+ position.X += random.Next(-ScatterFactor, ScatterFactor);
+ position.Y += random.Next(-ScatterFactor, ScatterFactor);
+
+ int ttl = TTL + random.Next(TTLRandomFactor);
+
+ return new Particle(texture, position, velocity, angle, angularVelocity, color, size, ttl);
+ }
+
+ public void Update()
+ {
+ int total = 10;
+
+ for (int i = 0; i < total; i++)
+ {
+ particles.Add(GenerateNewParticle());
+ }
+
+ for (int particle = 0; particle < particles.Count; particle++)
+ {
+ particles[particle].Update();
+ if (particles[particle].TTL <= 0)
+ {
+ particles.RemoveAt(particle);
+ particle--;
+ }
+ }
+ }
+
+ public void Draw(SpriteBatch spriteBatch)
+ {
+ //spriteBatch.Begin();
+ for (int index = 0; index < particles.Count; index++)
+ {
+ particles[index].Draw(spriteBatch);
+ }
+ //spriteBatch.End();
+ }
+ }
+}