/// <summary> /// InitializeParticle randomizes some properties for a particle, then /// calls initialize on it. It can be overriden by subclasses if they /// want to modify the way particles are created. For example, /// SmokePlumeParticleSystem overrides this function make all particles /// accelerate to the right, simulating wind. /// </summary> /// <param name="p">the particle to initialize</param> /// <param name="where">the position on the screen that the particle should be /// </param> protected virtual void InitializeParticle(Particle p, Vector2 where) { // first, call PickRandomDirection to figure out which way the particle // will be moving. velocity and acceleration's values will come from this. Vector2 direction = PickRandomDirection(); // pick some random values for our particle float velocity = Particle.RandomBetween(minInitialSpeed, maxInitialSpeed); float acceleration = Particle.RandomBetween(minAcceleration, maxAcceleration); float lifetime = Particle.RandomBetween(minLifetime, maxLifetime); float scale = Particle.RandomBetween(minScale, maxScale); float rotationSpeed = Particle.RandomBetween(minRotationSpeed, maxRotationSpeed); // then initialize it with those random values. initialize will save those, // and make sure it is marked as active. p.Initialize( where, velocity * direction, acceleration * direction, lifetime, scale, rotationSpeed); if (isCollidable) { p.Sphere.Radius = (texture.Width / 2) * scale; p.Sphere.Center.X = where.X; p.Sphere.Center.Y = where.Y; } }
/// <summary> /// InitializeParticle is overridden to add the appearance of wind. /// </summary> /// <param name="p">the particle to set up</param> /// <param name="where">where the particle should be placed</param> protected override void InitializeParticle(Particle p, Vector2 where) { base.InitializeParticle(p, where); // the base is mostly good, but we want to simulate a little bit of wind // heading to the right. p.Acceleration.X += Particle.RandomBetween(10, 50); }
/// <summary> /// PickRandomDirection is overriden so that we can make the particles always /// move have an initial velocity pointing up. /// </summary> /// <returns>a random direction which points basically up.</returns> protected override Vector2 PickRandomDirection() { // Point the particles somewhere between 80 and 100 degrees. // tweak this to make the smoke have more or less spread. float radians = Particle.RandomBetween( MathHelper.ToRadians(80), MathHelper.ToRadians(100)); Vector2 direction = Vector2.Zero; // from the unit circle, cosine is the x coordinate and sine is the // y coordinate. We're negating y because on the screen increasing y moves // down the monitor. direction.X = (float)Math.Cos(radians); direction.Y = -(float)Math.Sin(radians); return(direction); }
// initialize is called by ParticleSystem to set up the particle, and prepares // the particle for use. public void Initialize(Vector2 position, Vector2 velocity, Vector2 acceleration, float lifetime, float scale, float rotationSpeed) { // set the values to the requested values this.Position = position; this.Velocity = velocity; this.Acceleration = acceleration; this.Lifetime = lifetime; this.Scale = scale; this.RotationSpeed = rotationSpeed; // reset TimeSinceStart - we have to do this because particles will be // reused. this.TimeSinceStart = 0.0f; // set rotation to some random value between 0 and 360 degrees. this.Rotation = Particle.RandomBetween(0, MathHelper.TwoPi); }
/// <summary> /// PickRandomDirection is used by InitializeParticles to decide which direction /// particles will move. The default implementation is a random vector in a /// circular pattern. /// </summary> protected virtual Vector2 PickRandomDirection() { float angle = Particle.RandomBetween(0, MathHelper.TwoPi); return(new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle))); }