feat: paddle networking
This commit is contained in:
parent
cbda44c2d5
commit
59059fa09d
@ -4,12 +4,13 @@ using Microsoft.Xna.Framework.Input;
|
|||||||
|
|
||||||
using Syntriax.Engine.Core;
|
using Syntriax.Engine.Core;
|
||||||
using Syntriax.Engine.Network;
|
using Syntriax.Engine.Network;
|
||||||
|
using Syntriax.Engine.Physics2D;
|
||||||
using Syntriax.Engine.Systems.Input;
|
using Syntriax.Engine.Systems.Input;
|
||||||
using Syntriax.Engine.Systems.Tween;
|
using Syntriax.Engine.Systems.Tween;
|
||||||
|
|
||||||
namespace Pong.Behaviours;
|
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>
|
IPacketListenerServer<PaddleBehaviour.PaddleKeyStatePacket>, IPacketListenerClient<PaddleBehaviour.PaddleKeyStatePacket>
|
||||||
{
|
{
|
||||||
private Keys Up { get; } = Up;
|
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 IButtonInputs<Keys> inputs = null!;
|
||||||
private INetworkCommunicatorClient? networkClient = null!;
|
private INetworkCommunicatorClient? networkClient = null!;
|
||||||
private INetworkCommunicatorServer? networkServer = 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));
|
Transform.Position = new Vector2D(Transform.Position.X, MathF.Max(MathF.Min(Transform.Position.Y, High), Low));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnFirstActiveFrame()
|
protected override void OnFirstActiveFrame()
|
||||||
{
|
{
|
||||||
|
physicsEngine2D = Universe.GetRequiredUniverseObject<IPhysicsEngine2D>();
|
||||||
inputs = Universe.FindRequired<IButtonInputs<Keys>>();
|
inputs = Universe.FindRequired<IButtonInputs<Keys>>();
|
||||||
networkClient = Universe.Find<INetworkCommunicatorClient>();
|
networkClient = Universe.Find<INetworkCommunicatorClient>();
|
||||||
networkServer = Universe.Find<INetworkCommunicatorServer>();
|
networkServer = Universe.Find<INetworkCommunicatorServer>();
|
||||||
tweenManager = Universe.GetRequiredUniverseObject<TweenManager>();
|
rigidBody = BehaviourController.GetRequiredBehaviour<IRigidBody2D>();
|
||||||
|
|
||||||
inputs.RegisterOnPress(Up, OnUpPressed);
|
inputs.RegisterOnPress(Up, OnUpPressed);
|
||||||
inputs.RegisterOnRelease(Up, OnUpReleased);
|
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);
|
inputs.UnregisterOnRelease(Down, OnDownReleased);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnUpPressed(IButtonInputs<Keys> inputs, Keys keys) { isUpPressed = true; 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; 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; 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; 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)
|
public void OnServerPacketArrived(PaddleKeyStatePacket packet, string from)
|
||||||
{
|
{
|
||||||
if (packet.EntityId.CompareTo(Id) != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
packet.Position = Transform.Position;
|
|
||||||
isUpPressed = packet.IsUpPressed;
|
isUpPressed = packet.IsUpPressed;
|
||||||
isDownPressed = packet.IsDownPressed;
|
isDownPressed = packet.IsDownPressed;
|
||||||
networkServer?.SendToClient("*", packet);
|
UpdateVelocity();
|
||||||
|
|
||||||
|
networkServer?.SendToClient("*", new PaddleKeyStatePacket(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnClientPacketArrived(PaddleKeyStatePacket packet)
|
public void OnClientPacketArrived(PaddleKeyStatePacket packet)
|
||||||
{
|
{
|
||||||
isUpPressed = packet.IsUpPressed;
|
isUpPressed = packet.IsUpPressed;
|
||||||
isDownPressed = packet.IsDownPressed;
|
isDownPressed = packet.IsDownPressed;
|
||||||
|
|
||||||
if (!isUpPressed && !isDownPressed)
|
|
||||||
Transform.Position.TweenVector2D(tweenManager, .05f, packet.Position, x => Transform.Position = x);
|
|
||||||
else
|
|
||||||
Transform.Position = packet.Position;
|
Transform.Position = packet.Position;
|
||||||
|
|
||||||
|
UpdateVelocity();
|
||||||
|
|
||||||
|
physicsEngine2D.StepIndividual(rigidBody, new DateTime(DateTime.UtcNow.Ticks - packet.Timestamp).Second);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class PaddleKeyStatePacket : IEntityNetworkPacket
|
public class PaddleKeyStatePacket : IEntityNetworkPacket
|
||||||
{
|
{
|
||||||
public string EntityId { get; set; } = default!;
|
public string EntityId { get; set; } = default!;
|
||||||
|
public Vector2D Position { 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!;
|
public long Timestamp { get; set; } = 0;
|
||||||
public long TimeTicker { get; set; } = default!;
|
|
||||||
|
|
||||||
public PaddleKeyStatePacket() { }
|
public PaddleKeyStatePacket() { }
|
||||||
public PaddleKeyStatePacket(PaddleBehaviour paddleBehaviour)
|
public PaddleKeyStatePacket(PaddleBehaviour paddleBehaviour)
|
||||||
{
|
{
|
||||||
EntityId = paddleBehaviour.Id;
|
EntityId = paddleBehaviour.Id;
|
||||||
|
Position = paddleBehaviour.Transform.Position;
|
||||||
IsUpPressed = paddleBehaviour.isUpPressed;
|
IsUpPressed = paddleBehaviour.isUpPressed;
|
||||||
IsDownPressed = paddleBehaviour.isDownPressed;
|
IsDownPressed = paddleBehaviour.isDownPressed;
|
||||||
Position = paddleBehaviour.Transform.Position;
|
Timestamp = DateTime.UtcNow.Ticks;
|
||||||
TimeTicker = DateTime.UtcNow.Ticks;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ public class GamePong : Game
|
|||||||
IUniverseObject leftPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Left Paddle");
|
IUniverseObject leftPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Left Paddle");
|
||||||
leftPaddle.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(-468f, 0f), scale: new Vector2D(15f, 60f))
|
leftPaddle.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(-468f, 0f), scale: new Vector2D(15f, 60f))
|
||||||
.BehaviourController.AddBehaviour<ShapeBehaviour>(Shape2D.Square)
|
.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);
|
PaddleBehaviour leftPaddleBehaviour = BehaviourFactory.Instantiate<PaddleBehaviour>(Keys.W, Keys.S, 228f, -228f, 400f);
|
||||||
leftPaddleBehaviour.Id = "lp";
|
leftPaddleBehaviour.Id = "lp";
|
||||||
leftPaddle.BehaviourController.AddBehaviour(leftPaddleBehaviour);
|
leftPaddle.BehaviourController.AddBehaviour(leftPaddleBehaviour);
|
||||||
@ -120,7 +120,7 @@ public class GamePong : Game
|
|||||||
IUniverseObject rightPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Right Paddle");
|
IUniverseObject rightPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Right Paddle");
|
||||||
rightPaddle.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(468f, 0f), scale: new Vector2D(15f, 60f))
|
rightPaddle.BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(468f, 0f), scale: new Vector2D(15f, 60f))
|
||||||
.BehaviourController.AddBehaviour<ShapeBehaviour>(Shape2D.Square)
|
.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);
|
PaddleBehaviour rightPaddleBehaviour = BehaviourFactory.Instantiate<PaddleBehaviour>(Keys.Up, Keys.Down, 228f, -228f, 400f);
|
||||||
rightPaddleBehaviour.Id = "rp";
|
rightPaddleBehaviour.Id = "rp";
|
||||||
rightPaddle.BehaviourController.AddBehaviour(rightPaddleBehaviour);
|
rightPaddle.BehaviourController.AddBehaviour(rightPaddleBehaviour);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user