diff --git a/ZoFo/GameCore/Client.cs b/ZoFo/GameCore/Client.cs index 5ee0546..49b1813 100644 --- a/ZoFo/GameCore/Client.cs +++ b/ZoFo/GameCore/Client.cs @@ -27,12 +27,14 @@ namespace ZoFo.GameCore public void GameEndedUnexpectedly(){ } - public void JoinRoom(){ } - - public void JoinYourself(){ } + public void JoinRoom(string ip) + { + networkManager.JoinRoom(ip); + } + public void JoinYourself(){ networkManager.JoinYourself(); } internal void Update(GameTime gameTime) - { + { } internal void Draw(SpriteBatch spriteBatch) diff --git a/ZoFo/GameCore/GUI/MainMenuGUI.cs b/ZoFo/GameCore/GUI/MainMenuGUI.cs index cbfe7fa..4683ddd 100644 --- a/ZoFo/GameCore/GUI/MainMenuGUI.cs +++ b/ZoFo/GameCore/GUI/MainMenuGUI.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Threading; using System.Xml; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; @@ -20,15 +21,15 @@ public class MainMenuGUI : AbstractGUI { int width = AppManager.Instance.CurentScreenResolution.X; int height = AppManager.Instance.CurentScreenResolution.Y; - + menuBackground = new DrawableUIElement(Manager) { rectangle = new Rectangle(0, 0, width, height), mainColor = Color.White, textureName = "Textures\\GUI\\MenuBackground" }; Elements.Add(menuBackground); menuBackground.LoadTexture(AppManager.Instance.Content); - - Elements.Add(new Label(Manager) { rectangle = new Rectangle(width / 2 - (int)(width / 8), height / 5, (int)(width / 4), (int)(height / 20)), text = "ZoFo", fontColor = Color.White, mainColor = Color.Transparent, scale = 0.9f, fontName = "Fonts\\Font"}); - - - Button playButton = new Button(Manager) + + Elements.Add(new Label(Manager) { rectangle = new Rectangle(width / 2 - (int)(width / 8), height / 5, (int)(width / 4), (int)(height / 20)), text = "ZoFo", fontColor = Color.White, mainColor = Color.Transparent, scale = 0.9f, fontName = "Fonts\\Font" }); + + + Button playButton = new Button(Manager) { rectangle = new Rectangle(width / 2 - (int)(width / 10), height / 3 + height / 20 + height / 40, (int)(width / 5), (int)(height / 20)), text = "Play", @@ -37,12 +38,12 @@ public class MainMenuGUI : AbstractGUI mainColor = Color.Gray, fontName = "Fonts\\Font" }; - playButton.LeftButtonPressed += () => - { - AppManager.Instance.SetGUI(new SelectModeMenu()); + playButton.LeftButtonPressed += () => + { + AppManager.Instance.SetGUI(new SelectModeMenu()); }; Elements.Add(playButton); - Button optionButton = new Button(Manager) + Button optionButton = new Button(Manager) { rectangle = new Rectangle(width / 2 - (int)(width / 10), height / 3 + (height / 20 + height / 40) * 2, (int)(width / 5), (int)(height / 20)), text = "Options", @@ -51,12 +52,12 @@ public class MainMenuGUI : AbstractGUI mainColor = Color.Gray, fontName = "Fonts\\Font" }; - optionButton.LeftButtonPressed += () => + optionButton.LeftButtonPressed += () => { AppManager.Instance.SetGUI(new OptionsGUI()); }; Elements.Add(optionButton); - Button exitButton = new Button(Manager) + Button exitButton = new Button(Manager) { rectangle = new Rectangle(width / 2 - (int)(width / 10), height / 3 + (height / 20 + height / 40) * 3, (int)(width / 5), (int)(height / 20)), text = "Exit", @@ -65,15 +66,14 @@ public class MainMenuGUI : AbstractGUI mainColor = Color.Gray, fontName = "Fonts\\Font" }; - exitButton.LeftButtonPressed += () => + exitButton.LeftButtonPressed += () => { AppManager.Instance.Exit(); }; Elements.Add(exitButton); - - - } + + } public override void Update(GameTime gameTime) { base.Update(gameTime); diff --git a/ZoFo/GameCore/GameManagers/AppManager.cs b/ZoFo/GameCore/GameManagers/AppManager.cs index fbb7726..6b111bd 100644 --- a/ZoFo/GameCore/GameManagers/AppManager.cs +++ b/ZoFo/GameCore/GameManagers/AppManager.cs @@ -20,9 +20,9 @@ namespace ZoFo.GameCore.GameManagers { private GraphicsDeviceManager _graphics; private SpriteBatch _spriteBatch; - - - + + + public static AppManager Instance { get; private set; } public GameState gamestate; public AbstractGUI currentGUI; @@ -31,13 +31,13 @@ namespace ZoFo.GameCore.GameManagers public Client client; public Server server; - + #region Managers - + public InputManager InputManager; public ItemManager.ItemManager ItemManager; - public AnimationBuilder animationBuilder{get;set; } + public AnimationBuilder animationBuilder { get; set; } #endregion @@ -45,16 +45,16 @@ namespace ZoFo.GameCore.GameManagers { _graphics = new GraphicsDeviceManager(this); SetResolution(CurentScreenResolution.X, CurentScreenResolution.Y); - FulscrreenSwitch(); - - + // FulscrreenSwitch(); + + Content.RootDirectory = "Content"; IsMouseVisible = true; Instance = this; InputManager = new InputManager(); - - + + currentGUI = new MainMenuGUI(); debugHud = new DebugHUD(); @@ -65,9 +65,7 @@ namespace ZoFo.GameCore.GameManagers protected override void Initialize() { currentGUI.Initialize(); - debugHud.Initialize(); - - + debugHud.Initialize(); base.Initialize(); @@ -88,9 +86,9 @@ namespace ZoFo.GameCore.GameManagers if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) Exit(); - + debugHud.Set("key", "value"); - + InputManager.Update(); currentGUI.Update(gameTime); switch (gamestate) @@ -115,7 +113,7 @@ namespace ZoFo.GameCore.GameManagers { GraphicsDevice.Clear(Color.CornflowerBlue); - + currentGUI.Draw(_spriteBatch); debugHud.Draw(_spriteBatch); @@ -123,7 +121,7 @@ namespace ZoFo.GameCore.GameManagers { case GameState.ClientPlaying: case GameState.HostPlaying: - client.Draw(_spriteBatch); + client.Draw(_spriteBatch); break; case GameState.NotPlaying: default: @@ -138,7 +136,7 @@ namespace ZoFo.GameCore.GameManagers } public void SetGUI(AbstractGUI gui) { - currentGUI = gui; + currentGUI = gui; currentGUI.Initialize(); currentGUI.LoadContent(); @@ -160,5 +158,8 @@ namespace ZoFo.GameCore.GameManagers { _graphics.IsFullScreen = !_graphics.IsFullScreen; } + + public void SetServer(Server server) { this.server = server; } + public void SetClient(Client client) { this.client = client; } } } diff --git a/ZoFo/GameCore/GameManagers/NetworkManager/ClientNetworkManager.cs b/ZoFo/GameCore/GameManagers/NetworkManager/ClientNetworkManager.cs index ea57f60..a44eade 100644 --- a/ZoFo/GameCore/GameManagers/NetworkManager/ClientNetworkManager.cs +++ b/ZoFo/GameCore/GameManagers/NetworkManager/ClientNetworkManager.cs @@ -5,6 +5,7 @@ using System.Net; using System.Net.Sockets; using System.Security.Cryptography.X509Certificates; using System.Text; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using ZoFo.GameCore.GameManagers.NetworkManager.Updates; @@ -20,6 +21,12 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager List updates = new List(); public delegate void OnDataSent(string Data); public event OnDataSent GetDataSent; // event + + public ClientNetworkManager() + { + Init(); + } + public void Init() //create endPoint, socket { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); @@ -27,11 +34,13 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager public void SendData() { - while(socket.Connected) - { - byte[] bytes = Encoding.UTF8.GetBytes(updates.ToString()); + byte[] bytes = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(updates)); //нужно сериализовать socket.Send(bytes); - } + } + + public void AddData(IUpdateData UpdateData) + { + updates.Add(UpdateData); } public void StopConnection() @@ -47,10 +56,9 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager /// public void JoinRoom(string ip) // multyplayer { + endPoint = new IPEndPoint(IPAddress.Parse(ip), port); - socket.Connect(endPoint); - SendData(); Thread listen = new Thread(StartListening); listen.Start(); @@ -62,9 +70,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager public void JoinYourself() // single player { endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port); - socket.Connect(endPoint); - SendData(); Thread listen = new Thread(StartListening); listen.Start(); diff --git a/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs b/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs index 8cfd461..c092973 100644 --- a/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs +++ b/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs @@ -16,7 +16,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager { public class ServerNetworkManager { - private IPAddress ip = IPAddress.Any; + private IPAddress ip =IPAddress.Parse("127.0.0.1"); //IPAddress.Any private int port = 7632; private IPEndPoint endPoint; private Socket socket; @@ -25,12 +25,18 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager public delegate void OnDataSend(string data); public event OnDataSend GetDataSend; // event Dictionary managerThread; + Thread serverTheread; + + public ServerNetworkManager() { Init(); } public void Init() //create Socket { endPoint = new IPEndPoint(ip, port); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); managerThread = new Dictionary(); + clients = new List(); + updates = new List(); + managerThread = new Dictionary(); } /// /// отправляет клиенту Data @@ -51,8 +57,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager public void AddData(IUpdateData data) { updates.Add(data); - } - + } public void CloseConnection() //По сути коне игры и отключение игроков { foreach (var item in clients) @@ -74,6 +79,12 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager clients.Clear(); } + public void Start(object players) + { + serverTheread = new Thread(StartWaitingForPlayers); + serverTheread.Start(players); + } + //Потоки Клиентов public void StartWaitingForPlayers(object players)//Слушает игроков, которые хотят подключиться { diff --git a/ZoFo/GameCore/Server.cs b/ZoFo/GameCore/Server.cs index 337f46c..9faf5df 100644 --- a/ZoFo/GameCore/Server.cs +++ b/ZoFo/GameCore/Server.cs @@ -37,21 +37,27 @@ namespace ZoFo.GameCore { networkManager.AddData(data); } - public void CreateRoom(int players) //Создает комнату и запускает ожидание подключений + /// + /// Создает комнату и запускает ожидание подключений + /// + /// + public void CreateRoom(int players) { - networkManager.StartWaitingForPlayers(players); + networkManager.Start(players); } // public void StartGame() { } принудительный запуск - public void EndGame() //Добавляет UpdateGameEnded и отключает игроков + + /// + /// Добавляет UpdateGameEnded и отключает игроков + /// + public void EndGame() { UpdateGameEnded gameEnded = new UpdateGameEnded(); networkManager.AddData(gameEnded); networkManager.CloseConnection(); - } - - - public void Update(GameTime gameTime) + } + public void Update(GameTime gameTime) { }