chore: improved paddle synchronization
This commit is contained in:
parent
0f0180d435
commit
79922fadbe
@ -5,6 +5,7 @@ using Microsoft.Xna.Framework.Input;
|
|||||||
using Syntriax.Engine.Core;
|
using Syntriax.Engine.Core;
|
||||||
using Syntriax.Engine.Network;
|
using Syntriax.Engine.Network;
|
||||||
using Syntriax.Engine.Systems.Input;
|
using Syntriax.Engine.Systems.Input;
|
||||||
|
using Syntriax.Engine.Systems.Tween;
|
||||||
|
|
||||||
namespace Pong.Behaviours;
|
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 isUpPressed = false;
|
||||||
private bool isDownPressed = false;
|
private bool isDownPressed = false;
|
||||||
|
|
||||||
private bool isMovingUp = false;
|
|
||||||
private bool isMovingDown = false;
|
|
||||||
|
|
||||||
private IButtonInputs<Keys> inputs = null!;
|
private IButtonInputs<Keys> inputs = null!;
|
||||||
private INetworkCommunicatorClient networkClient = null!;
|
private INetworkCommunicatorClient networkClient = null!;
|
||||||
private INetworkCommunicatorServer? networkServer = null;
|
private INetworkCommunicatorServer? networkServer = null;
|
||||||
|
private TweenManager tweenManager = null!;
|
||||||
|
|
||||||
protected override void OnUpdate()
|
protected override void OnUpdate()
|
||||||
{
|
{
|
||||||
if (isMovingUp && isMovingDown)
|
if (isUpPressed && isDownPressed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (isMovingUp)
|
if (isUpPressed)
|
||||||
Transform.Position = Transform.Position + Vector2D.Up * Universe.Time.DeltaTime * Speed;
|
Transform.Position += Vector2D.Up * Universe.Time.DeltaTime * Speed;
|
||||||
else if (isMovingDown)
|
else if (isDownPressed)
|
||||||
Transform.Position = Transform.Position + -Vector2D.Up * Universe.Time.DeltaTime * Speed;
|
Transform.Position += -Vector2D.Up * Universe.Time.DeltaTime * Speed;
|
||||||
|
|
||||||
Transform.Position = new Vector2D(Transform.Position.X, MathF.Max(MathF.Min(Transform.Position.Y, High), Low));
|
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>>();
|
inputs = Universe.FindRequiredBehaviour<IButtonInputs<Keys>>();
|
||||||
networkClient = Universe.FindRequiredBehaviour<INetworkCommunicatorClient>();
|
networkClient = Universe.FindRequiredBehaviour<INetworkCommunicatorClient>();
|
||||||
networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>();
|
networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>();
|
||||||
|
tweenManager = Universe.GetRequiredUniverseObject<TweenManager>();
|
||||||
|
|
||||||
inputs.RegisterOnPress(Up, OnUpPressed);
|
inputs.RegisterOnPress(Up, OnUpPressed);
|
||||||
inputs.RegisterOnRelease(Up, OnUpReleased);
|
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)
|
if (packet.EntityId.CompareTo(Id) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
packet.Position = Transform.Position;
|
||||||
networkServer?.SendToClient("*", packet);
|
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)
|
if (packet.EntityId.CompareTo(Id) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
isMovingUp = packet.IsUpPressed;
|
isUpPressed = packet.IsUpPressed;
|
||||||
isMovingDown = packet.IsDownPressed;
|
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
|
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 string EntityId { get; set; } = default!;
|
||||||
public bool IsUpPressed { get; set; } = default!;
|
public bool IsUpPressed { get; set; } = default!;
|
||||||
public bool IsDownPressed { get; set; } = default!;
|
public bool IsDownPressed { get; set; } = default!;
|
||||||
|
public Vector2D Position { get; set; } = default!;
|
||||||
string IEntityNetworkPacket.EntityId => EntityId;
|
public long TimeTicker { get; set; } = default!;
|
||||||
|
|
||||||
public PaddleKeyStatePacket() { }
|
public PaddleKeyStatePacket() { }
|
||||||
public PaddleKeyStatePacket(PaddleBehaviour paddleBehaviour)
|
public PaddleKeyStatePacket(PaddleBehaviour paddleBehaviour)
|
||||||
@ -98,6 +103,8 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
|
|||||||
EntityId = paddleBehaviour.Id;
|
EntityId = paddleBehaviour.Id;
|
||||||
IsUpPressed = paddleBehaviour.isUpPressed;
|
IsUpPressed = paddleBehaviour.isUpPressed;
|
||||||
IsDownPressed = paddleBehaviour.isDownPressed;
|
IsDownPressed = paddleBehaviour.isDownPressed;
|
||||||
|
Position = paddleBehaviour.Transform.Position;
|
||||||
|
TimeTicker = DateTime.UtcNow.Ticks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
@ -13,6 +13,7 @@ using Syntriax.Engine.Core;
|
|||||||
using Syntriax.Engine.Core.Factory;
|
using Syntriax.Engine.Core.Factory;
|
||||||
using Syntriax.Engine.Network;
|
using Syntriax.Engine.Network;
|
||||||
using Syntriax.Engine.Physics2D;
|
using Syntriax.Engine.Physics2D;
|
||||||
|
using Syntriax.Engine.Systems.Tween;
|
||||||
|
|
||||||
namespace Pong;
|
namespace Pong;
|
||||||
|
|
||||||
@ -66,19 +67,10 @@ public class GamePong : Game
|
|||||||
|
|
||||||
universe.Register(platformSpecificUniverseObject);
|
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<UpdateManager>().SetUniverseObject("Update Manager");
|
||||||
universe.InstantiateUniverseObject<DrawManager>().SetUniverseObject("Draw 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");
|
universe.InstantiateUniverseObject<PhysicsEngine2D>().SetUniverseObject("Physics Engine 2D");
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -154,6 +146,17 @@ public class GamePong : Game
|
|||||||
rightText = universe.InstantiateUniverseObject().SetUniverseObject("Score Right")
|
rightText = universe.InstantiateUniverseObject().SetUniverseObject("Score Right")
|
||||||
.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(250f, 250f), scale: Vector2D.One * .25f)
|
.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(250f, 250f), scale: Vector2D.One * .25f)
|
||||||
.BehaviourController.AddBehaviour<TextScoreBehaviour>(false, spriteFont);
|
.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)
|
protected override void Update(GameTime gameTime)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user