public void Update(GameTime gameTime) { bilboards.RemoveAll(b => bilboardsToRemove.Contains(b)); bilboardsToRemove.Clear(); bilboards.ForEach(b => b.Update(gameTime)); int numberOfParticleToCreate = (int)Math.Max(1, ParticlesPerSecond * gameTime.ElapsedGameTime.TotalSeconds); for (int i = 0; i < numberOfParticleToCreate; i++) { Vector3 moveDir = new Vector3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble()); moveDir.Normalize(); BilboardModel b = new BilboardModel(effect, texture); b.Position = Position; bool removed = false; b.AddComponent(new ParticleSystemElementController(b, (bb, age, deltatime) => { bb.Position = bb.Position + moveDir * (float)deltatime; if (age > ParticleLiveTime.TotalSeconds) { if (!removed) { bilboardsToRemove.Add(bb); } removed = true; } })); bilboards.Add(b); } bilboards.Sort((b1, b2) => { return(Vector3.Distance(b2.Position, Camera.Position) - Vector3.Distance(b1.Position, Camera.Position) <= 0 ? -1 : 1); }); }
public ParticleSystemElementController(BilboardModel bilboard, Action <BilboardModel, double, double> modifyParticleElement) { this.bilboard = bilboard; this.modifyParticleElement = modifyParticleElement; }