示例#1
0
        /// <summary>
        /// Adds particles to the particle emitter at the specified time interval.
        /// </summary>
        /// <param name="time">The elapsed time of the past frame.</param>
        /// <param name="updateToggle">Makes sure that this entity only updated once per global Update() call.</param>
        public override void Update(bool updateToggle)
        {
            if (updateToggle != HasUpdated)
            {
                currentTime += GraphicOptions.FrameLength;
                if ((!Settings.Continuous && (currentTime > Settings.LifeSpan)) || stopped)
                {
                    emitting = false;
                }

                previousPosition = Position;
                base.Update(updateToggle);

                if (GraphicOptions.FrameLength > 0 && Emitting)
                {
                    velocity = (Position - previousPosition) / GraphicOptions.FrameLength;
                    float totalTime    = extraTime + GraphicOptions.FrameLength;
                    float particleTime = -extraTime;

                    while (totalTime > Settings.IntervalBetweenParticles)
                    {
                        particleTime += Settings.IntervalBetweenParticles;
                        totalTime    -= Settings.IntervalBetweenParticles;

                        float delta = particleTime / GraphicOptions.FrameLength;

                        Vector3 partPosition = Vector3.Lerp(previousPosition, position, delta);

                        if (Settings.VaryX)
                        {
                            partPosition += Vector3.UnitX * random.Next(-Settings.Radius, Settings.Radius);
                        }
                        if (Settings.VaryY)
                        {
                            partPosition += Vector3.UnitY * random.Next(-Settings.Radius, Settings.Radius);
                        }
                        if (Settings.VaryZ)
                        {
                            partPosition += Vector3.UnitZ * random.Next(-Settings.Radius, Settings.Radius);
                        }

                        particles.AddParticle(partPosition, velocity, this.Front);
                    }

                    extraTime = totalTime;
                }
                particles.Update();
            }
        }