/// <summary> /// Emits a single particle /// </summary> /// <param name="init">Particle creation parameters to adjust</param> internal override void Emit(ref ParticleInitParams init) { float angle = _direction + ((float)_rnd.NextDouble() * _spread) - (_spread / 2f); init.Angle = angle; init.Position = new Vector2(Position.X, Position.Y); init.Rotation = angle; }
/// <summary> /// Emits a single particle /// </summary> /// <param name="init">Particle init parameters to modify</param> internal override void Emit(ref ParticleInitParams init) { float angle = (float)_rnd.NextDouble() * MathHelper.TwoPi; init.Angle = angle; init.Position = new Vector2( Position.X + (float)Math.Sin(angle) * _radius, Position.Y + (float)Math.Cos(angle) * _radius); init.Rotation = angle; }
/// <summary> /// Emits a single particle /// </summary> /// <param name="init">Particle init parameters to modify</param> internal override void Emit(ref ParticleInitParams init) { init.Position.X = Position.X; init.Position.Y = Position.Y; float angle = (float)_rnd.NextDouble() * MathHelper.TwoPi; init.Angle = angle; init.Rotation = angle; }
/// <summary> /// Emits a single particle /// </summary> /// <param name="createParams">Particle init parameters to modify</param> internal override void Emit(ref ParticleInitParams init) { //Go to the next segment in the spiral if (_dir == SpiralDirection.AntiClockwise) { _currentSegment++; if (_currentSegment >= _segments) { _currentSegment = 0; } } else { _currentSegment--; if (_currentSegment <= 0) { _currentSegment = _segments; } } float angle = (MathHelper.TwoPi / _segments) * _currentSegment; init.Angle = angle; init.Position = new Vector2( Position.X + (float)Math.Sin(angle) * _radius, Position.Y + (float)Math.Cos(angle) * _radius); init.Rotation = angle; }
/// <summary> /// Reincarnates the particle with new properties /// </summary> public void Reincarnate( ParticleInitParams init) { _creationTime = Environment.TickCount; _lifespan = _emitter.ParticleLifespanVariated; _baseRotation = init.Rotation; _additionalRotation = 0f; _position = init.Position; _speed = _emitter.ParticleSpeedVariated; _angle = init.Angle; _scale = _emitter.InitialScale; _color = new Vector4(); //_color = new Vector4( // _emitter.StartingAlpha, _emitter.StartingRed, // _emitter.StartingGreen, _emitter.StartingBlue); _alive = true; _emitter.ActiveParticles.Add(this); }
/// <summary> /// Emits a single particle /// </summary> internal abstract void Emit(ref ParticleInitParams init);
/// <summary> /// Triggers the particles emitter /// </summary> public void Trigger() { ParticleInitParams init = new ParticleInitParams(); for (int i = 0; i < _emitQuantity; i++) { Emit(ref init); if (_limbo.Count > 0) { _limbo.Dequeue().Reincarnate(init); } else { _activeParticles.Add(new Particle(this, init)); } } }