diff --git a/.vscode/launch.json b/.vscode/launch.json index dbf514e..b15745c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -2,7 +2,18 @@ "version": "0.2.0", "configurations": [ { - "name": ".NET Launch (Client)", + "name": ".NET Launch (Client) 1", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + "program": "${workspaceFolder}/Platforms/Desktop/bin/Debug/net9.0/Desktop.exe", + "args": [], + "cwd": "${workspaceFolder}", + "stopAtEntry": false, + "console": "internalConsole" + }, + { + "name": ".NET Launch (Client) 2", "type": "coreclr", "request": "launch", "preLaunchTask": "build", @@ -26,8 +37,12 @@ ], "compounds": [ { - "name": ".NET Launch Both", - "configurations": [".NET Launch (Server)", ".NET Launch (Client)"] + "name": ".NET Launch 2 Client & 1 Server", + "configurations": [ + ".NET Launch (Server)", + ".NET Launch (Client) 1", + ".NET Launch (Client) 2" + ] } ] } diff --git a/Engine b/Engine index 6b9020b..2df41e1 160000 --- a/Engine +++ b/Engine @@ -1 +1 @@ -Subproject commit 6b9020bd2491d44163f019a79d16a2f3b8a78306 +Subproject commit 2df41e18818e314ebfa21e578500d5e3161cf850 diff --git a/Shared/Behaviours/PaddleBehaviour.cs b/Shared/Behaviours/PaddleBehaviour.cs index c930abd..d553ad1 100644 --- a/Shared/Behaviours/PaddleBehaviour.cs +++ b/Shared/Behaviours/PaddleBehaviour.cs @@ -22,7 +22,7 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp private bool isDownPressed = false; private IButtonInputs inputs = null!; - private INetworkCommunicatorClient networkClient = null!; + private INetworkCommunicatorClient? networkClient = null!; private INetworkCommunicatorServer? networkServer = null; private TweenManager tweenManager = null!; @@ -41,9 +41,9 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp protected override void OnFirstActiveFrame() { - inputs = Universe.FindRequiredBehaviour>(); - networkClient = Universe.FindRequiredBehaviour(); - networkServer = Universe.FindBehaviour(); + inputs = Universe.FindRequired>(); + networkClient = Universe.Find(); + networkServer = Universe.Find(); tweenManager = Universe.GetRequiredUniverseObject(); inputs.RegisterOnPress(Up, OnUpPressed); @@ -62,10 +62,10 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp inputs.UnregisterOnRelease(Down, OnDownReleased); } - private void OnUpPressed(IButtonInputs inputs, Keys keys) { isUpPressed = true; networkClient.SendToServer(new PaddleKeyStatePacket(this)); } - private void OnUpReleased(IButtonInputs inputs, Keys keys) { isUpPressed = false; networkClient.SendToServer(new PaddleKeyStatePacket(this)); } - private void OnDownPressed(IButtonInputs inputs, Keys keys) { isDownPressed = true; networkClient.SendToServer(new PaddleKeyStatePacket(this)); } - private void OnDownReleased(IButtonInputs inputs, Keys keys) { isDownPressed = false; networkClient.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnUpPressed(IButtonInputs inputs, Keys keys) { isUpPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnUpReleased(IButtonInputs inputs, Keys keys) { isUpPressed = false; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnDownPressed(IButtonInputs inputs, Keys keys) { isDownPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnDownReleased(IButtonInputs inputs, Keys keys) { isDownPressed = false; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } public void OnServerPacketArrived(PaddleKeyStatePacket packet, string from) { @@ -73,6 +73,8 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp return; packet.Position = Transform.Position; + isUpPressed = packet.IsUpPressed; + isDownPressed = packet.IsDownPressed; networkServer?.SendToClient("*", packet); } diff --git a/Shared/Behaviours/PongManagerBehaviour.cs b/Shared/Behaviours/PongManagerBehaviour.cs index c256b16..fc79366 100644 --- a/Shared/Behaviours/PongManagerBehaviour.cs +++ b/Shared/Behaviours/PongManagerBehaviour.cs @@ -22,7 +22,7 @@ public class PongManagerBehaviour : Behaviour, private readonly Random random = new(); private BallBehaviour ball = null!; - private INetworkCommunicatorClient networkClient = null!; + private INetworkCommunicatorClient? networkClient = null!; private INetworkCommunicatorServer? networkServer = null; public int ScoreLeft { get; private set; } = 0; @@ -36,12 +36,12 @@ public class PongManagerBehaviour : Behaviour, protected override void OnFirstActiveFrame() { - var buttonInputs = Universe.FindRequiredBehaviour>(); - buttonInputs.RegisterOnRelease(Keys.Space, (_, _1) => networkClient.SendToServer(new PongResetPacket())); + IButtonInputs buttonInputs = Universe.FindRequired>(); + buttonInputs.RegisterOnRelease(Keys.Space, (_, _1) => networkClient?.SendToServer(new PongResetPacket())); - networkClient = Universe.FindRequiredBehaviour(); ball = Universe.FindRequiredBehaviour(); - networkServer = Universe.FindBehaviour(); + networkClient = Universe.Find(); + networkServer = Universe.Find(); } public void ScoreToLeft() @@ -92,6 +92,7 @@ public class PongManagerBehaviour : Behaviour, 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) { @@ -103,19 +104,17 @@ public class PongManagerBehaviour : Behaviour, public void OnServerPacketArrived(PongResetPacket packet, string from) { Reset(); + Vector2D ballVelocity = GetBallLaunchDirection(); + ball.LaunchBall(ballVelocity); networkServer?.SendToClient("*", new PongResetPacket()); - networkServer?.SendToClient("*", new PongStartPacket() { BallVelocity = GetBallLaunchDirection() }); + networkServer?.SendToClient("*", new PongStartPacket() { BallVelocity = ballVelocity }); } public void OnServerPacketArrived(PongStartPacket packet, string from) { packet = new() { BallVelocity = GetBallLaunchDirection() }; - networkServer?.SendToClient("*", packet); - } - - public void OnClientPacketArrived(PongStartPacket packet) - { ball.LaunchBall(packet.BallVelocity); + networkServer?.SendToClient("*", packet); } public class PongStartPacket : INetworkPacket diff --git a/Shared/GamePong.cs b/Shared/GamePong.cs index a306793..9d8fab3 100644 --- a/Shared/GamePong.cs +++ b/Shared/GamePong.cs @@ -28,10 +28,7 @@ public class GamePong : Game private BehaviourCollector displayableCollector = null!; private BehaviourCollector displayableShapeCollector = null!; private MonoGameCamera2DBehaviour cameraBehaviour = null!; - private PongManagerBehaviour pongManager = null!; - private TextScoreBehaviour leftText; - private TextScoreBehaviour rightText; public GamePong(IUniverseObject platformSpecificUniverseObject) { @@ -67,8 +64,24 @@ public class GamePong : Game universe.Register(platformSpecificUniverseObject); + if (Environment.GetCommandLineArgs().FirstOrDefault(x => x.CompareTo("-server") == 0) is not null) + { + LiteNetLibServer server = universe.InstantiateUniverseObject().SetUniverseObject("Server"); + UniverseObjectFactory.Instantiate().SetUniverseObject("NetworkManager", server.BehaviourController.UniverseObject); + server.Start(8888, 2); + Window.Title = $"Server"; + } + else + { + LiteNetLibClient client = universe.InstantiateUniverseObject().SetUniverseObject("Client"); + UniverseObjectFactory.Instantiate().SetUniverseObject("NetworkManager", client.BehaviourController.UniverseObject); + client.Connect("localhost", 8888); + Window.Title = $"Client"; + + universe.InstantiateUniverseObject().SetUniverseObject("Draw Manager"); + } + universe.InstantiateUniverseObject().SetUniverseObject("Update Manager"); - universe.InstantiateUniverseObject().SetUniverseObject("Draw Manager"); universe.InstantiateUniverseObject().SetUniverseObject("Coroutine Manager"); universe.InstantiateUniverseObject().SetUniverseObject("Tween Manager"); universe.InstantiateUniverseObject().SetUniverseObject("Physics Engine 2D"); @@ -139,24 +152,13 @@ public class GamePong : Game //////////////////////////////////////////////////////////////////////////////////// - leftText = universe.InstantiateUniverseObject().SetUniverseObject("Score Left") + universe.InstantiateUniverseObject().SetUniverseObject("Score Left") .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-250f, 250f), scale: Vector2D.One * .25f) .BehaviourController.AddBehaviour(true, spriteFont); - rightText = universe.InstantiateUniverseObject().SetUniverseObject("Score Right") + universe.InstantiateUniverseObject().SetUniverseObject("Score Right") .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(250f, 250f), scale: Vector2D.One * .25f) .BehaviourController.AddBehaviour(false, spriteFont); - - if (Environment.GetCommandLineArgs().FirstOrDefault(x => x.CompareTo("-server") == 0) is not null) - { - LiteNetLibServer server = universe.InstantiateUniverseObject().SetUniverseObject("Server").BehaviourController.AddBehaviour(); - UniverseObjectFactory.Instantiate().SetUniverseObject("NetworkManager", server.BehaviourController.UniverseObject); - server.Start(8888, 2); - Window.Title = $"{Window.Title} - Server"; - } - LiteNetLibClient client = universe.InstantiateUniverseObject().SetUniverseObject("Client").BehaviourController.AddBehaviour(); - UniverseObjectFactory.Instantiate().SetUniverseObject("NetworkManager", client.BehaviourController.UniverseObject); - client.Connect("localhost", 8888); } protected override void Update(GameTime gameTime) diff --git a/Shared/Network/LiteNetLib/LiteNetLibClient.cs b/Shared/Network/LiteNetLib/LiteNetLibClient.cs index bbece75..db92078 100644 --- a/Shared/Network/LiteNetLib/LiteNetLibClient.cs +++ b/Shared/Network/LiteNetLib/LiteNetLibClient.cs @@ -15,7 +15,7 @@ public class LiteNetLibClient : LiteNetLibCommunicatorBase, INetworkCommunicator public INetworkCommunicatorClient Connect(string address, int port, string? password = null) { - if (!UniverseObject.IsInUniverse) + if (!IsInUniverse) throw new($"{nameof(LiteNetLibClient)} must be in an universe to connect"); Manager.Start(); @@ -33,14 +33,17 @@ public class LiteNetLibClient : LiteNetLibCommunicatorBase, INetworkCommunicator return this; } - protected override void OnEnteredUniverse(IUniverse universe) + protected override void OnEnteringUniverse(IUniverse universe) { + base.OnEnteringUniverse(universe); + cancellationTokenSource = new CancellationTokenSource(); PollEvents(cancellationTokenSource.Token); } - protected override void OnExitedUniverse(IUniverse universe) + protected override void OnExitingUniverse(IUniverse universe) { + base.OnExitingUniverse(universe); cancellationTokenSource?.Cancel(); } diff --git a/Shared/Network/LiteNetLib/LiteNetLibCommunicatorBase.cs b/Shared/Network/LiteNetLib/LiteNetLibCommunicatorBase.cs index b05e480..2a8a97a 100644 --- a/Shared/Network/LiteNetLib/LiteNetLibCommunicatorBase.cs +++ b/Shared/Network/LiteNetLib/LiteNetLibCommunicatorBase.cs @@ -10,7 +10,7 @@ using Syntriax.Engine.Core; namespace Syntriax.Engine.Network; -public abstract class LiteNetLibCommunicatorBase : Behaviour, INetworkCommunicator +public abstract class LiteNetLibCommunicatorBase : UniverseObject, INetworkCommunicator { protected readonly NetPacketProcessor netPacketProcessor = new(); @@ -25,8 +25,9 @@ public abstract class LiteNetLibCommunicatorBase : Behaviour, INetworkCommunicat return this; } - protected override void ExitedUniverse(IUniverseObject sender, IUniverse universe) + protected override void OnExitingUniverse(IUniverse universe) { + base.OnExitingUniverse(universe); Stop(); } diff --git a/Shared/Network/LiteNetLib/LiteNetLibServer.cs b/Shared/Network/LiteNetLib/LiteNetLibServer.cs index 6fd3ab0..5216c35 100644 --- a/Shared/Network/LiteNetLib/LiteNetLibServer.cs +++ b/Shared/Network/LiteNetLib/LiteNetLibServer.cs @@ -32,7 +32,7 @@ public class LiteNetLibServer : LiteNetLibCommunicatorBase, INetworkCommunicator public INetworkCommunicatorServer Start(int port, int maxConnectionCount, string? password = null) { - if (!UniverseObject.IsInUniverse) + if (!IsInUniverse) throw new($"{nameof(LiteNetLibServer)} must be in an universe to start"); Password = password ?? string.Empty; @@ -60,7 +60,17 @@ public class LiteNetLibServer : LiteNetLibCommunicatorBase, INetworkCommunicator return this; } - protected override void OnEnteredUniverse(IUniverse universe) => universe.OnPostUpdate += PollEvents; - protected override void OnExitedUniverse(IUniverse universe) => universe.OnPostUpdate -= PollEvents; private void PollEvents(IUniverse sender, UniverseTime engineTime) => Manager.PollEvents(); + + protected override void OnEnteringUniverse(IUniverse universe) + { + base.OnEnteringUniverse(universe); + universe.OnPostUpdate += PollEvents; + } + + protected override void OnExitingUniverse(IUniverse universe) + { + base.OnExitingUniverse(universe); + universe.OnPostUpdate -= PollEvents; + } } diff --git a/Shared/Network/NetworkManager.cs b/Shared/Network/NetworkManager.cs index 11d21df..32ef3e5 100644 --- a/Shared/Network/NetworkManager.cs +++ b/Shared/Network/NetworkManager.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; + using Syntriax.Engine.Core; namespace Syntriax.Engine.Network; @@ -151,6 +152,6 @@ public class NetworkManager : UniverseObject, INetworkManager protected override void OnEnteringUniverse(IUniverse universe) { _networkEntityCollector.Assign(universe); - NetworkCommunicator = BehaviourController.GetRequiredBehaviourInParent(); + NetworkCommunicator = this.GetRequiredUniverseObjectInParent(); } }