diff --git a/Shared/Behaviours/BallBehaviour.cs b/Shared/Behaviours/BallBehaviour.cs index c77259d..a4e5a8c 100644 --- a/Shared/Behaviours/BallBehaviour.cs +++ b/Shared/Behaviours/BallBehaviour.cs @@ -6,7 +6,8 @@ using Syntriax.Engine.Systems.Tween; namespace Pong.Behaviours; public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INetworkEntity, - IPacketListenerClient + IPacketListenerClient, + IPacketListenerClient { 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.OnClientPacketArrived(BallResetPacket packet) => ResetBall(); void IPacketListenerClient.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;