Beispiel #1
0
        public void Simulate(float elapsedMS)
        {
            //Advance the time of the simulation
            m_time.TickMS(elapsedMS);

            //Emit particles as necessary
            if (m_active)
            {
                m_particleToEmit += Definition.EmitRate * elapsedMS / 1000.0f;
            }
            if (m_active && /*m_emissionTimer.Active == false && */ m_particleToEmit >= 1)
            {
                m_emissionTimer.Start();
                for (int i = 0; i < m_particleToEmit; i++)
                {
                    Emit();
                    m_particleToEmit--;
                }
            }

            //ResetModifiers
            for (int i = 0; i <= m_maxUsedIndex; i++)
            {
                m_particles[i].ScaleModifier = Vector2.One;
                m_particles[i].ColorModifier = m_particles[i].Color;
            }

            //Run through all modifiers
            for (int i = 0; i <= m_maxUsedIndex; i++)
            {
                for (int iMod = 0; iMod < m_modifiers.Count; iMod++)
                {
                    m_modifiers[iMod].Modify(m_particles, i, i + 1, elapsedMS);
                }
            }

            //Update age and position
            float velocityScale = 0.1f;

            for (int i = 0; i <= m_maxUsedIndex; i++)
            {
                m_particles[i].Age         += elapsedMS;
                m_particles[i].Position    += m_particles[i].Velocity * elapsedMS * velocityScale;
                m_particles[i].Orientation += m_particles[i].AngularVelocity * elapsedMS;
            }

            //Finally, remove all dead particle
            for (int i = 0; i <= m_maxUsedIndex; i++)
            {
                if (m_particles[i].Alive && m_particles[i].Age >= m_particles[i].LifetimeMS)
                {
                    m_particles[i].Alive = false;
                    m_freeParticles.Push(i);
                }
            }
        }