fix: ball sync issues caused by network lerp fixed

This commit is contained in:
Syntriax 2025-06-15 13:27:06 +03:00
parent 43875a6069
commit 648be2738f

View File

@ -6,7 +6,8 @@ using Syntriax.Engine.Systems.Tween;
namespace Pong.Behaviours;
public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INetworkEntity,
IPacketListenerClient<BallBehaviour.BallUpdatePacket>
IPacketListenerClient<BallBehaviour.BallUpdatePacket>,
IPacketListenerClient<BallBehaviour.BallResetPacket>
{
public float Speed { get; set; } = 500f;
public float SpeedUpMultiplier { get; set; } = .025f;
@ -16,6 +17,7 @@ public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INe
private IPhysicsEngine2D physicsEngine2D = null!;
private ITweenManager tweenManager = null!;
private INetworkCommunicatorServer? networkServer = null;
private ITween? networkTween = null;
public void FirstActiveFrame()
{
@ -35,8 +37,11 @@ public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INe
public void ResetBall()
{
if (networkTween is not null)
tweenManager.CancelTween(networkTween);
Transform.Position = Vector2D.Zero;
RigidBody.Velocity = Vector2D.Zero;
networkServer?.SendToClient("*", new BallResetPacket());
}
public void PhysicsUpdate(float delta)
@ -60,13 +65,15 @@ public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INe
public BallBehaviour() { }
public BallBehaviour(float speed) => Speed = speed;
void IPacketListenerClient<BallResetPacket>.OnClientPacketArrived(BallResetPacket packet) => ResetBall();
void IPacketListenerClient<BallUpdatePacket>.OnClientPacketArrived(BallUpdatePacket packet)
{
Transform.TweenPositionAdditive(tweenManager, .25f, Transform.Position.FromTo(packet.Position));
networkTween = Transform.TweenPositionAdditive(tweenManager, .25f, Transform.Position.FromTo(packet.Position));
RigidBody.Velocity = packet.Velocity;
physicsEngine2D.StepIndividual(RigidBody, new System.DateTime(System.DateTime.UtcNow.Ticks - packet.Timestamp).Second);
}
private class BallResetPacket : INetworkPacket;
private class BallUpdatePacket : INetworkPacket
{
public Vector2D Position { get; set; } = Vector2D.Zero;