using System.Collections.Generic; using System.Linq; using Engine.Core; using Engine.Physics2D; using Engine.Systems.Graphics; using Engine.Systems.Tween; namespace Pong.Behaviours; public class BallTrail : Behaviour2D, IPostPhysicsUpdate, IDrawableTriangle { private float width = 10f; private ColorRGBA colorBase = new ColorRGBA(255, 255, 255); private int trailTickPeriod = 20; private IEasing widthCurve = EaseInCirc.Instance; private readonly LinkedList trailPoints = new(); public void PostPhysicsUpdate(float delta) { trailPoints.AddFirst(Transform.Position); if (trailPoints.Count > trailTickPeriod) trailPoints.RemoveLast(); } public void Draw(ITriangleBatch triangleBatch) { for (int i = 0; i < trailPoints.Count - 2; i++) { Line2D line = new(trailPoints.ElementAt(i), trailPoints.ElementAt(i + 1)); Vector2D perpendicularDirection = line.Direction.Perpendicular(); float t = widthCurve.Evaluate(1f - ((float)i / trailPoints.Count)); float tPlus = widthCurve.Evaluate(1f - ((float)(i + 1) / trailPoints.Count)); float firstWidth = t * width; float endWidth = tPlus * width; triangleBatch.Draw( new(line.From + perpendicularDirection * firstWidth, line.From - perpendicularDirection * firstWidth, line.To + perpendicularDirection * endWidth), colorBase ); triangleBatch.Draw( new(line.From - perpendicularDirection * firstWidth, line.To - perpendicularDirection * endWidth, line.To + perpendicularDirection * endWidth), colorBase ); } } }