chore: de-networked pong manager

This commit is contained in:
Syntriax 2025-05-26 23:07:28 +03:00
parent bddf00ce7a
commit d0ef2ef224

View File

@ -8,18 +8,13 @@ using Syntriax.Engine.Systems.Input;
namespace Pong.Behaviours;
public class PongManagerBehaviour : Behaviour,
IPacketListenerServer<PongManagerBehaviour.PongStartPacket>,
IPacketListenerServer<PongManagerBehaviour.PongResetPacket>,
IPacketListenerClient<PongManagerBehaviour.PongStartPacket>,
IPacketListenerClient<PongManagerBehaviour.PongResetPacket>,
IPacketListenerClient<PongManagerBehaviour.PongScoreUpdatePacket>
public class PongManagerBehaviour : Behaviour
{
public Action<PongManagerBehaviour>? OnReset { get; set; } = null;
public Action<PongManagerBehaviour>? OnFinished { get; set; } = null;
public Action<PongManagerBehaviour>? OnScored { get; set; } = null;
private readonly Random random = new();
private Random random = new();
private BallBehaviour ball = null!;
private INetworkCommunicatorClient? networkClient = null!;
@ -37,7 +32,7 @@ public class PongManagerBehaviour : Behaviour,
protected override void OnFirstActiveFrame()
{
IButtonInputs<Keys> buttonInputs = Universe.FindRequired<IButtonInputs<Keys>>();
buttonInputs.RegisterOnRelease(Keys.Space, (_, _1) => networkClient?.SendToServer(new PongResetPacket()));
buttonInputs.RegisterOnRelease(Keys.Space, (_, _1) => Reset());
ball = Universe.FindRequiredBehaviour<BallBehaviour>();
networkClient = Universe.Find<INetworkCommunicatorClient>();
@ -46,22 +41,16 @@ public class PongManagerBehaviour : Behaviour,
public void ScoreToLeft()
{
if (networkServer is not null)
{
ScoreLeft++;
OnScored?.InvokeSafe(this);
}
ScoreLeft++;
OnScored?.InvokeSafe(this);
CheckFinish();
}
public void ScoreToRight()
{
if (networkServer is not null)
{
ScoreRight++;
OnScored?.InvokeSafe(this);
}
ScoreRight++;
OnScored?.InvokeSafe(this);
CheckFinish();
}
@ -69,6 +58,10 @@ public class PongManagerBehaviour : Behaviour,
public void Reset()
{
ScoreLeft = ScoreRight = 0;
ball.ResetBall();
ball.LaunchBall(GetBallLaunchDirection());
OnReset?.InvokeSafe(this);
}
@ -77,11 +70,14 @@ public class PongManagerBehaviour : Behaviour,
int halfwayScore = (int)(WinScore * .5f);
ball.ResetBall();
networkServer?.SendToClient("*", new PongScoreUpdatePacket(this));
if (ScoreLeft > halfwayScore || ScoreRight > halfwayScore)
{
OnFinished?.InvokeSafe(this);
else
networkServer?.SendToClient("*", new PongStartPacket() { BallVelocity = GetBallLaunchDirection() });
return;
}
ball.ResetBall();
ball.LaunchBall(GetBallLaunchDirection());
}
private Vector2D GetBallLaunchDirection()
@ -91,49 +87,4 @@ public class PongManagerBehaviour : Behaviour,
bool isBackwards = (random.Next() % 2) == 1;
return Vector2D.Right.Rotate(isBackwards ? rotation + Syntriax.Engine.Core.Math.PI : rotation);
}
public void OnClientPacketArrived(PongStartPacket packet) => ball.LaunchBall(packet.BallVelocity);
public void OnClientPacketArrived(PongResetPacket packet) => Reset();
public void OnClientPacketArrived(PongScoreUpdatePacket packet)
{
ScoreLeft = packet.Left;
ScoreRight = packet.Right;
OnScored?.InvokeSafe(this);
}
public void OnServerPacketArrived(PongResetPacket packet, string from)
{
Reset();
Vector2D ballVelocity = GetBallLaunchDirection();
ball.LaunchBall(ballVelocity);
networkServer?.SendToClient("*", new PongResetPacket());
networkServer?.SendToClient("*", new PongStartPacket() { BallVelocity = ballVelocity });
}
public void OnServerPacketArrived(PongStartPacket packet, string from)
{
packet = new() { BallVelocity = GetBallLaunchDirection() };
ball.LaunchBall(packet.BallVelocity);
networkServer?.SendToClient("*", packet);
}
public class PongStartPacket : INetworkPacket
{
public Vector2D BallVelocity { get; set; } = Vector2D.Zero;
}
public class PongResetPacket : INetworkPacket;
public class PongScoreUpdatePacket : INetworkPacket
{
public int Left { get; set; } = 0;
public int Right { get; set; } = 0;
public PongScoreUpdatePacket() { }
public PongScoreUpdatePacket(PongManagerBehaviour pongManagerBehaviour)
{
Left = pongManagerBehaviour.ScoreLeft;
Right = pongManagerBehaviour.ScoreRight;
}
}
}