feat: added pong score update packets

This commit is contained in:
Syntriax 2025-06-28 22:44:00 +03:00
parent 9c90a804c3
commit b238235c15
2 changed files with 40 additions and 10 deletions

View File

@ -3,23 +3,26 @@ using System;
using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Input;
using Syntriax.Engine.Core; using Syntriax.Engine.Core;
using Syntriax.Engine.Core.Debug;
using Syntriax.Engine.Network; using Syntriax.Engine.Network;
using Syntriax.Engine.Systems.Input; using Syntriax.Engine.Systems.Input;
namespace Pong.Behaviours; namespace Pong.Behaviours;
public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate, public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate,
IPacketListenerServer<PongManagerBehaviour.RequestStartPacket> IPacketListenerServer<PongManagerBehaviour.RequestStartPacket>,
IPacketListenerClient<PongManagerBehaviour.ScorePacket>
{ {
public Action<PongManagerBehaviour>? OnReset { get; set; } = null; public Action<PongManagerBehaviour>? OnReset { get; set; } = null;
public Action<PongManagerBehaviour>? OnFinished { get; set; } = null; public Action<PongManagerBehaviour>? OnFinished { get; set; } = null;
public Action<PongManagerBehaviour>? OnScored { get; set; } = null; public Action<PongManagerBehaviour>? OnScoreUpdated { get; set; } = null;
private Random random = new(); private Random random = new();
private BallBehaviour ball = null!; private BallBehaviour ball = null!;
private INetworkCommunicatorClient? networkClient = null!; private INetworkCommunicatorClient? networkClient = null!;
private INetworkCommunicatorServer? networkServer = null; private INetworkCommunicatorServer? networkServer = null;
private ILogger? logger = null;
public int ScoreLeft { get; private set; } = 0; public int ScoreLeft { get; private set; } = 0;
public int ScoreRight { get; private set; } = 0; public int ScoreRight { get; private set; } = 0;
@ -38,22 +41,23 @@ public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate
ball = Universe.FindRequiredBehaviour<BallBehaviour>(); ball = Universe.FindRequiredBehaviour<BallBehaviour>();
networkClient = Universe.FindBehaviour<INetworkCommunicatorClient>(); networkClient = Universe.FindBehaviour<INetworkCommunicatorClient>();
networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>(); networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>();
logger = Universe.FindBehaviour<ILogger>();
} }
public void ScoreToLeft() public void ScoreToLeft()
{ {
ScoreLeft++; ScoreLeft++;
OnScored?.Invoke(this); OnScoreUpdated?.Invoke(this);
CheckFinish(); PostScoreUpdate();
} }
public void ScoreToRight() public void ScoreToRight()
{ {
ScoreRight++; ScoreRight++;
OnScored?.Invoke(this); OnScoreUpdated?.Invoke(this);
CheckFinish(); PostScoreUpdate();
} }
public void Reset() public void Reset()
@ -66,18 +70,23 @@ public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate
OnReset?.Invoke(this); OnReset?.Invoke(this);
} }
private void CheckFinish() private void PostScoreUpdate()
{ {
int halfwayScore = (int)(WinScore * .5f);
ball.ResetBall(); ball.ResetBall();
if (networkServer is not null)
{
networkServer.SendToAll(new ScorePacket(this));
logger?.Log(this, $"Sending score update packet to all: {ScoreLeft} - {ScoreRight}");
}
int halfwayScore = (int)(WinScore * .5f);
if (ScoreLeft > halfwayScore || ScoreRight > halfwayScore) if (ScoreLeft > halfwayScore || ScoreRight > halfwayScore)
{ {
OnFinished?.Invoke(this); OnFinished?.Invoke(this);
return; return;
} }
ball.ResetBall();
ball.LaunchBall(GetBallLaunchDirection()); ball.LaunchBall(GetBallLaunchDirection());
} }
@ -89,6 +98,15 @@ public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate
return Vector2D.Right.Rotate(isBackwards ? rotation + Syntriax.Engine.Core.Math.Pi : rotation); return Vector2D.Right.Rotate(isBackwards ? rotation + Syntriax.Engine.Core.Math.Pi : rotation);
} }
void IPacketListenerClient<ScorePacket>.OnClientPacketArrived(IConnection sender, ScorePacket packet)
{
ScoreLeft = packet.Left;
ScoreRight = packet.Right;
OnScoreUpdated?.Invoke(this);
logger?.Log(this, $"Client score update packet arrived: {packet.Left} - {packet.Right}");
}
void IPacketListenerServer<RequestStartPacket>.OnServerPacketArrived(IConnection sender, RequestStartPacket packet) void IPacketListenerServer<RequestStartPacket>.OnServerPacketArrived(IConnection sender, RequestStartPacket packet)
{ {
if (ball.RigidBody.Velocity.MagnitudeSquared > 0.01f) if (ball.RigidBody.Velocity.MagnitudeSquared > 0.01f)
@ -98,4 +116,16 @@ public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate
} }
private class RequestStartPacket : INetworkPacket; private class RequestStartPacket : INetworkPacket;
private class ScorePacket : INetworkPacket
{
public int Left { get; set; }
public int Right { get; set; }
public ScorePacket() { }
public ScorePacket(PongManagerBehaviour pongManagerBehaviour)
{
Left = pongManagerBehaviour.ScoreLeft;
Right = pongManagerBehaviour.ScoreRight;
}
}
} }

View File

@ -18,7 +18,7 @@ public class TextScoreBehaviour(bool IsLeft) : TextBehaviour, IFirstFrameUpdate
pongManager = Universe.FindRequiredBehaviour<PongManagerBehaviour>(); pongManager = Universe.FindRequiredBehaviour<PongManagerBehaviour>();
pongManager.OnScored += UpdateScores; pongManager.OnScoreUpdated += UpdateScores;
pongManager.OnReset += UpdateScores; pongManager.OnReset += UpdateScores;
UpdateScores(pongManager); UpdateScores(pongManager);