feat: paddle networking
This commit is contained in:
		@@ -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<PaddleBehaviour.PaddleKeyStatePacket>, IPacketListenerClient<PaddleBehaviour.PaddleKeyStatePacket>
 | 
			
		||||
{
 | 
			
		||||
    private Keys Up { get; } = Up;
 | 
			
		||||
@@ -24,27 +25,21 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
    private IButtonInputs<Keys> 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<IPhysicsEngine2D>();
 | 
			
		||||
        inputs = Universe.FindRequired<IButtonInputs<Keys>>();
 | 
			
		||||
        networkClient = Universe.Find<INetworkCommunicatorClient>();
 | 
			
		||||
        networkServer = Universe.Find<INetworkCommunicatorServer>();
 | 
			
		||||
        tweenManager = Universe.GetRequiredUniverseObject<TweenManager>();
 | 
			
		||||
        rigidBody = BehaviourController.GetRequiredBehaviour<IRigidBody2D>();
 | 
			
		||||
 | 
			
		||||
        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<Keys> inputs, Keys keys) { isUpPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnUpReleased(IButtonInputs<Keys> inputs, Keys keys) { isUpPressed = false; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnDownPressed(IButtonInputs<Keys> inputs, Keys keys) { isDownPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnDownReleased(IButtonInputs<Keys> inputs, Keys keys) { isDownPressed = false; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnUpPressed(IButtonInputs<Keys> inputs, Keys keys) { isUpPressed = true; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnUpReleased(IButtonInputs<Keys> inputs, Keys keys) { isUpPressed = false; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnDownPressed(IButtonInputs<Keys> inputs, Keys keys) { isDownPressed = true; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnDownReleased(IButtonInputs<Keys> 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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -111,7 +111,7 @@ public class GamePong : Game
 | 
			
		||||
        IUniverseObject leftPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Left Paddle");
 | 
			
		||||
        leftPaddle.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(-468f, 0f), scale: new Vector2D(15f, 60f))
 | 
			
		||||
            .BehaviourController.AddBehaviour<ShapeBehaviour>(Shape2D.Square)
 | 
			
		||||
            .BehaviourController.AddBehaviour<RigidBody2D>().IsStatic = true;
 | 
			
		||||
            .BehaviourController.AddBehaviour<RigidBody2D>();
 | 
			
		||||
        PaddleBehaviour leftPaddleBehaviour = BehaviourFactory.Instantiate<PaddleBehaviour>(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<Transform2D>().SetTransform(position: new Vector2D(468f, 0f), scale: new Vector2D(15f, 60f))
 | 
			
		||||
            .BehaviourController.AddBehaviour<ShapeBehaviour>(Shape2D.Square)
 | 
			
		||||
            .BehaviourController.AddBehaviour<RigidBody2D>().IsStatic = true;
 | 
			
		||||
            .BehaviourController.AddBehaviour<RigidBody2D>();
 | 
			
		||||
        PaddleBehaviour rightPaddleBehaviour = BehaviourFactory.Instantiate<PaddleBehaviour>(Keys.Up, Keys.Down, 228f, -228f, 400f);
 | 
			
		||||
        rightPaddleBehaviour.Id = "rp";
 | 
			
		||||
        rightPaddle.BehaviourController.AddBehaviour(rightPaddleBehaviour);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user