public void Update(GameTime gameTime) { MessageBuffer.Clear(); for (int i = 0; i < ParticleDataObjects.Count; i++) { ParticleData gameData = ParticleDataObjects[i]; float Rot; #region Handle particle rotation if (gameData.RotateVelocity == true) { Rot = (float)Math.Atan2(gameData.Velocity.Y, gameData.Velocity.X); } else { Rot = gameData.Rotation + MathHelper.ToRadians(gameData.RotationIncrement) * ((float)gameTime.ElapsedGameTime.TotalSeconds * 60.0f); } #endregion gameData.Update(gameTime); #region Update position Vector2 newPos = gameData.Position + gameData.Velocity; #endregion float percTime = gameData.CurrentTime / gameData.MaxTime; #region Fade transparency float transparency = gameData.StartingTransparency; if (gameData.Fade == true) { transparency = MathHelper.Lerp(gameData.StartingTransparency, 0, percTime); //transparency = gameData.StartingTransparency * (1.0f - ((1 / (gameData.MaxTime + gameData.FadeDelay)) * (gameData.CurrentTime + gameData.CurrentFadeDelay))); } #endregion #region Scale particles float newScale = gameData.CurrentScale; if (gameData.Shrink == true && gameData.Grow == false) { newScale = gameData.MaxScale * (1.0f - ((1 / gameData.MaxTime) * (gameData.CurrentTime))); } if (gameData.Grow == true && gameData.Shrink == false) { newScale = gameData.MaxScale * ((1 / gameData.MaxTime) * (gameData.CurrentTime)); } if (gameData.Shrink == true && gameData.Grow == true) { newScale = gameData.MaxScale * (float)Math.Sin(Math.PI * percTime); } #endregion #region Fade Colours Color newCol = Color.Lerp(gameData.StartColor, gameData.EndColor, percTime); #endregion //transparency = MathHelper.Lerp(gameData.StartingTransparency, 0, percTime); ChangeMessage msg = new ChangeMessage() { ID = i }; if (gameData.Active == false) { msg.MessageType = ChangeMessageType.DeleteRenderData; ParticleDataObjects.Remove(gameData); MessageBuffer.Add(msg); i--; } if (gameData.CurrentTime <= gameData.MaxTime) { msg.MessageType = ChangeMessageType.UpdateParticle; msg.Position = newPos; msg.Rotation = Rot; msg.Color = newCol; msg.Scale = newScale; msg.Transparency = transparency; MessageBuffer.Add(msg); gameData.Position = newPos; gameData.Rotation = Rot; } } }
public void AddParticle(Texture2D texture, Vector2 pos, Vector2 angleRange, Vector2 speedRange, Vector2 scaleRange, Color startColor, Color endColor, float gravity, bool shrink, bool fade, Vector2 startingRotation, Vector2 rotationIncrement, float startingTransparency, Vector2 timeRange, bool grow, bool rotateVelocity, Vector2 friction, int orientation, float fadeDelay, Vector2 yRange, bool canBounce, bool stopBounce, bool hardBounce, float drawDepth, bool emissive, bool lit, int sourceID, out ParticleData gameData, out RenderData renderData) { float myAngle, mySpeed, myScale, myRotation, myIncrement, myTime, myBounceY; Vector2 Direction, myVelocity; mySpeed = (float)DoubleRange(speedRange.X, speedRange.Y); myAngle = -MathHelper.ToRadians((float)DoubleRange(angleRange.X, angleRange.Y)); myScale = (float)DoubleRange(scaleRange.X, scaleRange.Y); myRotation = MathHelper.ToRadians((float)DoubleRange(startingRotation.X, startingRotation.Y)); myIncrement = MathHelper.ToRadians((float)DoubleRange(rotationIncrement.X, rotationIncrement.Y)); myTime = (float)DoubleRange(timeRange.X, timeRange.Y); myBounceY = (float)DoubleRange(yRange.X, yRange.Y); Direction.X = (float)Math.Cos(myAngle); Direction.Y = (float)Math.Sin(myAngle); myVelocity = Direction * mySpeed; gameData = new ParticleData() { Active = true, Position = pos, Angle = angleRange, CurrentTime = 0, MaxTime = myTime, Velocity = myVelocity, StartColor = startColor, EndColor = endColor, Gravity = gravity, CurrentScale = myScale, MaxScale = myScale, Shrink = shrink, Grow = grow, Fade = fade, Friction = friction, StartingTransparency = startingTransparency, Rotation = myRotation, RotationIncrement = myIncrement, RotateVelocity = rotateVelocity, FadeDelay = fadeDelay, CurrentFadeDelay = 0, BounceY = myBounceY, CanBounce = canBounce, HardBounce = hardBounce, StopBounce = stopBounce, HasBounced = false, SourceID = sourceID }; if (grow == true) { myScale = 0; } renderData = new RenderData() { Texture = texture, Position = gameData.Position, Color = startColor, Rotation = myRotation, Scale = myScale, Transparency = startingTransparency, Orientation = orientation, DrawDepth = drawDepth, Emissive = emissive, Lit = lit }; }