public override void Update() { base.Update(); if(isEmitting) { for (int i = 0; i < emitAmount; i++) { // Create a particle! Particle newParticle = new Particle(this.X, this.Y, imageSource, imageWidth, imageHeight); newParticle.LifeSpan = particleLifetime; // Figure out the final X and Y positions of this particle // Based on angle, distance jitter etc float thisAngle = this.emitAngle + (Rand.Float(-emitAngleJitter, emitAngleJitter)); float thisDistance = this.emitDistance + (Rand.Float(-emitDistanceJitter, emitDistanceJitter)); thisAngle = thisAngle * ((float)Math.PI / 180.0f); newParticle.FinalX = this.X + (float)Math.Sin(thisAngle) * thisDistance; newParticle.FinalY = this.Y + (float)Math.Cos(thisAngle) * thisDistance; if(particleMovementInverted) // Move from outside inwards { // Can't pass properties by reference in C# float finalX = newParticle.FinalX; float finalY = newParticle.FinalY; Utilities.Swap(ref finalX, ref this.X); Utilities.Swap(ref finalY, ref this.Y); newParticle.FinalX = finalX; newParticle.FinalY = finalY; } newParticle.ScaleX = particleStartScale; newParticle.ScaleY = particleStartScale; newParticle.FinalScaleX = particleEndScale; newParticle.FinalScaleY = particleEndScale; newParticle.Color = beginColour; newParticle.FinalColor = endColour; newParticle.Alpha = beginColour.A; newParticle.FinalAlpha = endColour.A; newParticle.Angle = particleStartRotation; newParticle.FinalAngle = particleEndRotation; newParticle.Animate = particlesAnimated; newParticle.FrameCount = numParticleFrames; newParticle.FrameOffset = Rand.Int(0, numParticleFrames - 1); newParticle.Loops = particleAnimLoops; // Draw particles on top of all but the HUD newParticle.Layer = 7; newParticle.CenterOrigin = true; newParticle.Start(); // Initialize graphics newParticle.Graphic.Shake = particleShake; // Add to scene if global, and to system local space if local //if (particleLocalSpace) // { activeLocalParticles.Add(newParticle); // } this.Scene.Add(newParticle); } } // If we have local particles... if(particleLocalSpace) { foreach (Particle particle in activeLocalParticles) { // Move the particles with the parent system particle.FinalX += (X - oldX); particle.FinalY += (Y - oldY); particle.Angle = Angle; } } // Update particle system's old position oldX = X; oldY = Y; }