diff --git a/Shared/Behaviours/PaddleBehaviour.cs b/Shared/Behaviours/PaddleBehaviour.cs index fb8838f..aaf7435 100644 --- a/Shared/Behaviours/PaddleBehaviour.cs +++ b/Shared/Behaviours/PaddleBehaviour.cs @@ -4,12 +4,13 @@ using Microsoft.Xna.Framework.Input; using Syntriax.Engine.Core; using Syntriax.Engine.Network; +using Syntriax.Engine.Physics2D; using Syntriax.Engine.Systems.Input; using Syntriax.Engine.Systems.Tween; namespace Pong.Behaviours; -public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Speed) : Behaviour2D, +public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Speed) : Behaviour2D, IPostPhysicsUpdate, IPacketListenerServer, IPacketListenerClient { private Keys Up { get; } = Up; @@ -24,27 +25,21 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp private IButtonInputs inputs = null!; private INetworkCommunicatorClient? networkClient = null!; private INetworkCommunicatorServer? networkServer = null; - private TweenManager tweenManager = null!; + private IRigidBody2D rigidBody = null!; + private IPhysicsEngine2D physicsEngine2D = null!; - protected override void OnUpdate() + public void PostPhysicsUpdate(float delta) { - if (isUpPressed && isDownPressed) - return; - - if (isUpPressed) - Transform.Position += Vector2D.Up * Universe.Time.DeltaTime * Speed; - else if (isDownPressed) - Transform.Position += -Vector2D.Up * Universe.Time.DeltaTime * Speed; - Transform.Position = new Vector2D(Transform.Position.X, MathF.Max(MathF.Min(Transform.Position.Y, High), Low)); } protected override void OnFirstActiveFrame() { + physicsEngine2D = Universe.GetRequiredUniverseObject(); inputs = Universe.FindRequired>(); networkClient = Universe.Find(); networkServer = Universe.Find(); - tweenManager = Universe.GetRequiredUniverseObject(); + rigidBody = BehaviourController.GetRequiredBehaviour(); inputs.RegisterOnPress(Up, OnUpPressed); inputs.RegisterOnRelease(Up, OnUpReleased); @@ -62,49 +57,57 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp inputs.UnregisterOnRelease(Down, OnDownReleased); } - private void OnUpPressed(IButtonInputs inputs, Keys keys) { isUpPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } - private void OnUpReleased(IButtonInputs inputs, Keys keys) { isUpPressed = false; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } - private void OnDownPressed(IButtonInputs inputs, Keys keys) { isDownPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } - private void OnDownReleased(IButtonInputs inputs, Keys keys) { isDownPressed = false; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnUpPressed(IButtonInputs inputs, Keys keys) { isUpPressed = true; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnUpReleased(IButtonInputs inputs, Keys keys) { isUpPressed = false; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnDownPressed(IButtonInputs inputs, Keys keys) { isDownPressed = true; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnDownReleased(IButtonInputs inputs, Keys keys) { isDownPressed = false; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + + private void UpdateVelocity() + { + if (isUpPressed) + rigidBody.Velocity = Vector2D.Up * Speed; + else if (isDownPressed) + rigidBody.Velocity = -Vector2D.Up * Speed; + else + rigidBody.Velocity = Vector2D.Zero; + } public void OnServerPacketArrived(PaddleKeyStatePacket packet, string from) { - if (packet.EntityId.CompareTo(Id) != 0) - return; - - packet.Position = Transform.Position; isUpPressed = packet.IsUpPressed; isDownPressed = packet.IsDownPressed; - networkServer?.SendToClient("*", packet); + UpdateVelocity(); + + networkServer?.SendToClient("*", new PaddleKeyStatePacket(this)); } public void OnClientPacketArrived(PaddleKeyStatePacket packet) { isUpPressed = packet.IsUpPressed; isDownPressed = packet.IsDownPressed; + Transform.Position = packet.Position; - if (!isUpPressed && !isDownPressed) - Transform.Position.TweenVector2D(tweenManager, .05f, packet.Position, x => Transform.Position = x); - else - Transform.Position = packet.Position; + UpdateVelocity(); + + physicsEngine2D.StepIndividual(rigidBody, new DateTime(DateTime.UtcNow.Ticks - packet.Timestamp).Second); } public class PaddleKeyStatePacket : IEntityNetworkPacket { public string EntityId { get; set; } = default!; + public Vector2D Position { get; set; } = default!; public bool IsUpPressed { get; set; } = default!; public bool IsDownPressed { get; set; } = default!; - public Vector2D Position { get; set; } = default!; - public long TimeTicker { get; set; } = default!; + public long Timestamp { get; set; } = 0; public PaddleKeyStatePacket() { } public PaddleKeyStatePacket(PaddleBehaviour paddleBehaviour) { EntityId = paddleBehaviour.Id; + Position = paddleBehaviour.Transform.Position; IsUpPressed = paddleBehaviour.isUpPressed; IsDownPressed = paddleBehaviour.isDownPressed; - Position = paddleBehaviour.Transform.Position; - TimeTicker = DateTime.UtcNow.Ticks; + Timestamp = DateTime.UtcNow.Ticks; } } } diff --git a/Shared/GamePong.cs b/Shared/GamePong.cs index 9d8fab3..7cf865a 100644 --- a/Shared/GamePong.cs +++ b/Shared/GamePong.cs @@ -111,7 +111,7 @@ public class GamePong : Game IUniverseObject leftPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Left Paddle"); leftPaddle.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-468f, 0f), scale: new Vector2D(15f, 60f)) .BehaviourController.AddBehaviour(Shape2D.Square) - .BehaviourController.AddBehaviour().IsStatic = true; + .BehaviourController.AddBehaviour(); PaddleBehaviour leftPaddleBehaviour = BehaviourFactory.Instantiate(Keys.W, Keys.S, 228f, -228f, 400f); leftPaddleBehaviour.Id = "lp"; leftPaddle.BehaviourController.AddBehaviour(leftPaddleBehaviour); @@ -120,7 +120,7 @@ public class GamePong : Game IUniverseObject rightPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Right Paddle"); rightPaddle.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(468f, 0f), scale: new Vector2D(15f, 60f)) .BehaviourController.AddBehaviour(Shape2D.Square) - .BehaviourController.AddBehaviour().IsStatic = true; + .BehaviourController.AddBehaviour(); PaddleBehaviour rightPaddleBehaviour = BehaviourFactory.Instantiate(Keys.Up, Keys.Down, 228f, -228f, 400f); rightPaddleBehaviour.Id = "rp"; rightPaddle.BehaviourController.AddBehaviour(rightPaddleBehaviour);