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 particles; private List textures; public ParticleEngine(List textures, Vector2 location) { EmitterLocation = location; this.textures = textures; this.particles = new List(); 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(); } } }