feat: added ball trail

This commit is contained in:
2026-03-31 17:47:39 +03:00
parent 174b34dcb6
commit 14d42ff7dc
2 changed files with 60 additions and 4 deletions

View File

@@ -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<Vector2D> 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
);
}
}
}

View File

@@ -78,10 +78,11 @@ public static class PongUniverse
////////////////////////////////////////////////////////////////////////////////////
universe.InstantiateUniverseObject().SetUniverseObject("Ball")
.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(0, 0f), scale: new Vector2D(10f, 10f))
.BehaviourController.AddBehaviour<DrawableColliderCircle>(new Circle(Vector2D.Zero, 1f))
.BehaviourController.AddBehaviour<Ball>()
.BehaviourController.AddBehaviour<RigidBody2D>();
.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(0, 0f), scale: new Vector2D(10f, 10f))
.BehaviourController.AddBehaviour<DrawableColliderCircle>(new Circle(Vector2D.Zero, 1f))
.BehaviourController.AddBehaviour<Ball>()
.BehaviourController.AddBehaviour<BallTrail>()
.BehaviourController.AddBehaviour<RigidBody2D>();
////////////////////////////////////////////////////////////////////////////////////