From 2294c06bf977108369ec4a3cad5796f2635a0284 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Fri, 6 Jun 2025 23:54:03 +0300 Subject: [PATCH] refactor: added server project --- .vscode/launch.json | 17 ++++- Engine | 2 +- Platforms/Desktop/Program.cs | 22 +++--- Platforms/Server/Program.cs | 22 ++++++ Platforms/Server/Server.csproj | 20 ++++++ Pong.sln | 15 ++++ Shared/Behaviours/PaddleBehaviour.cs | 20 +++--- Shared/Behaviours/PongManagerBehaviour.cs | 4 +- Shared/{GamePong.cs => PongUniverse.cs} | 86 ++++++++++++----------- 9 files changed, 142 insertions(+), 66 deletions(-) create mode 100644 Platforms/Server/Program.cs create mode 100644 Platforms/Server/Server.csproj rename Shared/{GamePong.cs => PongUniverse.cs} (64%) diff --git a/.vscode/launch.json b/.vscode/launch.json index e6e3f92..13fa499 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -28,8 +28,19 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "build", + "program": "${workspaceFolder}/Platforms/Server/bin/Debug/net9.0/Server.exe", + "args": [], + "cwd": "${workspaceFolder}", + "stopAtEntry": false, + "console": "internalConsole" + }, + { + "name": ".NET Launch (Host)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", "program": "${workspaceFolder}/Platforms/Desktop/bin/Debug/net9.0/Desktop.exe", - "args": ["-server"], + "args": ["--server"], "cwd": "${workspaceFolder}", "stopAtEntry": false, "console": "internalConsole" @@ -37,8 +48,8 @@ ], "compounds": [ { - "name": ".NET Launch 1 Client & 1 Server", - "configurations": [".NET Launch (Server)", ".NET Launch (Client) 1"] + "name": ".NET Launch Client & Host", + "configurations": [".NET Launch (Host)", ".NET Launch (Client) 1"] }, { "name": ".NET Launch 2 Client & 1 Server", diff --git a/Engine b/Engine index fbdea47..45524e4 160000 --- a/Engine +++ b/Engine @@ -1 +1 @@ -Subproject commit fbdea47dc7768aea65fe6826020cc6dd79a0b711 +Subproject commit 45524e474e1f795012d5e04f0b7f709eff2026b5 diff --git a/Platforms/Desktop/Program.cs b/Platforms/Desktop/Program.cs index 9f550d8..d2fd4fe 100644 --- a/Platforms/Desktop/Program.cs +++ b/Platforms/Desktop/Program.cs @@ -1,16 +1,22 @@ -using Microsoft.Xna.Framework.Graphics; +using System; +using System.Linq; + +using Microsoft.Xna.Framework.Graphics; using Syntriax.Engine.Core; using Syntriax.Engine.Integration.MonoGame; -using var game = new Pong.GamePong(); +bool isServerEnabled = Environment.GetCommandLineArgs().FirstOrDefault(x => x.CompareTo("--server") == 0) is not null; -game.Universe - .InstantiateUniverseObject().SetUniverseObject("Desktop HO") +IUniverse universe = Pong.PongUniverse.GetPongUniverse(isServerEnabled, isClientEnabled: true); + +universe.InstantiateUniverseObject().SetUniverseObject("Desktop HO") .BehaviourController.AddBehaviour(); -game.Graphics.PreferredBackBufferWidth = 1024; -game.Graphics.PreferredBackBufferHeight = 576; -game.Graphics.GraphicsProfile = GraphicsProfile.HiDef; +using MonoGameWindow monoGameWindow = new(universe); -game.Run(); +monoGameWindow.Graphics.PreferredBackBufferWidth = 1024; +monoGameWindow.Graphics.PreferredBackBufferHeight = 576; +monoGameWindow.Graphics.GraphicsProfile = GraphicsProfile.HiDef; + +monoGameWindow.Run(); diff --git a/Platforms/Server/Program.cs b/Platforms/Server/Program.cs new file mode 100644 index 0000000..d406b51 --- /dev/null +++ b/Platforms/Server/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Threading; +using Syntriax.Engine.Core; + +IUniverse universe = Pong.PongUniverse.GetPongUniverse(isServerEnabled: true, isClientEnabled: false); + +DateTime lastRun = DateTime.UtcNow; +TimeSpan interval = new(0, 0, 0, 0, 16); +TimeSpan timeSinceStart = new(0); + +universe.Initialize(); + +while (true) +{ + if (lastRun + interval <= DateTime.UtcNow) + { + lastRun += interval; + timeSinceStart += interval; + universe.Update(new(timeSinceStart, interval)); + } + Thread.Sleep(1); +} diff --git a/Platforms/Server/Server.csproj b/Platforms/Server/Server.csproj new file mode 100644 index 0000000..f36684b --- /dev/null +++ b/Platforms/Server/Server.csproj @@ -0,0 +1,20 @@ + + + + Exe + net9.0 + disable + enable + + + + + + + + + All + + + + diff --git a/Pong.sln b/Pong.sln index 70c2a07..c07d765 100644 --- a/Pong.sln +++ b/Pong.sln @@ -23,6 +23,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Engine.Integration", "Engin EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Engine.Integration.MonoGame", "Engine\Engine.Integration\Engine.Integration.MonoGame\Engine.Integration.MonoGame.csproj", "{7CC31BC4-38EE-40F4-BBBA-9FC2F4CF6283}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Platforms\Server\Server.csproj", "{A15263DB-DF65-4A07-8CA1-33A2919501A0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -117,6 +119,18 @@ Global {7CC31BC4-38EE-40F4-BBBA-9FC2F4CF6283}.Release|x64.Build.0 = Release|Any CPU {7CC31BC4-38EE-40F4-BBBA-9FC2F4CF6283}.Release|x86.ActiveCfg = Release|Any CPU {7CC31BC4-38EE-40F4-BBBA-9FC2F4CF6283}.Release|x86.Build.0 = Release|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Debug|x64.ActiveCfg = Debug|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Debug|x64.Build.0 = Debug|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Debug|x86.ActiveCfg = Debug|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Debug|x86.Build.0 = Debug|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Release|Any CPU.Build.0 = Release|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Release|x64.ActiveCfg = Release|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Release|x64.Build.0 = Release|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Release|x86.ActiveCfg = Release|Any CPU + {A15263DB-DF65-4A07-8CA1-33A2919501A0}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -129,5 +143,6 @@ Global {8863A1BA-2E83-419F-BACB-D4A4156EC71C} = {F7F62670-237A-4C93-A30E-CE661C6FC401} {9059393F-4073-9273-0EEC-2B1BA61B620B} = {F7F62670-237A-4C93-A30E-CE661C6FC401} {7CC31BC4-38EE-40F4-BBBA-9FC2F4CF6283} = {9059393F-4073-9273-0EEC-2B1BA61B620B} + {A15263DB-DF65-4A07-8CA1-33A2919501A0} = {FECFFD54-338F-4060-9161-1E5770D1DC33} EndGlobalSection EndGlobal diff --git a/Shared/Behaviours/PaddleBehaviour.cs b/Shared/Behaviours/PaddleBehaviour.cs index ab37dd3..0182130 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 isUpPressed = false; private bool isDownPressed = false; - private IButtonInputs inputs = null!; + private IButtonInputs? inputs = null; private INetworkCommunicatorClient? networkClient = null!; private INetworkCommunicatorServer? networkServer = null; private IRigidBody2D rigidBody = null!; @@ -44,25 +44,25 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp public void FirstActiveFrame() { physicsEngine2D = Universe.FindRequiredBehaviour(); - inputs = Universe.FindRequiredBehaviour>(); + inputs = Universe.FindBehaviour>(); networkClient = Universe.FindBehaviour(); networkServer = Universe.FindBehaviour(); rigidBody = BehaviourController.GetRequiredBehaviour(); - inputs.RegisterOnPress(Up, OnUpPressed); - inputs.RegisterOnRelease(Up, OnUpReleased); + inputs?.RegisterOnPress(Up, OnUpPressed); + inputs?.RegisterOnRelease(Up, OnUpReleased); - inputs.RegisterOnPress(Down, OnDownPressed); - inputs.RegisterOnRelease(Down, OnDownReleased); + inputs?.RegisterOnPress(Down, OnDownPressed); + inputs?.RegisterOnRelease(Down, OnDownReleased); } protected override void OnFinalize() { - inputs.UnregisterOnPress(Up, OnUpPressed); - inputs.UnregisterOnRelease(Up, OnUpReleased); + inputs?.UnregisterOnPress(Up, OnUpPressed); + inputs?.UnregisterOnRelease(Up, OnUpReleased); - inputs.UnregisterOnPress(Down, OnDownPressed); - inputs.UnregisterOnRelease(Down, OnDownReleased); + inputs?.UnregisterOnPress(Down, OnDownPressed); + inputs?.UnregisterOnRelease(Down, OnDownReleased); } private void OnUpPressed(IButtonInputs sender, IButtonInputs.ButtonCallbackArguments args) { isUpPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } diff --git a/Shared/Behaviours/PongManagerBehaviour.cs b/Shared/Behaviours/PongManagerBehaviour.cs index f03c6b8..246e5d8 100644 --- a/Shared/Behaviours/PongManagerBehaviour.cs +++ b/Shared/Behaviours/PongManagerBehaviour.cs @@ -32,8 +32,8 @@ public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate public void FirstActiveFrame() { - IButtonInputs buttonInputs = Universe.FindRequired>(); - buttonInputs.RegisterOnRelease(Keys.Space, (_, _1) => networkClient?.SendToServer(new RequestStartPacket())); + IButtonInputs? buttonInputs = Universe.FindBehaviour>(); + buttonInputs?.RegisterOnRelease(Keys.Space, (_, _1) => networkClient?.SendToServer(new RequestStartPacket())); ball = Universe.FindRequiredBehaviour(); networkClient = Universe.FindBehaviour(); diff --git a/Shared/GamePong.cs b/Shared/PongUniverse.cs similarity index 64% rename from Shared/GamePong.cs rename to Shared/PongUniverse.cs index fe3103d..2f5cc32 100644 --- a/Shared/GamePong.cs +++ b/Shared/PongUniverse.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using Microsoft.Xna.Framework.Input; @@ -14,106 +13,109 @@ using Syntriax.Engine.Systems.Tween; namespace Pong; -public class GamePong : MonoGameWindow +public static class PongUniverse { - protected override void Initialize() + public static IUniverse GetPongUniverse(bool isServerEnabled, bool isClientEnabled) { - base.Initialize(); + Universe universe = new(); - if (Environment.GetCommandLineArgs().FirstOrDefault(x => x.CompareTo("-server") == 0) is not null) + if (isServerEnabled) { - LiteNetLibServer server = Universe.InstantiateUniverseObject().SetUniverseObject("Server").BehaviourController.AddBehaviour(); + LiteNetLibServer server = universe.InstantiateUniverseObject().SetUniverseObject("Server").BehaviourController.AddBehaviour(); server.BehaviourController.AddBehaviour(); server.Start(8888, 2); - Window.Title = $"Server"; } - else + + if (isClientEnabled) { - LiteNetLibClient client = Universe.InstantiateUniverseObject().SetUniverseObject("Client").BehaviourController.AddBehaviour(); + LiteNetLibClient client = universe.InstantiateUniverseObject().SetUniverseObject("Client").BehaviourController.AddBehaviour(); client.BehaviourController.AddBehaviour(); client.Connect("localhost", 8888); - Window.Title = $"Client"; - DrawManager drawManager = Universe.InstantiateUniverseObject().SetUniverseObject("Draw Manager").BehaviourController.AddBehaviour(); - Universe.InstantiateUniverseObject().SetUniverseObject("Shape Batcher", drawManager.UniverseObject).BehaviourController.AddBehaviour(); - Universe.InstantiateUniverseObject().SetUniverseObject("Sprite Batcher", drawManager.UniverseObject).BehaviourController.AddBehaviour(); + DrawManager drawManager = universe.InstantiateUniverseObject().SetUniverseObject("Draw Manager").BehaviourController.AddBehaviour(); + universe.InstantiateUniverseObject().SetUniverseObject("Shape Batcher", drawManager.UniverseObject).BehaviourController.AddBehaviour(); + universe.InstantiateUniverseObject().SetUniverseObject("Sprite Batcher", drawManager.UniverseObject).BehaviourController.AddBehaviour(); - Universe.InstantiateUniverseObject().SetUniverseObject("Score Left") + //////////////////////////////////////////////////////////////////////////////////// + + universe.InstantiateUniverseObject().SetUniverseObject("Camera") + .BehaviourController.AddBehaviour() + .BehaviourController.AddBehaviour() + .BehaviourController.AddBehaviour(); + + //////////////////////////////////////////////////////////////////////////////////// + + universe.InstantiateUniverseObject().SetUniverseObject("Score Left") .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-250f, 250f), scale: Vector2D.One * .25f) .BehaviourController.AddBehaviour(true); - 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); } - Universe.InstantiateUniverseObject().SetUniverseObject("Update Manager").BehaviourController.AddBehaviour(); - Universe.InstantiateUniverseObject().SetUniverseObject("Coroutine Manager").BehaviourController.AddBehaviour(); - Universe.InstantiateUniverseObject().SetUniverseObject("Tween Manager").BehaviourController.AddBehaviour(); - Universe.InstantiateUniverseObject().SetUniverseObject("Physics Engine 2D").BehaviourController.AddBehaviour(); + universe.InstantiateUniverseObject().SetUniverseObject("Update Manager").BehaviourController.AddBehaviour(); + universe.InstantiateUniverseObject().SetUniverseObject("Coroutine Manager").BehaviourController.AddBehaviour(); + universe.InstantiateUniverseObject().SetUniverseObject("Tween Manager").BehaviourController.AddBehaviour(); + universe.InstantiateUniverseObject().SetUniverseObject("Physics Engine 2D").BehaviourController.AddBehaviour(); //////////////////////////////////////////////////////////////////////////////////// - Universe.InstantiateUniverseObject().SetUniverseObject("Camera") - .BehaviourController.AddBehaviour() - .BehaviourController.AddBehaviour() - .BehaviourController.AddBehaviour(); - - //////////////////////////////////////////////////////////////////////////////////// - - PongManagerBehaviour pongManager = Universe.InstantiateUniverseObject().SetUniverseObject("Pong Game Manager") + PongManagerBehaviour pongManager = universe.InstantiateUniverseObject().SetUniverseObject("Pong Game Manager") .BehaviourController.AddBehaviour(5); //////////////////////////////////////////////////////////////////////////////////// - Universe.InstantiateUniverseObject().SetUniverseObject("Ball") - .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0, 0f), scale: new Vector2D(10f, 10f)) - .BehaviourController.AddBehaviour(new Circle(Vector2D.Zero, 1f)) - .BehaviourController.AddBehaviour() - .BehaviourController.AddBehaviour(); + universe.InstantiateUniverseObject().SetUniverseObject("Ball") + .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0, 0f), scale: new Vector2D(10f, 10f)) + .BehaviourController.AddBehaviour(new Circle(Vector2D.Zero, 1f)) + .BehaviourController.AddBehaviour() + .BehaviourController.AddBehaviour(); //////////////////////////////////////////////////////////////////////////////////// IUniverseObject leftPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Left Paddle"); leftPaddle.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-468f, 0f), scale: new Vector2D(15f, 60f)) - .BehaviourController.AddBehaviour(Shape2D.Square) - .BehaviourController.AddBehaviour().IsStatic = true; + .BehaviourController.AddBehaviour(Shape2D.Square) + .BehaviourController.AddBehaviour().IsStatic = true; PaddleBehaviour leftPaddleBehaviour = BehaviourFactory.Instantiate(Keys.W, Keys.S, 228f, -228f, 400f); leftPaddleBehaviour.Id = "lp"; leftPaddle.BehaviourController.AddBehaviour(leftPaddleBehaviour); - Universe.Register(leftPaddle); + universe.Register(leftPaddle); IUniverseObject rightPaddle = UniverseObjectFactory.Instantiate().SetUniverseObject("Right Paddle"); rightPaddle.BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(468f, 0f), scale: new Vector2D(15f, 60f)) - .BehaviourController.AddBehaviour(Shape2D.Square) - .BehaviourController.AddBehaviour().IsStatic = true; + .BehaviourController.AddBehaviour(Shape2D.Square) + .BehaviourController.AddBehaviour().IsStatic = true; PaddleBehaviour rightPaddleBehaviour = BehaviourFactory.Instantiate(Keys.Up, Keys.Down, 228f, -228f, 400f); rightPaddleBehaviour.Id = "rp"; rightPaddle.BehaviourController.AddBehaviour(rightPaddleBehaviour); - Universe.Register(rightPaddle); + universe.Register(rightPaddle); //////////////////////////////////////////////////////////////////////////////////// - Universe.InstantiateUniverseObject().SetUniverseObject("Wall Top") + universe.InstantiateUniverseObject().SetUniverseObject("Wall Top") .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0f, 308f), scale: new Vector2D(552f, 20f)) .BehaviourController.AddBehaviour(Shape2D.Square) .BehaviourController.AddBehaviour().IsStatic = true; - Universe.InstantiateUniverseObject().SetUniverseObject("Wall Bottom") + universe.InstantiateUniverseObject().SetUniverseObject("Wall Bottom") .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(0f, -308f), scale: new Vector2D(552f, 20f)) .BehaviourController.AddBehaviour(Shape2D.Square) .BehaviourController.AddBehaviour().IsStatic = true; - Universe.InstantiateUniverseObject().SetUniverseObject("Wall Right") + universe.InstantiateUniverseObject().SetUniverseObject("Wall Right") .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(532f, 0f), scale: new Vector2D(20f, 328f)) .BehaviourController.AddBehaviour((Action)pongManager.ScoreToLeft) .BehaviourController.AddBehaviour(Shape2D.Square) .BehaviourController.AddBehaviour().IsStatic = true; - Universe.InstantiateUniverseObject().SetUniverseObject("Wall Left") + universe.InstantiateUniverseObject().SetUniverseObject("Wall Left") .BehaviourController.AddBehaviour().SetTransform(position: new Vector2D(-532f, 0f), scale: new Vector2D(20f, 328f)) .BehaviourController.AddBehaviour((Action)pongManager.ScoreToRight) .BehaviourController.AddBehaviour(Shape2D.Square) .BehaviourController.AddBehaviour().IsStatic = true; + + return universe; } }