From a781d929968f5efa2789a16ee4cc7c5888f54c7e Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sun, 27 Jul 2025 18:55:32 +0300 Subject: [PATCH] feat: game start countdown added --- Shared/Behaviours/Ball.cs | 16 ++++- Shared/Behaviours/PongGameStarter.cs | 96 ++++++++++++++++++++++++++++ Shared/Behaviours/PongManager.cs | 50 +++++++-------- Shared/PongUniverse.cs | 5 ++ 4 files changed, 140 insertions(+), 27 deletions(-) create mode 100644 Shared/Behaviours/PongGameStarter.cs diff --git a/Shared/Behaviours/Ball.cs b/Shared/Behaviours/Ball.cs index 82b53bd..a329ae3 100644 --- a/Shared/Behaviours/Ball.cs +++ b/Shared/Behaviours/Ball.cs @@ -1,11 +1,15 @@ +using Microsoft.Xna.Framework.Audio; +using Microsoft.Xna.Framework.Content; + using Syntriax.Engine.Core; +using Syntriax.Engine.Integration.MonoGame; using Syntriax.Engine.Network; using Syntriax.Engine.Physics2D; using Syntriax.Engine.Systems.Tween; namespace Pong.Behaviours; -public class Ball : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INetworkEntity, +public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate, INetworkEntity, IPacketListenerClient, IPacketListenerClient { @@ -19,6 +23,8 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INetworkEnti private INetworkCommunicatorServer? networkServer = null; private ITween? networkTween = null; + private SoundEffect? bounceSoundEffect = null; + public void FirstActiveFrame() { BehaviourController.GetRequiredBehaviour().OnCollisionDetected.AddListener(OnCollisionDetected); @@ -28,6 +34,11 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INetworkEnti networkServer = Universe.FindBehaviour(); } + public void LoadContent(ContentManager content) + { + bounceSoundEffect = content.Load("Audio/Bounce"); + } + public void LaunchBall(Vector2D launchDirection) { ResetBall(); @@ -74,6 +85,9 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INetworkEnti else Transform.Position = packet.Position; + if (RigidBody.Velocity.MagnitudeSquared >= .01f) + bounceSoundEffect?.Play(); + RigidBody.Velocity = packet.Velocity; physicsEngine2D.StepIndividual(RigidBody, sender.Ping); } diff --git a/Shared/Behaviours/PongGameStarter.cs b/Shared/Behaviours/PongGameStarter.cs new file mode 100644 index 0000000..d3b2114 --- /dev/null +++ b/Shared/Behaviours/PongGameStarter.cs @@ -0,0 +1,96 @@ +using Microsoft.Xna.Framework.Audio; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Input; + +using Syntriax.Engine.Core; +using Syntriax.Engine.Core.Debug; +using Syntriax.Engine.Core.Exceptions; +using Syntriax.Engine.Integration.MonoGame; +using Syntriax.Engine.Network; +using Syntriax.Engine.Systems.Input; +using Syntriax.Engine.Systems.Time; +using Syntriax.Engine.Systems.Tween; + +namespace Pong.Behaviours; + +public class PongGameStarter : Behaviour, INetworkEntity, IFirstFrameUpdate, + IPacketListenerServer, + IPacketListenerClient +{ + private const float START_COUNTDOWN = 3f; + + private INetworkCommunicatorServer? networkServer = null; + private INetworkCommunicatorClient? networkClient = null; + private ITweenManager? tweenManager = null; + private PongManager pongManager = null!; + + private ILogger? logger = null; + + private Label? label = null; + private TickerTimer timer = null!; + + public void FirstActiveFrame() + { + IButtonInputs? buttonInputs = Universe.FindBehaviour>(); + buttonInputs?.RegisterOnRelease(Keys.Space, (_, _1) => networkClient?.SendToServer(new RequestStartPacket())); + + networkClient = Universe.FindBehaviour(); + networkServer = Universe.FindBehaviour(); + tweenManager = Universe.FindBehaviour(); + pongManager = BehaviourController.GetRequiredBehaviourInParent(); + label = BehaviourController.GetRequiredBehaviour