From 14d42ff7dced5565d9c2335410e31b2b96068b5a Mon Sep 17 00:00:00 2001 From: Syntriax Date: Tue, 31 Mar 2026 17:47:39 +0300 Subject: [PATCH] feat: added ball trail --- Shared/Behaviours/BallTrail.cs | 55 ++++++++++++++++++++++++++++++++++ Shared/PongUniverse.cs | 9 +++--- 2 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 Shared/Behaviours/BallTrail.cs diff --git a/Shared/Behaviours/BallTrail.cs b/Shared/Behaviours/BallTrail.cs new file mode 100644 index 0000000..784683c --- /dev/null +++ b/Shared/Behaviours/BallTrail.cs @@ -0,0 +1,55 @@ +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 + ); + } + } +} diff --git a/Shared/PongUniverse.cs b/Shared/PongUniverse.cs index 4086709..c1093c8 100644 --- a/Shared/PongUniverse.cs +++ b/Shared/PongUniverse.cs @@ -78,10 +78,11 @@ public static class PongUniverse //////////////////////////////////////////////////////////////////////////////////// universe.InstantiateUniverseObject().SetUniverseObject("Ball") - .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0, 0f), scale: new Vector2D(10f, 10f)) - .BehaviourController.AddBehaviour(new Circle(Vector2D.Zero, 1f)) - .BehaviourController.AddBehaviour() - .BehaviourController.AddBehaviour(); + .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0, 0f), scale: new Vector2D(10f, 10f)) + .BehaviourController.AddBehaviour(new Circle(Vector2D.Zero, 1f)) + .BehaviourController.AddBehaviour() + .BehaviourController.AddBehaviour() + .BehaviourController.AddBehaviour(); ////////////////////////////////////////////////////////////////////////////////////