/// <summary> /// Makes the weatherEffect to move down and loop on screen /// </summary> public void VerticalScrollingUpdate(GameTime gameTime) { animationVerticalScrollingOffset += new Vector2(0, Parameter.WeatherEffectVerticalScrollingUpdateSpeed) * (float)gameTime.ElapsedGameTime.TotalSeconds; //Update position if (animationVerticalScrollingOffset.Y >= 1) { Vector2 roundOffset = new Vector2((float)Math.Round(animationVerticalScrollingOffset.X), (float)Math.Round(animationVerticalScrollingOffset.Y)); flipbookList.ForEach((x) => x.Position += roundOffset); animationVerticalScrollingOffset = Vector2.Zero; } //Move the flipbook to the origin Flipbook lE = flipbookList.Last(); if (lE.Position.Y - lE.SourceRectangle.Height * Scale >= Topography.MapHeight / 2) { lE.Position = flipbookList[0].Position - new Vector2(0, lE.Pivot.Y * 2) * Scale; int newFrame = flipbookList[0].GetCurrentFrame() - 1; lE.SetCurrentFrame(newFrame < 0 ? (numberOfFrames - 1) : newFrame); flipbookList.Remove(lE); flipbookList.Insert(0, lE); } }
/// <summary> /// Instances all Flipbooks in position and set it's animations /// </summary> public virtual void Initialize(string texturePath, Vector2 startingPosition, WeatherAnimationType animationType, int extraSpawns = 0, float layerDepth = DepthParameter.WeatherEffect) { Vector2 endingPosition = new Vector2(Topography.MapWidth, Topography.MapHeight) / 2; //Creates the initial offset and 'subtracts' the pivot influence of the element. Vector2 currentOffset = startingPosition + Vector2.Transform(new Vector2(0, flipbookPivot.Y), Matrix.CreateRotationZ(rotation)) * Scale; int startingFrame = 0; Vector2 temporaryOffset = Vector2.Zero; do { currentOffset += temporaryOffset; //FixedAnimationsFrames is used on random //VariableAnimationFrame is used on tornado, weakness and force AnimationInstance animation = new AnimationInstance() { TimePerFrame = 1 / 15f }; switch (animationType) { case WeatherAnimationType.FixedAnimationFrame: animation.StartingFrame = animation.EndingFrame = startingFrame % numberOfFrames; break; case WeatherAnimationType.VariableAnimationFrame: animation.EndingFrame = numberOfFrames - 1; break; } startingFrame++; Flipbook fb = new Flipbook(currentOffset, flipbookPivot, (int)flipbookPivot.X * 2, (int)flipbookPivot.Y * 2, texturePath, animation, DepthParameter.WeatherEffect, rotation); fb.Scale *= Scale; flipbookList.Add(fb); fb.SetCurrentFrame(startingFrame % numberOfFrames); if (temporaryOffset == Vector2.Zero) { temporaryOffset = Vector2.Transform(new Vector2(0, fb.SpriteHeight), Matrix.CreateRotationZ(rotation)) * Scale; } //While it is inside the map boundaries and extraSpawns is not 0 } while (Topography.IsInsideMapBoundaries(currentOffset) || extraSpawns-- > 0); //If the rotation isn't 0 it means there are no good reasons for collision boxes if (rotation == 0) { collisionRectangle = new Rectangle((int)(startingPosition.X - collisionRectangleOffset.X * Scale), (int)startingPosition.Y, (int)(collisionRectangleOffset.X * 2 * Scale), (int)(endingPosition.Y - startingPosition.Y)); outerCollisionRectangle = new Rectangle(collisionRectangle.X - (int)outerCollisionRectangleOffset.X, collisionRectangle.Y - (int)outerCollisionRectangleOffset.Y, collisionRectangle.Width + (int)outerCollisionRectangleOffset.X * 2, collisionRectangle.Height + 10 * 2); #if DEBUG debugRectangle = new DebugRectangle(Color.Blue); debugRectangle.Update(collisionRectangle); DebugHandler.Instance.Add(debugRectangle); outerDebugRectangle = new DebugRectangle(Color.Red); outerDebugRectangle.Update(outerCollisionRectangle); DebugHandler.Instance.Add(outerDebugRectangle); #endif } }