//---------------------------------------------------------------------------- //---------------------------------------------------------------------------- public virtual void Update(DeltaTime deltaTime) { if ((m_bActive || !m_bActive && (m_freeParticleList.Count != m_Particles.Count)) && ParticleController != null) { if (m_bAllowGeneration) { //We create new ones GenerateParticles(deltaTime); if (!m_bContinuosEmission) { m_bAllowGeneration = false; } } ParticleController.UpdateController(deltaTime, this); //We update each active particle. foreach (IParticle particle in m_Particles) { if (particle.Active) { particle.UpdateParticle(deltaTime); } } } }
//---------------------------------------------------------------------------- //---------------------------------------------------------------------------- public ParticleEmitter(IRenderLayer <TInfoType> renderLayer, Type particleType, ParticleController <TInfoType> controller, string szAssetName, Vector3 v3Position, int nMaxSprites) { m_RenderLayer = renderLayer; m_Particles = new List <IParticle>(nMaxSprites); m_freeParticleList = new Queue <IParticle>(nMaxSprites); SaveSerializationData("MaxSprites", nMaxSprites); SaveSerializationData("AssetName", szAssetName); SaveSerializationData("ParticleType", particleType); ParticleController = controller; m_bActive = false; m_bContinuosEmission = false; m_bAllowGeneration = false; Position = v3Position; Enabled = true; EngineServices.GetSystem <IGameSystems>().Components.Add(this); for (int nCounter = 0; nCounter < nMaxSprites; ++nCounter) { IParticle particle = Activator.CreateInstance(particleType, new object[] { m_RenderLayer, szAssetName, Position, Vector3.Zero, 0, 0, false }) as IParticle; particle.ParticleDead += DeadParticle_Event; m_Particles.Add(particle); m_freeParticleList.Enqueue(particle); } }
//---------------------------------------------------------------------------- //---------------------------------------------------------------------------- private void GenerateParticles(DeltaTime deltaTime) { if (deltaTime.ElapsedGameTime.Milliseconds > ParticleController.GenerationTimer) { for (int nCounter = 0; nCounter < ParticleController.GenerationRate; ++nCounter) { if (m_freeParticleList.Count > 0) { IParticle particle = m_freeParticleList.Dequeue(); particle.Scale = ParticleController.InitialScale; ParticleController.InitializeParticle(ref particle, this); particle.OnInitilized(); particle.Active = true; } else { break; } } } }