Exemplo n.º 1
0
        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;
 }