From 99fe39c2c5e4f926134565b0cbd46e8656b53def Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Wed, 16 Aug 2023 18:50:58 +0300 Subject: [PATCH 1/9] SilasHand --- AnimationsFileCreator/Program.cs | 3 +- DangerousD/Content/animations/SilasHandMove | 1 + .../LivingEntities/Monsters/SilasHands.cs | 60 ++++++++++++++++++- .../LivingEntities/Monsters/SilasMaster.cs | 28 ++++++++- .../GameCore/Graphics/GraphicsComponent.cs | 16 ++++- DangerousD/GameCore/Levels/Level1.cs | 2 +- 6 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 DangerousD/Content/animations/SilasHandMove diff --git a/AnimationsFileCreator/Program.cs b/AnimationsFileCreator/Program.cs index dc2bf5b..9a712a0 100644 --- a/AnimationsFileCreator/Program.cs +++ b/AnimationsFileCreator/Program.cs @@ -5,6 +5,7 @@ using System; using System.Windows.Forms; using System.IO; using System.Linq; +using System.Reflection.Metadata; namespace AnimationsFileCreator { @@ -62,7 +63,7 @@ namespace AnimationsFileCreator container.TextureFrameInterval = 1; container.Id = id; string json = JsonConvert.SerializeObject(container); - StreamWriter writer = new StreamWriter(id); + StreamWriter writer = new StreamWriter("../../../../DangerousD/Content/animations/"+id); writer.WriteLine(json); writer.Close(); } diff --git a/DangerousD/Content/animations/SilasHandMove b/DangerousD/Content/animations/SilasHandMove new file mode 100644 index 0000000..06589c3 --- /dev/null +++ b/DangerousD/Content/animations/SilasHandMove @@ -0,0 +1 @@ +{"id":"SilasHandMove","textureName":"MonstersAnimations","startSpriteRectangle":{"X":197,"Y":618,"Width":24,"Height":24},"frameSecond":[{"Item1":0,"Item2":8}],"textureFrameInterval":1,"framesCount":2,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs index 6c13e1b..63cfcaa 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs @@ -1,4 +1,8 @@ -using System; +using DangerousD.GameCore.Graphics; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -6,7 +10,59 @@ using System.Threading.Tasks; namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { - internal class SilasHands + public class SilasHands : CoreEnemy { + public SilasHands(Vector2 position) : base(position) + { + name = "SilasHand"; + Width = 48; + Height = 48; + monster_health = 2; + monster_speed = 2; + acceleration = Vector2.Zero; + + } + + protected override GraphicsComponent GraphicsComponent { get; }=new GraphicsComponent(new List() { "SilasHandMove" }, "SilasHandMove"); + + public override void Attack() + { + throw new NotImplementedException(); + } + + public override void Death() + { + throw new NotImplementedException(); + } + + public override void Move(GameTime gameTime) + { + if (Pos.Y> AppManager.Instance.GameManager.GetPlayer1.Pos.Y) + { + velocity.Y = monster_speed; + + } + else + { + velocity.Y = 0; + } + if (Pos.X> AppManager.Instance.GameManager.GetPlayer1.Pos.X) + { + velocity.X = -monster_speed; + } + else + { + velocity.X = monster_speed; + } + } + public override void Update(GameTime gameTime) + { + if ((Pos.X + 20 <= AppManager.Instance.GameManager.GetPlayer1.Pos.X || Pos.X - 20 >= AppManager.Instance.GameManager.GetPlayer1.Pos.X)&&(Pos.Y + 20 <= AppManager.Instance.GameManager.GetPlayer1.Pos.Y || Pos.Y - 20 >= AppManager.Instance.GameManager.GetPlayer1.Pos.Y)) + { + + AppManager.Instance.GameManager.GetPlayer1.Death(name); + } + GraphicsComponent.Update(); + } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 4a5d727..656f5f8 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -1,4 +1,8 @@ -using System; +using DangerousD.GameCore.Graphics; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -6,7 +10,27 @@ using System.Threading.Tasks; namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { - public class SilasMaster + public class SilasMaster : CoreEnemy { + public SilasMaster(Vector2 position) : base(position) + { + + } + protected override GraphicsComponent GraphicsComponent => throw new NotImplementedException(); + + public override void Attack() + { + throw new NotImplementedException(); + } + + public override void Death() + { + throw new NotImplementedException(); + } + + public override void Move(GameTime gameTime) + { + throw new NotImplementedException(); + } } } diff --git a/DangerousD/GameCore/Graphics/GraphicsComponent.cs b/DangerousD/GameCore/Graphics/GraphicsComponent.cs index c5834ab..849eae0 100644 --- a/DangerousD/GameCore/Graphics/GraphicsComponent.cs +++ b/DangerousD/GameCore/Graphics/GraphicsComponent.cs @@ -14,7 +14,14 @@ namespace DangerousD.GameCore.Graphics private List textures; private List texturesNames; private AnimationContainer currentAnimation; - + public AnimationContainer CurrentAnimation + { + get + { + return currentAnimation; + } + } + public string GetCurrentAnimation { get { return currentAnimation.Id; } @@ -24,6 +31,13 @@ namespace DangerousD.GameCore.Graphics //private SpriteBatch _spriteBatch; private int currentFrame; + public int CurrentFrame + { + get + { + return currentFrame; + } + } private int interval; private int lastInterval; private Rectangle sourceRectangle; diff --git a/DangerousD/GameCore/Levels/Level1.cs b/DangerousD/GameCore/Levels/Level1.cs index d23c7c6..532517d 100644 --- a/DangerousD/GameCore/Levels/Level1.cs +++ b/DangerousD/GameCore/Levels/Level1.cs @@ -14,7 +14,7 @@ namespace DangerousD.GameCore.Levels var Zombie = new Zombie(new Vector2(300, 64)); var Frank = new Frank(new Vector2(100, 64)); - + var SilasHand = new SilasHands(new Vector2(200,64)); new GrassBlock(new Vector2(0, 224)); for (int i = 0; i < 50; i++) { From a2fc6a5db4ec79001cbc8aa861d67ee90454b54a Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Thu, 17 Aug 2023 10:53:35 +0300 Subject: [PATCH 2/9] StartSilasMaster --- DangerousD/Content/animations/SilasMove | 1 + .../GameObjects/LivingEntities/Monsters/SilasMaster.cs | 3 +-- DangerousD/GameCore/Graphics/GraphicsComponent.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 DangerousD/Content/animations/SilasMove diff --git a/DangerousD/Content/animations/SilasMove b/DangerousD/Content/animations/SilasMove new file mode 100644 index 0000000..b584c4a --- /dev/null +++ b/DangerousD/Content/animations/SilasMove @@ -0,0 +1 @@ +{"id":"SilasMove","textureName":"animation1","startSpriteRectangle":{"X":1,"Y":618,"Width":72,"Height":80},"frameSecond":[{"Item1":0,"Item2":30}],"textureFrameInterval":1,"framesCount":2,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 656f5f8..72c8c2d 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -16,8 +16,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { } - protected override GraphicsComponent GraphicsComponent => throw new NotImplementedException(); - + protected override GraphicsComponent GraphicsComponent { get; } = new GraphicsComponent(new List() { "SilasMove" }, "SilasMove"); public override void Attack() { throw new NotImplementedException(); diff --git a/DangerousD/GameCore/Graphics/GraphicsComponent.cs b/DangerousD/GameCore/Graphics/GraphicsComponent.cs index 849eae0..e4b2777 100644 --- a/DangerousD/GameCore/Graphics/GraphicsComponent.cs +++ b/DangerousD/GameCore/Graphics/GraphicsComponent.cs @@ -21,7 +21,7 @@ namespace DangerousD.GameCore.Graphics return currentAnimation; } } - + public string LastAnimation { get; set; } public string GetCurrentAnimation { get { return currentAnimation.Id; } From ea4a2f31fc933db131b7fb2254780d39b3ebcb9d Mon Sep 17 00:00:00 2001 From: SergoDobro Date: Thu, 17 Aug 2023 11:49:12 +0300 Subject: [PATCH 3/9] first steps --- DangerousD/GameCore/GUI/LobbyGUI.cs | 6 +++++- DangerousD/GameCore/Managers/AppManager.cs | 16 ++++++++++++++-- DangerousD/GameCore/Managers/GameManager.cs | 4 +++- DangerousD/GameCore/Managers/PhysicsManager.cs | 17 +++++++++++++++++ DangerousD/GameCore/Managers/SoundManager.cs | 1 + 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/DangerousD/GameCore/GUI/LobbyGUI.cs b/DangerousD/GameCore/GUI/LobbyGUI.cs index f782750..7ebc2db 100644 --- a/DangerousD/GameCore/GUI/LobbyGUI.cs +++ b/DangerousD/GameCore/GUI/LobbyGUI.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using DangerousD.GameCore.Managers; using MonogameLibrary.UI.Base; using System.Diagnostics; +using DangerousD.GameCore.Network; namespace DangerousD.GameCore.GUI { @@ -55,7 +56,10 @@ namespace DangerousD.GameCore.GUI fontName = "font2" }; hostButton.LeftButtonPressed += () => { - + + AppManager.Instance.NetworkManager.HostInit(""); + + }; Button refreshButton = new ButtonText(Manager) diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index dc44ba9..f4c7a78 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -14,12 +14,14 @@ using DangerousD.GameCore.Managers; namespace DangerousD.GameCore { public enum GameState { Menu, Options, Lobby, Game, Login } + public enum MultiPlayerStatus { SinglePlayer, Host, Client } public class AppManager : Game { public static AppManager Instance { get; private set; } private GraphicsDeviceManager _graphics; - private SpriteBatch _spriteBatch; - GameState gameState; + private SpriteBatch _spriteBatch; + public GameState gameState { get; private set; } + public MultiPlayerStatus multiPlayerStatus { get; private set; } IDrawableObject MenuGUI; IDrawableObject OptionsGUI; IDrawableObject LoginGUI; @@ -45,6 +47,8 @@ namespace DangerousD.GameCore SettingsManager = new SettingsManager(); SettingsManager.LoadSettings(); + NetworkManager.GetReceivingMessages += NetworkSync; + resolution = SettingsManager.Resolution; _graphics.PreferredBackBufferWidth = resolution.X; _graphics.PreferredBackBufferHeight = resolution.Y; @@ -167,5 +171,13 @@ namespace DangerousD.GameCore } } + public void NetworkSync(NetworkTask networkTask) + { + + } + public void SetMultiplayerState(MultiPlayerStatus multiPlayerStatus) + { + this.multiPlayerStatus = multiPlayerStatus; + } } } diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index f017120..65d9d06 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -12,7 +12,7 @@ namespace DangerousD.GameCore { public class GameManager { - + public List GetAllGameObjects { get; private set; } public List livingEntities; public List entities; public List mapObjects; @@ -22,6 +22,7 @@ namespace DangerousD.GameCore public Player GetPlayer1 { get; private set; } public GameManager() { + GetAllGameObjects = new List(); livingEntities = new List(); mapObjects = new List(); entities = new List(); @@ -33,6 +34,7 @@ namespace DangerousD.GameCore internal void Register(GameObject gameObject) { + GetAllGameObjects.Add(gameObject); if (gameObject is LivingEntity) livingEntities.Add(gameObject as LivingEntity); if (gameObject is Entity) diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 7ae99f9..f376c3c 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -206,5 +206,22 @@ namespace DangerousD.GameCore.Managers } return null; } + + public List CheckRectangle(Rectangle rectangle, Type type) + { + var gameObjects = AppManager.Instance.GameManager.GetAllGameObjects; + List intersected = new List(); + for (int i = 0; i < gameObjects.Count; i++) + { + if (gameObjects[i].GetType() == type) + { + if (gameObjects[i].Rectangle.Intersects(rectangle)) + { + intersected.Add(gameObjects[i]); + } + } + } + return intersected; + } } } \ No newline at end of file diff --git a/DangerousD/GameCore/Managers/SoundManager.cs b/DangerousD/GameCore/Managers/SoundManager.cs index 9021fa8..b32ab35 100644 --- a/DangerousD/GameCore/Managers/SoundManager.cs +++ b/DangerousD/GameCore/Managers/SoundManager.cs @@ -42,6 +42,7 @@ namespace DangerousD.GameCore sound.SoundEffect.Volume = (float)sound.GetDistance(playerPos) / MaxSoundDistance; sound.SoundEffect.Play(); PlayingSounds.Add(sound); + AppManager.Instance.NetworkManager.SendMsg(new Network.NetworkTask(sound.Position, soundName)); } public void StopAllSounds() // остановка всех звуков { From e54900307d52857ecf22d5cf65dba5173ef28cb7 Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Thu, 17 Aug 2023 12:20:20 +0300 Subject: [PATCH 4/9] SilosMasterVersion1 --- DangerousD/Content/animation1.png | Bin 24516 -> 0 bytes DangerousD/Content/animations/SilasAttack | 20 ++++++++ DangerousD/Content/animations/SilasMove | 21 +++++++- .../LivingEntities/Monsters/SilasHands.cs | 1 + .../LivingEntities/Monsters/SilasMaster.cs | 46 ++++++++++++++++-- DangerousD/GameCore/Levels/Level1.cs | 1 + 6 files changed, 84 insertions(+), 5 deletions(-) delete mode 100644 DangerousD/Content/animation1.png create mode 100644 DangerousD/Content/animations/SilasAttack diff --git a/DangerousD/Content/animation1.png b/DangerousD/Content/animation1.png deleted file mode 100644 index a599347de189822c5589d98cfabf43dbe9207ca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24516 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 AppManager.Instance.GameManager.GetPlayer1.Pos.X)&&(Pos.Y + 20 <= AppManager.Instance.GameManager.GetPlayer1.Pos.Y || Pos.Y - 20 >= AppManager.Instance.GameManager.GetPlayer1.Pos.Y)) { diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 72c8c2d..09a3928 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -12,14 +12,31 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class SilasMaster : CoreEnemy { + private int attackTime = 60; + private int moveTime = 360; + private int currentTime = 0; public SilasMaster(Vector2 position) : base(position) { - + name = "SilasMaster"; + Width = 144; + Height = 160; + monster_health = 15; + monster_speed = 4; + acceleration = Vector2.Zero; } - protected override GraphicsComponent GraphicsComponent { get; } = new GraphicsComponent(new List() { "SilasMove" }, "SilasMove"); + protected override GraphicsComponent GraphicsComponent { get; } = new GraphicsComponent(new List() { "SilasMove", "SilasAttack" }, "SilasMove"); public override void Attack() { - throw new NotImplementedException(); + if (currentTime==0) + { + GraphicsComponent.StartAnimation("SilasAttack"); + } + else if (currentTime >= attackTime) + { + GraphicsComponent.StartAnimation("SilasMove"); + currentTime = 0; + } + currentTime++; } public override void Death() @@ -29,7 +46,28 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Move(GameTime gameTime) { - throw new NotImplementedException(); + if (currentTime == 0) + { + GraphicsComponent.StartAnimation("SilasMove"); + } + else if (currentTime >= moveTime) + { + GraphicsComponent.StartAnimation("SilasAttack"); + currentTime = 0; + } + currentTime++; + } + public override void Update(GameTime gameTime) + { + base.Update(gameTime); + if (GraphicsComponent.CurrentAnimation.Id=="SilasMove") + { + Move(gameTime); + } + else + { + Attack(); + } } } } diff --git a/DangerousD/GameCore/Levels/Level1.cs b/DangerousD/GameCore/Levels/Level1.cs index 532517d..24c10b1 100644 --- a/DangerousD/GameCore/Levels/Level1.cs +++ b/DangerousD/GameCore/Levels/Level1.cs @@ -15,6 +15,7 @@ namespace DangerousD.GameCore.Levels var Zombie = new Zombie(new Vector2(300, 64)); var Frank = new Frank(new Vector2(100, 64)); var SilasHand = new SilasHands(new Vector2(200,64)); + var SilasMaster = new SilasMaster(new Vector2(400, 64)); new GrassBlock(new Vector2(0, 224)); for (int i = 0; i < 50; i++) { From 1cfebd30bbbb7a844a41d0e2282a7739301bf350 Mon Sep 17 00:00:00 2001 From: AnloGames <7383an@gmail.com> Date: Thu, 17 Aug 2023 12:35:26 +0300 Subject: [PATCH 5/9] Login And Sound Network Pripilivanie --- DangerousD/GameCore/GUI/LobbyGUI.cs | 60 +++++++++----------- DangerousD/GameCore/GUI/MenuGUI.cs | 1 + DangerousD/GameCore/Managers/AppManager.cs | 24 +++++++- DangerousD/GameCore/Managers/SoundManager.cs | 10 +++- DangerousD/GameCore/Network/NetworkTask.cs | 24 ++++++++ 5 files changed, 83 insertions(+), 36 deletions(-) diff --git a/DangerousD/GameCore/GUI/LobbyGUI.cs b/DangerousD/GameCore/GUI/LobbyGUI.cs index 7ebc2db..2927758 100644 --- a/DangerousD/GameCore/GUI/LobbyGUI.cs +++ b/DangerousD/GameCore/GUI/LobbyGUI.cs @@ -33,8 +33,32 @@ namespace DangerousD.GameCore.GUI Elements.Add(new Label(Manager) { rectangle = new Rectangle(screenWidth / 30 * 2, screenHeight / 30 * 5, screenWidth / 30 * 26, screenHeight / 15 * 10) }); - // Buttons + // Buttons and ip textbox { + TextBox searchBarTextBox = new TextBox(Manager) + { + rectangle = new Rectangle(screenWidth / 30 * 14, screenHeight / 30, + screenWidth / 30 * 10, screenHeight / 30 * 3), + text = "ip", + scale = 0.16f, + fontColor = Color.Gray, + fontName = "font2", + textAligment = TextAligment.Left + + }; + searchBarTextBox.TextChanged += input => { + if (searchBarTextBox.fontColor == Color.Gray) + { + searchBarTextBox.text = ""; searchBarTextBox.fontColor = Color.Black; + } + }; + searchBarTextBox.StopChanging += input => { + if (input.Length == 0) + { + searchBarTextBox.fontColor = Color.Gray; + searchBarTextBox.text = "ip"; + } + }; Button backButton = new ButtonText(Manager) { rectangle = new Rectangle(screenWidth / 30, screenHeight / 30, 60, 50), @@ -57,8 +81,7 @@ namespace DangerousD.GameCore.GUI }; hostButton.LeftButtonPressed += () => { - AppManager.Instance.NetworkManager.HostInit(""); - + AppManager.Instance.NetworkManager.HostInit(AppManager.Instance.IpAddress); }; @@ -83,7 +106,7 @@ namespace DangerousD.GameCore.GUI fontName = "font2" }; joinSelectedButton.LeftButtonPressed += () => { - + AppManager.Instance.NetworkManager.ClientInit(AppManager.Instance.IpAddress); }; Button joinByIpButton = new ButtonText(Manager) { @@ -94,34 +117,7 @@ namespace DangerousD.GameCore.GUI fontName = "font2" }; joinByIpButton.LeftButtonPressed += () => { - - }; - } - - // SearchBar - { - TextBox searchBarTextBox = new TextBox(Manager) { - rectangle = new Rectangle(screenWidth / 30 * 14, screenHeight / 30, - screenWidth / 30 * 10, screenHeight / 30 * 3), - text = "ip", - scale = 0.16f, - fontColor = Color.Gray, - fontName = "font2", - textAligment = TextAligment.Left - - }; - searchBarTextBox.TextChanged += input => { - if (searchBarTextBox.fontColor == Color.Gray) - { - searchBarTextBox.text = ""; searchBarTextBox.fontColor = Color.Black; - } - }; - searchBarTextBox.StopChanging += input => { - if (input.Length == 0) - { - searchBarTextBox.fontColor = Color.Gray; - searchBarTextBox.text = "ip"; - } + AppManager.Instance.NetworkManager.ClientInit(searchBarTextBox.text); }; } } diff --git a/DangerousD/GameCore/GUI/MenuGUI.cs b/DangerousD/GameCore/GUI/MenuGUI.cs index f619d5f..b1ac08d 100644 --- a/DangerousD/GameCore/GUI/MenuGUI.cs +++ b/DangerousD/GameCore/GUI/MenuGUI.cs @@ -35,6 +35,7 @@ internal class MenuGUI : AbstractGui butSingle.LeftButtonPressed += () => { AppManager.Instance.ChangeGameState(GameState.Game); + AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.SinglePlayer); }; var butMulti = new ButtonText(Manager) { rectangle = new Rectangle((wigth - 300) / 2, 190, 300, 50), text = "Multiplayer", fontName = "ButtonFont" }; Elements.Add(butMulti); diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index f4c7a78..d0bf9b9 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -17,7 +17,8 @@ namespace DangerousD.GameCore public enum MultiPlayerStatus { SinglePlayer, Host, Client } public class AppManager : Game { - public static AppManager Instance { get; private set; } + public static AppManager Instance { get; private set; } + public string IpAddress { get; private set; } = "127.0.0.1"; private GraphicsDeviceManager _graphics; private SpriteBatch _spriteBatch; public GameState gameState { get; private set; } @@ -173,7 +174,26 @@ namespace DangerousD.GameCore public void NetworkSync(NetworkTask networkTask) { - + switch (networkTask.operation) + { + case NetworkTaskOperationEnum.TakeDamage: + break; + case NetworkTaskOperationEnum.SendSound: + SoundManager.StartSound(networkTask.name, networkTask.position, GameManager.GetPlayer1.Pos); + break; + case NetworkTaskOperationEnum.CreateEntity: + break; + case NetworkTaskOperationEnum.SendPosition: + break; + case NetworkTaskOperationEnum.ChangeState: + break; + case NetworkTaskOperationEnum.ConnectToHost: + break; + case NetworkTaskOperationEnum.GetClientPlayerId: + break; + default: + break; + } } public void SetMultiplayerState(MultiPlayerStatus multiPlayerStatus) { diff --git a/DangerousD/GameCore/Managers/SoundManager.cs b/DangerousD/GameCore/Managers/SoundManager.cs index b32ab35..382541e 100644 --- a/DangerousD/GameCore/Managers/SoundManager.cs +++ b/DangerousD/GameCore/Managers/SoundManager.cs @@ -33,8 +33,11 @@ namespace DangerousD.GameCore sound.SoundEffect.IsLooped = false; sound.SoundEffect.Play(); PlayingSounds.Add(sound); + if (AppManager.Instance.multiPlayerStatus != MultiPlayerStatus.Host) + { + AppManager.Instance.NetworkManager.SendMsg(new Network.NetworkTask(Vector2.Zero, soundName)); + } } - public void StartSound(string soundName, Vector2 soundPos, Vector2 playerPos) // запустить звук у которого есть позиция { var sound = new Sound(Sounds[soundName], soundPos); @@ -42,7 +45,10 @@ namespace DangerousD.GameCore sound.SoundEffect.Volume = (float)sound.GetDistance(playerPos) / MaxSoundDistance; sound.SoundEffect.Play(); PlayingSounds.Add(sound); - AppManager.Instance.NetworkManager.SendMsg(new Network.NetworkTask(sound.Position, soundName)); + if (AppManager.Instance.multiPlayerStatus != MultiPlayerStatus.Host) + { + AppManager.Instance.NetworkManager.SendMsg(new Network.NetworkTask(soundPos, soundName)); + } } public void StopAllSounds() // остановка всех звуков { diff --git a/DangerousD/GameCore/Network/NetworkTask.cs b/DangerousD/GameCore/Network/NetworkTask.cs index a1fb999..1dbb508 100644 --- a/DangerousD/GameCore/Network/NetworkTask.cs +++ b/DangerousD/GameCore/Network/NetworkTask.cs @@ -13,6 +13,7 @@ namespace DangerousD.GameCore.Network public NetworkTaskOperationEnum operation { get; set; } public string name { get; set; } public int value { get; set; } + public bool isParam { get; set; } public int objId { get; set; } public Vector2 position { get; set; } public Vector2 velocity { get; set; } @@ -102,5 +103,28 @@ namespace DangerousD.GameCore.Network operation = NetworkTaskOperationEnum.GetClientPlayerId; objId = PlayerId; } + + /// + /// Универсальный конструктор для нестандартных операций. То, что не нужно(кроме операции) делать null. + /// + /// + /// + /// + /// + /// + /// + /// + /// + public NetworkTask(NetworkTaskOperationEnum operation, string name, int value, bool isParam, int objId, Vector2 position, Vector2 velocity, Type type) + { + this.operation = operation; + this.name = name; + this.value = value; + this.isParam = isParam; + this.objId = objId; + this.position = position; + this.velocity = velocity; + this.type = type; + } } } From e00a5ebf737bc9f73611c7b37ee573d793a8dd1c Mon Sep 17 00:00:00 2001 From: Lev Date: Thu, 17 Aug 2023 12:41:56 +0300 Subject: [PATCH 6/9] Fix bags in RayCast --- .../GameCore/Managers/PhysicsManager.cs | 92 +++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 7ae99f9..ba19ece 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -136,7 +136,7 @@ namespace DangerousD.GameCore.Managers Rectangle rectangle; Vector2 distance = entity1.Pos - entity2.Pos; - rectangle = new Rectangle((int)entity1.Pos.X, (int)entity1.Pos.Y, entity2.Width, entity2.Height); + rectangle = new Rectangle((int)entity1.Pos.X, (int)entity1.Pos.Y - 5, entity2.Width, entity2.Height); GameObject gameObject = null; double length = distance.Length(); @@ -144,32 +144,31 @@ namespace DangerousD.GameCore.Managers { rectangle.X = (int)(entity2.Pos.X + (i / length) * distance.X); rectangle.Y = (int)(entity2.Pos.Y + (i / length) * distance.Y); + for (int j = 0; j < AppManager.Instance.GameManager.entities.Count; j++) + { + if (AppManager.Instance.GameManager.entities[i].Rectangle.Intersects(rectangle)) + { + return AppManager.Instance.GameManager.entities[i]; + } + } + for (int r = 0; r < AppManager.Instance.GameManager.mapObjects.Count; r++) + { + if (AppManager.Instance.GameManager.mapObjects[i].Rectangle.Intersects(rectangle)) + { + return AppManager.Instance.GameManager.mapObjects[i]; + } + } + for (int w = 0; w < AppManager.Instance.GameManager.livingEntities.Count; w++) + { + if (AppManager.Instance.GameManager.livingEntities[i].Rectangle.Intersects(rectangle)) + { + return AppManager.Instance.GameManager.livingEntities[i]; + } + } } - for (int i = 0; i < AppManager.Instance.GameManager.entities.Count; i++) - { - if (AppManager.Instance.GameManager.entities[i].Rectangle.Intersects(rectangle)) - { - return AppManager.Instance.GameManager.entities[i]; - } - } - for (int i = 0; i < AppManager.Instance.GameManager.mapObjects.Count; i++) - { - if (AppManager.Instance.GameManager.mapObjects[i].Rectangle.Intersects(rectangle)) - { - return AppManager.Instance.GameManager.mapObjects[i]; - } - } - - - for (int i = 0; i < AppManager.Instance.GameManager.livingEntities.Count; i++) - { - if (AppManager.Instance.GameManager.livingEntities[i].Rectangle.Intersects(rectangle)) - { - return AppManager.Instance.GameManager.livingEntities[i]; - } - } - return gameObject; + + return null; } public GameObject RayCast(LivingEntity entity1, Vector2 targetCast) { @@ -182,28 +181,29 @@ namespace DangerousD.GameCore.Managers { rectangle.X = (int)(targetCast.X + (i / k) * direction.X); rectangle.Y = (int)(targetCast.Y + (i / k) * direction.X); + for (int j = 0; j < AppManager.Instance.GameManager.entities.Count; j++) + { + if (AppManager.Instance.GameManager.entities[i].Rectangle.Intersects(rectangle)) + { + return AppManager.Instance.GameManager.entities[i]; + } + } + for (int r = 0; r < AppManager.Instance.GameManager.mapObjects.Count; r++) + { + if (AppManager.Instance.GameManager.mapObjects[i].Rectangle.Intersects(rectangle)) + { + return AppManager.Instance.GameManager.mapObjects[i]; + } + } + for (int w = 0; w < AppManager.Instance.GameManager.livingEntities.Count; w++) + { + if (AppManager.Instance.GameManager.livingEntities[i].Rectangle.Intersects(rectangle)) + { + return AppManager.Instance.GameManager.livingEntities[i]; + } + } } - for (int i = 0; i < AppManager.Instance.GameManager.entities.Count; i++) - { - if (AppManager.Instance.GameManager.entities[i].Rectangle.Intersects(rectangle)) - { - return AppManager.Instance.GameManager.entities[i]; - } - } - for (int i = 0; i < AppManager.Instance.GameManager.mapObjects.Count; i++) - { - if (AppManager.Instance.GameManager.mapObjects[i].Rectangle.Intersects(rectangle)) - { - return AppManager.Instance.GameManager.mapObjects[i]; - } - } - for (int i = 0; i < AppManager.Instance.GameManager.livingEntities.Count; i++) - { - if (AppManager.Instance.GameManager.livingEntities[i].Rectangle.Intersects(rectangle)) - { - return AppManager.Instance.GameManager.livingEntities[i]; - } - } + return null; } } From ccc6937ac934529ca08852753581f7db74c3ad42 Mon Sep 17 00:00:00 2001 From: AnloGames <7383an@gmail.com> Date: Thu, 17 Aug 2023 12:50:20 +0300 Subject: [PATCH 7/9] NetworkFix --- DangerousD/GameCore/Managers/AppManager.cs | 2 +- DangerousD/GameCore/Managers/SoundManager.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index f927618..02790a7 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -22,7 +22,7 @@ namespace DangerousD.GameCore private GraphicsDeviceManager _graphics; private SpriteBatch _spriteBatch; public GameState gameState { get; private set; } - public MultiPlayerStatus multiPlayerStatus { get; private set; } + public MultiPlayerStatus multiPlayerStatus { get; private set; } = MultiPlayerStatus.SinglePlayer; IDrawableObject MenuGUI; IDrawableObject OptionsGUI; IDrawableObject LoginGUI; diff --git a/DangerousD/GameCore/Managers/SoundManager.cs b/DangerousD/GameCore/Managers/SoundManager.cs index 382541e..ffa61d2 100644 --- a/DangerousD/GameCore/Managers/SoundManager.cs +++ b/DangerousD/GameCore/Managers/SoundManager.cs @@ -33,7 +33,7 @@ namespace DangerousD.GameCore sound.SoundEffect.IsLooped = false; sound.SoundEffect.Play(); PlayingSounds.Add(sound); - if (AppManager.Instance.multiPlayerStatus != MultiPlayerStatus.Host) + if (AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Host) { AppManager.Instance.NetworkManager.SendMsg(new Network.NetworkTask(Vector2.Zero, soundName)); } @@ -45,7 +45,7 @@ namespace DangerousD.GameCore sound.SoundEffect.Volume = (float)sound.GetDistance(playerPos) / MaxSoundDistance; sound.SoundEffect.Play(); PlayingSounds.Add(sound); - if (AppManager.Instance.multiPlayerStatus != MultiPlayerStatus.Host) + if (AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Host) { AppManager.Instance.NetworkManager.SendMsg(new Network.NetworkTask(soundPos, soundName)); } From 62a32ccdce29130346c3a82c83fbac04ba514af4 Mon Sep 17 00:00:00 2001 From: AnloGames <7383an@gmail.com> Date: Thu, 17 Aug 2023 13:05:43 +0300 Subject: [PATCH 8/9] TryCatchNetworkFix --- DangerousD/GameCore/Network/NetworkManager.cs | 132 +++++++++++------- 1 file changed, 83 insertions(+), 49 deletions(-) diff --git a/DangerousD/GameCore/Network/NetworkManager.cs b/DangerousD/GameCore/Network/NetworkManager.cs index b56f9f1..2cc93ae 100644 --- a/DangerousD/GameCore/Network/NetworkManager.cs +++ b/DangerousD/GameCore/Network/NetworkManager.cs @@ -21,20 +21,27 @@ namespace DangerousD.GameCore.Network private void Init(string IpAddress) { - socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - IPAddress address = IPAddress.Parse(IpAddress); - int port = 8000; - endPoint = new IPEndPoint(address, port); + try + { + socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + IPAddress address = IPAddress.Parse(IpAddress); + int port = 8000; + endPoint = new IPEndPoint(address, port); + } + catch { } } private void AcceptSockets() { while (true) { - Socket clientSocket = socket.Accept(); - clientSockets.Add(clientSocket); - Thread receiveThread = new Thread(BeginHostReceive); - receiveThread.Start(clientSocket); - Console.WriteLine("Connected"); + try + { + Socket clientSocket = socket.Accept(); + clientSockets.Add(clientSocket); + Thread receiveThread = new Thread(BeginHostReceive); + receiveThread.Start(clientSocket); + } + catch { } } } @@ -43,31 +50,42 @@ namespace DangerousD.GameCore.Network Socket clientSocket = clSocket as Socket; while (clientSocket != null) { - byte[] bytesCount = new byte[4]; - clientSocket.Receive(bytesCount); - byte[] Data = new byte[BitConverter.ToInt32(bytesCount)]; - StateObject so = new StateObject(clientSocket, Data); - IAsyncResult count = clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so); + try + { + byte[] bytesCount = new byte[4]; + clientSocket.Receive(bytesCount); + byte[] Data = new byte[BitConverter.ToInt32(bytesCount)]; + StateObject so = new StateObject(clientSocket, Data); + IAsyncResult count = clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so); + } + catch { } } } public void HostInit(string IpAddress) { - Init(IpAddress); - socket.Bind(endPoint); - socket.Listen(4); - Thread acceptThread = new Thread(AcceptSockets); - acceptThread.Start(); - state = "Host"; - Console.WriteLine("Start Accept"); + try + { + Init(IpAddress); + socket.Bind(endPoint); + socket.Listen(4); + Thread acceptThread = new Thread(AcceptSockets); + acceptThread.Start(); + state = "Host"; + } + catch { } } public void ClientInit(string IpAddress) { - Init(IpAddress); - socket.Connect(endPoint); - state = "Client"; - Thread.Sleep(10); - Thread ReceivingThread = new Thread(ReceiveMsgFromHost); - ReceivingThread.Start(); + try + { + Init(IpAddress); + socket.Connect(endPoint); + state = "Client"; + Thread.Sleep(10); + Thread ReceivingThread = new Thread(ReceiveMsgFromHost); + ReceivingThread.Start(); + } + catch { } } public void SendMsg(NetworkTask networkTask) { @@ -75,45 +93,61 @@ namespace DangerousD.GameCore.Network int count = Data.Length; if (state == "Host") { - foreach (Socket socket in clientSockets) + try + { + foreach (Socket socket in clientSockets) + { + socket.Send(BitConverter.GetBytes(count)); + socket.Send(Data); + } + } + catch { } + } + else + { + try { socket.Send(BitConverter.GetBytes(count)); socket.Send(Data); } - } - else - { - socket.Send(BitConverter.GetBytes(count)); - socket.Send(Data); + catch { } } } private void ReceiveMsgFromHost() { while (true) { - byte[] bytesCount = new byte[4]; - socket.Receive(bytesCount); - byte[] Data = new byte[BitConverter.ToInt32(bytesCount)]; - StateObject so = new StateObject(socket, Data); - IAsyncResult count = socket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so); + try + { + byte[] bytesCount = new byte[4]; + socket.Receive(bytesCount); + byte[] Data = new byte[BitConverter.ToInt32(bytesCount)]; + StateObject so = new StateObject(socket, Data); + IAsyncResult count = socket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, AsyncReceiveCallback, so); + } + catch { } } } private void AsyncReceiveCallback(IAsyncResult ar) { - StateObject so = ar.AsyncState as StateObject; - Socket clientSocket = so.workSocket; - int readCount = clientSocket.EndReceive(ar); - so.UploadedBytesCount += readCount; - so.sb.Append(Encoding.Unicode.GetString(so.buffer, 0, readCount)); - if (so.UploadedBytesCount < so.bufferSize) + try { - clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, new AsyncCallback(AsyncReceiveCallback), so); - } - else - { - GetReceivingMessages(JsonConvert.DeserializeObject(so.sb.ToString())); + StateObject so = ar.AsyncState as StateObject; + Socket clientSocket = so.workSocket; + int readCount = clientSocket.EndReceive(ar); + so.UploadedBytesCount += readCount; + so.sb.Append(Encoding.Unicode.GetString(so.buffer, 0, readCount)); + if (so.UploadedBytesCount < so.bufferSize) + { + clientSocket.BeginReceive(so.buffer, 0, so.bufferSize, SocketFlags.None, new AsyncCallback(AsyncReceiveCallback), so); + } + else + { + GetReceivingMessages(JsonConvert.DeserializeObject(so.sb.ToString())); + } } + catch { } } } } From 6b40bbe8819f6cb9be8242657d9f32ad0b6c78c7 Mon Sep 17 00:00:00 2001 From: SergoDobro Date: Thu, 17 Aug 2023 13:14:14 +0300 Subject: [PATCH 9/9] fixes --- DangerousD/GameCore/Managers/AppManager.cs | 2 ++ DangerousD/GameCore/Network/NetworkManager.cs | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 02790a7..1261b82 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -176,6 +176,8 @@ namespace DangerousD.GameCore public void NetworkSync(NetworkTask networkTask) { + //TODO + return; switch (networkTask.operation) { case NetworkTaskOperationEnum.TakeDamage: diff --git a/DangerousD/GameCore/Network/NetworkManager.cs b/DangerousD/GameCore/Network/NetworkManager.cs index 2cc93ae..bac781f 100644 --- a/DangerousD/GameCore/Network/NetworkManager.cs +++ b/DangerousD/GameCore/Network/NetworkManager.cs @@ -88,7 +88,9 @@ namespace DangerousD.GameCore.Network catch { } } public void SendMsg(NetworkTask networkTask) - { + { + //TODO + return; byte[] Data = Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(networkTask)); int count = Data.Length; if (state == "Host")