feat: game start countdown added

This commit is contained in:
2025-07-27 18:55:32 +03:00
parent 863c3a8d7a
commit a781d92996
4 changed files with 140 additions and 27 deletions

View File

@@ -1,16 +1,12 @@
using System;
using Microsoft.Xna.Framework.Input;
using Syntriax.Engine.Core;
using Syntriax.Engine.Core.Debug;
using Syntriax.Engine.Network;
using Syntriax.Engine.Systems.Input;
namespace Pong.Behaviours;
public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate,
IPacketListenerServer<PongManager.RequestStartPacket>,
IPacketListenerClient<PongManager.ScorePacket>
{
public Action<PongManager>? OnReset { get; set; } = null;
@@ -18,9 +14,7 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate,
public Action<PongManager>? OnScoreUpdated { get; set; } = null;
private Random random = new();
private Ball ball = null!;
private INetworkCommunicatorClient? networkClient = null!;
private INetworkCommunicatorServer? networkServer = null;
private ILogger? logger = null;
@@ -29,17 +23,16 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate,
public int ScoreSum => ScoreLeft + ScoreRight;
public int WinScore { get; } = 5;
public Ball Ball { get; private set; } = null!;
public bool IsGameInProgress { get; private set; } = false;
public PongManager() => WinScore = 5;
public PongManager(int winScore) => WinScore = winScore;
public void FirstActiveFrame()
{
IButtonInputs<Keys>? buttonInputs = Universe.FindBehaviour<IButtonInputs<Keys>>();
buttonInputs?.RegisterOnRelease(Keys.Space, (_, _1) => networkClient?.SendToServer(new RequestStartPacket()));
ball = Universe.FindRequiredBehaviour<Ball>();
networkClient = Universe.FindBehaviour<INetworkCommunicatorClient>();
Ball = Universe.FindRequiredBehaviour<Ball>();
networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>();
logger = Universe.FindBehaviour<ILogger>();
}
@@ -60,18 +53,34 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate,
PostScoreUpdate();
}
public bool Start()
{
if (networkServer is null)
return false;
if (Ball.RigidBody.Velocity.MagnitudeSquared > 0.01f)
return false;
Reset();
IsGameInProgress = true;
PostScoreUpdate();
logger?.Log(this, $"Game started");
return true;
}
public void Reset()
{
ScoreLeft = ScoreRight = 0;
IsGameInProgress = false;
PostScoreUpdate();
Ball.ResetBall();
OnReset?.Invoke(this);
}
private void PostScoreUpdate()
{
ball.ResetBall();
Ball.ResetBall();
if (networkServer is not null)
{
@@ -82,12 +91,13 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate,
int halfwayScore = (int)(WinScore * .5f);
if (ScoreLeft > halfwayScore || ScoreRight > halfwayScore)
{
IsGameInProgress = false;
OnFinished?.Invoke(this);
logger?.Log(this, $"Game finished");
return;
}
ball.LaunchBall(GetBallLaunchDirection());
Ball.LaunchBall(GetBallLaunchDirection());
}
private Vector2D GetBallLaunchDirection()
@@ -107,18 +117,6 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate,
logger?.Log(this, $"Client score update packet arrived: {packet.Left} - {packet.Right}");
}
void IPacketListenerServer<RequestStartPacket>.OnServerPacketArrived(IConnection sender, RequestStartPacket packet)
{
logger?.Log(this, $"{sender} requested start");
if (ball.RigidBody.Velocity.MagnitudeSquared > 0.01f)
return;
Reset();
ball.LaunchBall(GetBallLaunchDirection());
logger?.Log(this, $"Game started");
}
private class RequestStartPacket : INetworkPacket;
private class ScorePacket : INetworkPacket
{
public int Left { get; set; }