chore: improved paddle synchronization
This commit is contained in:
		@@ -5,6 +5,7 @@ using Microsoft.Xna.Framework.Input;
 | 
			
		||||
using Syntriax.Engine.Core;
 | 
			
		||||
using Syntriax.Engine.Network;
 | 
			
		||||
using Syntriax.Engine.Systems.Input;
 | 
			
		||||
using Syntriax.Engine.Systems.Tween;
 | 
			
		||||
 | 
			
		||||
namespace Pong.Behaviours;
 | 
			
		||||
 | 
			
		||||
@@ -20,22 +21,20 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
    private bool isUpPressed = false;
 | 
			
		||||
    private bool isDownPressed = false;
 | 
			
		||||
 | 
			
		||||
    private bool isMovingUp = false;
 | 
			
		||||
    private bool isMovingDown = false;
 | 
			
		||||
 | 
			
		||||
    private IButtonInputs<Keys> inputs = null!;
 | 
			
		||||
    private INetworkCommunicatorClient networkClient = null!;
 | 
			
		||||
    private INetworkCommunicatorServer? networkServer = null;
 | 
			
		||||
    private TweenManager tweenManager = null!;
 | 
			
		||||
 | 
			
		||||
    protected override void OnUpdate()
 | 
			
		||||
    {
 | 
			
		||||
        if (isMovingUp && isMovingDown)
 | 
			
		||||
        if (isUpPressed && isDownPressed)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (isMovingUp)
 | 
			
		||||
            Transform.Position = Transform.Position + Vector2D.Up * Universe.Time.DeltaTime * Speed;
 | 
			
		||||
        else if (isMovingDown)
 | 
			
		||||
            Transform.Position = Transform.Position + -Vector2D.Up * Universe.Time.DeltaTime * Speed;
 | 
			
		||||
        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));
 | 
			
		||||
    }
 | 
			
		||||
@@ -45,6 +44,7 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
        inputs = Universe.FindRequiredBehaviour<IButtonInputs<Keys>>();
 | 
			
		||||
        networkClient = Universe.FindRequiredBehaviour<INetworkCommunicatorClient>();
 | 
			
		||||
        networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>();
 | 
			
		||||
        tweenManager = Universe.GetRequiredUniverseObject<TweenManager>();
 | 
			
		||||
 | 
			
		||||
        inputs.RegisterOnPress(Up, OnUpPressed);
 | 
			
		||||
        inputs.RegisterOnRelease(Up, OnUpReleased);
 | 
			
		||||
@@ -72,6 +72,7 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
        if (packet.EntityId.CompareTo(Id) != 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        packet.Position = Transform.Position;
 | 
			
		||||
        networkServer?.SendToClient("*", packet);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -80,8 +81,12 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
        if (packet.EntityId.CompareTo(Id) != 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        isMovingUp = packet.IsUpPressed;
 | 
			
		||||
        isMovingDown = packet.IsDownPressed;
 | 
			
		||||
        isUpPressed = packet.IsUpPressed;
 | 
			
		||||
        isDownPressed = packet.IsDownPressed;
 | 
			
		||||
        if (!isUpPressed && !isDownPressed)
 | 
			
		||||
            Transform.Position.TweenVector2D(tweenManager, .05f, packet.Position, x => Transform.Position = x);
 | 
			
		||||
        else
 | 
			
		||||
            Transform.Position = packet.Position;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class PaddleKeyStatePacket : IEntityNetworkPacket
 | 
			
		||||
@@ -89,8 +94,8 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
        public string EntityId { get; set; } = default!;
 | 
			
		||||
        public bool IsUpPressed { get; set; } = default!;
 | 
			
		||||
        public bool IsDownPressed { get; set; } = default!;
 | 
			
		||||
 | 
			
		||||
        string IEntityNetworkPacket.EntityId => EntityId;
 | 
			
		||||
        public Vector2D Position { get; set; } = default!;
 | 
			
		||||
        public long TimeTicker { get; set; } = default!;
 | 
			
		||||
 | 
			
		||||
        public PaddleKeyStatePacket() { }
 | 
			
		||||
        public PaddleKeyStatePacket(PaddleBehaviour paddleBehaviour)
 | 
			
		||||
@@ -98,6 +103,8 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
            EntityId = paddleBehaviour.Id;
 | 
			
		||||
            IsUpPressed = paddleBehaviour.isUpPressed;
 | 
			
		||||
            IsDownPressed = paddleBehaviour.isDownPressed;
 | 
			
		||||
            Position = paddleBehaviour.Transform.Position;
 | 
			
		||||
            TimeTicker = DateTime.UtcNow.Ticks;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
 | 
			
		||||
using Microsoft.Xna.Framework;
 | 
			
		||||
@@ -13,6 +13,7 @@ using Syntriax.Engine.Core;
 | 
			
		||||
using Syntriax.Engine.Core.Factory;
 | 
			
		||||
using Syntriax.Engine.Network;
 | 
			
		||||
using Syntriax.Engine.Physics2D;
 | 
			
		||||
using Syntriax.Engine.Systems.Tween;
 | 
			
		||||
 | 
			
		||||
namespace Pong;
 | 
			
		||||
 | 
			
		||||
@@ -66,19 +67,10 @@ public class GamePong : Game
 | 
			
		||||
 | 
			
		||||
        universe.Register(platformSpecificUniverseObject);
 | 
			
		||||
 | 
			
		||||
        if (Environment.GetCommandLineArgs().FirstOrDefault(x => x.CompareTo("-server") == 0) is not null)
 | 
			
		||||
        {
 | 
			
		||||
            LiteNetLibServer server = universe.InstantiateUniverseObject().SetUniverseObject("Server").BehaviourController.AddBehaviour<LiteNetLibServer>();
 | 
			
		||||
            UniverseObjectFactory.Instantiate<NetworkManager>().SetUniverseObject("NetworkManager", server.BehaviourController.UniverseObject);
 | 
			
		||||
            server.Start(8888, 2);
 | 
			
		||||
            Window.Title = $"{Window.Title} - Server";
 | 
			
		||||
        }
 | 
			
		||||
        LiteNetLibClient client = universe.InstantiateUniverseObject().SetUniverseObject("Client").BehaviourController.AddBehaviour<LiteNetLibClient>();
 | 
			
		||||
        UniverseObjectFactory.Instantiate<NetworkManager>().SetUniverseObject("NetworkManager", client.BehaviourController.UniverseObject);
 | 
			
		||||
        client.Connect("localhost", 8888);
 | 
			
		||||
 | 
			
		||||
        universe.InstantiateUniverseObject<UpdateManager>().SetUniverseObject("Update Manager");
 | 
			
		||||
        universe.InstantiateUniverseObject<DrawManager>().SetUniverseObject("Draw Manager");
 | 
			
		||||
        universe.InstantiateUniverseObject<CoroutineManager>().SetUniverseObject("Coroutine Manager");
 | 
			
		||||
        universe.InstantiateUniverseObject<TweenManager>().SetUniverseObject("Tween Manager");
 | 
			
		||||
        universe.InstantiateUniverseObject<PhysicsEngine2D>().SetUniverseObject("Physics Engine 2D");
 | 
			
		||||
 | 
			
		||||
        ////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -154,6 +146,17 @@ public class GamePong : Game
 | 
			
		||||
        rightText = universe.InstantiateUniverseObject().SetUniverseObject("Score Right")
 | 
			
		||||
            .BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(250f, 250f), scale: Vector2D.One * .25f)
 | 
			
		||||
            .BehaviourController.AddBehaviour<TextScoreBehaviour>(false, spriteFont);
 | 
			
		||||
 | 
			
		||||
        if (Environment.GetCommandLineArgs().FirstOrDefault(x => x.CompareTo("-server") == 0) is not null)
 | 
			
		||||
        {
 | 
			
		||||
            LiteNetLibServer server = universe.InstantiateUniverseObject().SetUniverseObject("Server").BehaviourController.AddBehaviour<LiteNetLibServer>();
 | 
			
		||||
            UniverseObjectFactory.Instantiate<NetworkManager>().SetUniverseObject("NetworkManager", server.BehaviourController.UniverseObject);
 | 
			
		||||
            server.Start(8888, 2);
 | 
			
		||||
            Window.Title = $"{Window.Title} - Server";
 | 
			
		||||
        }
 | 
			
		||||
        LiteNetLibClient client = universe.InstantiateUniverseObject().SetUniverseObject("Client").BehaviourController.AddBehaviour<LiteNetLibClient>();
 | 
			
		||||
        UniverseObjectFactory.Instantiate<NetworkManager>().SetUniverseObject("NetworkManager", client.BehaviourController.UniverseObject);
 | 
			
		||||
        client.Connect("localhost", 8888);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected override void Update(GameTime gameTime)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user