From 0a9b55800da309adcab7a12ebc5f927258c840d0 Mon Sep 17 00:00:00 2001 From: Ivan Filipenkov Date: Fri, 18 Aug 2023 00:20:43 +0300 Subject: [PATCH 01/33] fix menu font --- DangerousD/Content/Content.mgcb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/DangerousD/Content/Content.mgcb b/DangerousD/Content/Content.mgcb index dbbe74b..3c483a8 100644 --- a/DangerousD/Content/Content.mgcb +++ b/DangerousD/Content/Content.mgcb @@ -14,7 +14,14 @@ #---------------------------------- Content ---------------------------------# -#begin MonstersAnimations.png +#begin ButtonFont.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:PremultiplyAlpha=True +/processorParam:TextureFormat=Compressed +/build:ButtonFont.spritefont + +#begin checkboxs_off-on.png /importer:TextureImporter /processor:TextureProcessor /processorParam:ColorKeyColor=255,0,255,255 From 3962ce4eac48e626a5bff040bf1358ff81acec7a Mon Sep 17 00:00:00 2001 From: N4K Date: Fri, 18 Aug 2023 00:25:34 +0300 Subject: [PATCH 02/33] spider changes --- DangerousD/Content/MonstersAnimations.png | Bin 24512 -> 22755 bytes DangerousD/Content/map.tmx | 70 +++++++++++++ DangerousD/GameCore/GUI/AbstractGui.cs | 1 - .../LivingEntities/Monsters/Frank.cs | 1 - .../LivingEntities/Monsters/FrankBalls.cs | 1 - .../LivingEntities/Monsters/SilasMaster.cs | 1 - .../LivingEntities/Monsters/Slime.cs | 1 - .../LivingEntities/Monsters/Spider.cs | 99 +++++++++++------- .../LivingEntities/Monsters/Zombie.cs | 11 +- .../LivingEntities/Player/Player.cs | 2 +- .../GameCore/GameObjects/LivingEntity.cs | 2 - DangerousD/GameCore/Managers/AppManager.cs | 2 +- DangerousD/GameCore/Managers/MapManager.cs | 4 +- 13 files changed, 142 insertions(+), 53 deletions(-) create mode 100644 DangerousD/Content/map.tmx diff --git a/DangerousD/Content/MonstersAnimations.png b/DangerousD/Content/MonstersAnimations.png index 5bc9cca18eb4374fd97ab3947e66960f0ff6a4b8..97e3e11eeb67a0487bf48c7ec6826544f5a1b37c 100644 GIT binary patch literal 22755 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 Ns48hH*2$Yk{2ziwLbw0` diff --git a/DangerousD/Content/map.tmx b/DangerousD/Content/map.tmx new file mode 100644 index 0000000..3836987 --- /dev/null +++ b/DangerousD/Content/map.tmx @@ -0,0 +1,70 @@ + + + + + + +294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294 + + +294,294,294,294,294,321,321,321,321,321,321,321,321,321,321,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,321,321,321,321,321,321,321,321,321,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321, +294,294,294,294,321,321,321,321,321,321,321,321,321,321,321,321 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DangerousD/GameCore/GUI/AbstractGui.cs b/DangerousD/GameCore/GUI/AbstractGui.cs index 7f7b212..7248313 100644 --- a/DangerousD/GameCore/GUI/AbstractGui.cs +++ b/DangerousD/GameCore/GUI/AbstractGui.cs @@ -20,7 +20,6 @@ public abstract class AbstractGui : IDrawableObject public virtual void Initialize() { Manager.Initialize(AppManager.Instance.GraphicsDevice); - this.graphicsDevice = graphicsDevice; CreateUI(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs index 8ecddcd..eab15a4 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs @@ -15,7 +15,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public Frank(Vector2 position) : base(position) { isGoRight = false; - Width = 112; Height = 160; leftBoarder = 50; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs index bc28f6b..20756b7 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs @@ -14,7 +14,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { private Rectangle collision; private Vector2 position; - private int healthBall; private bool isFlyRight = true; private bool isAttacking = false; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 5dc8df2..852eab3 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -16,7 +16,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters private int attackTime = 60; private int moveTime = 360; private int currentTime = 0; - private bool isGoRight = true; int leftBorder; int rightBorder; List hands = new List(); diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs index 0e5e954..9b59f62 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs @@ -12,7 +12,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Slime : CoreEnemy { - private bool isGoRight = true; private bool isDown = false; int leftBorder; int rightBorder; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs index 0d797aa..dd60669 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs @@ -1,4 +1,5 @@ using DangerousD.GameCore.Graphics; +using DangerousD.GameCore.Managers; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; @@ -17,19 +18,23 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters protected int webLength; protected bool isDown; protected bool isDownUp; + protected PhysicsManager physicsManager; + protected Player player; public Spider(Vector2 position) : base(position) { + player = AppManager.Instance.GameManager.players[0]; isDownUp = true; isDown = true; + physicsManager = AppManager.Instance.GameManager.physicsManager; web = new SpiderWeb(Pos); name = "Spider"; Width = 112; Height = 24; delay = 0; webLength = 0; - monster_speed = 2; - acceleration = Vector2.Zero; + monster_speed = 3; + acceleration = new Vector2(0, -50); } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "SpiderMoveRight", "SpiderMoveLeft", "SpiderOnWeb" }, "SpiderMoveRight"); @@ -44,6 +49,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { Attack(gameTime); } + Target(); base.Update(gameTime); } @@ -59,45 +65,43 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters /// public override void Attack(GameTime gameTime) { //48 72 - if (isDownUp) + velocity.X = 0; + Width = 48; + Height = 72; + delay += (float)gameTime.ElapsedGameTime.TotalSeconds; + if (delay > 0.5 && webLength <= 4 && isDown) { - Width = 48; - Height = 72; - delay += (float)gameTime.ElapsedGameTime.TotalSeconds; - if (delay > 0.5 && webLength <= 4 && isDown) + StartCicycleAnimation("SpiderOnWeb"); + acceleration = Vector2.Zero; + webLength++; + _pos.Y += 25; + web.Height = webLength * 25; + web.SetPosition(new Vector2(_pos.X + Width / 2 - web.Width / 2 + 2, Pos.Y - 25 * webLength)); + delay = 0; + if (webLength == 4) { - StartCicycleAnimation("SpiderOnWeb"); - webLength++; - _pos.Y += 25; - web.Height = webLength * 25; - web.SetPosition(new Vector2(_pos.X + Width / 2 - web.Width / 2 + 2, Pos.Y - 25 * webLength)); - delay = 0; - if (webLength == 4) - { - isDown = false; - } - } - else if (delay > 0.5 && webLength != 0 && !isDown) - { - StartCicycleAnimation("SpiderOnWeb"); - webLength--; - _pos.Y -= 25; - web.Height = webLength * 25; - web.SetPosition(new Vector2(_pos.X + Width / 2 - web.Width / 2 + 2, Pos.Y - 25 * webLength)); - delay = 0; - if (webLength == 0) - { - isDown = true; - } - } - else - { - Width = 112; - Height = 24; + isDown = false; } } + else if (delay > 0.5 && webLength != 0 && !isDown) + { + StartCicycleAnimation("SpiderOnWeb"); + webLength--; + _pos.Y -= 25; + web.Height = webLength * 25; + web.SetPosition(new Vector2(_pos.X + Width / 2 - web.Width / 2 + 2, Pos.Y - 25 * webLength)); + delay = 0; + if (webLength == 0) + { + isDown = true; + } + } + if (webLength == 0) + { + isAttack = false; + } } - + //сделать условие с Артемом public override void Draw(SpriteBatch spriteBatch) { if (GraphicsComponent.GetCurrentAnimation == "SpiderOnWeb") @@ -118,6 +122,14 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Move(GameTime gameTime) { + Width = 112; + Height = 24; + + int wallCheck = physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 10, (int)Pos.Y, 150, 10)).Count; + if (wallCheck > 0) + { + isGoRight = !isGoRight; + } if (isGoRight) { if (GraphicsComponent.GetCurrentAnimation != "SpiderMoveRight") @@ -146,7 +158,20 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Target() { - throw new NotImplementedException(); + if (physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y, 300, 600), typeof(Player)) != null) + { + if (player.Pos.X - Pos.X <= 30) + { + isAttack = true; + } + } + if (physicsManager.CheckRectangle(new Rectangle((int)Pos.X-300, (int)Pos.Y, 300, 600), typeof(Player)) != null) + { + if (player.Pos.X - Pos.X <= 30) + { + isAttack = true; + } + } } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index f2dc98a..084bae9 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -111,29 +111,30 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } base.OnCollision(gameObject); } + public override void Target() { - if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 50, (int)Pos.Y, Width + 100, Height), typeof(Player)) != null) + if(AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X-50, (int)Pos.Y, Width+100, Height), typeof(Player))!=null) { - if (isGoRight && this._pos.X <= AppManager.Instance.GameManager.players[0].Pos.X) + if(isGoRight && this._pos.X <= AppManager.Instance.GameManager.players[0].Pos.X) { isTarget = true; leftBorder = Pos.X - 10; rightBorder = Pos.X + AppManager.Instance.GameManager.players[0].Pos.X; } - else if (!isGoRight && this._pos.X >= AppManager.Instance.GameManager.players[0].Pos.X) + else if(!isGoRight && this._pos.X >= AppManager.Instance.GameManager.players[0].Pos.X) { isTarget = true; rightBorder = Pos.X + 10; - leftBorder = AppManager.Instance.GameManager.players[0].Pos.X; + leftBorder = AppManager.Instance.GameManager.players[0].Pos.X; } } } + public override void Attack(GameTime gameTime) { throw new NotImplementedException(); } - } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 6e1af79..d7d84a8 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -49,7 +49,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public override void Update(GameTime gameTime) { GraphicsComponent.CameraPosition = (_pos-new Vector2(200, 350)).ToPoint(); - velocity.X = 0.5f; + velocity.X = 1; base.Update(gameTime); } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntity.cs b/DangerousD/GameCore/GameObjects/LivingEntity.cs index 5620568..e72b40b 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntity.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntity.cs @@ -5,8 +5,6 @@ namespace DangerousD.GameCore.GameObjects; public abstract class LivingEntity : Entity { private Vector2 targetPosition; - public Vector2 velocity; - public Vector2 acceleration; public LivingEntity(Vector2 position) : base(position) { acceleration = new Vector2(0, 30); diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 3379b3c..cbf4c84 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -165,7 +165,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("lvl"); + GameManager.mapManager.LoadLevel("map"); break; case GameState.GameOver: break; diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index 5d7d6fc..cf994b4 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -64,7 +64,7 @@ namespace DangerousD.GameCore.Managers { if (tiles[i] != 0) { - Vector2 pos = new(((chunkX+ i % chunkW) * tileSize.X + offsetX) * _scale, + Vector2 pos = new(((chunkX+ i % chunkW) * tileSize.X + offsetX) * _scale + 370, ((chunkY + i / chunkW) * tileSize.Y + offsetY) * _scale); //pos *= _scale; Rectangle sourceRect = new(new Point((tiles[i] -1) % _columns, (tiles[i] -1) / _columns) * tileSize.ToPoint(), tileSize.ToPoint()); @@ -106,7 +106,7 @@ namespace DangerousD.GameCore.Managers foreach (XmlNode entity in group.ChildNodes) { Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityType}"); - Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale); + Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX+280, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY - 200) * _scale); inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height)); inst.Height *= _scale; inst.Width *= _scale; From 2963ac6ac788d09599f99243a05630bb258d86a2 Mon Sep 17 00:00:00 2001 From: gravity Date: Fri, 18 Aug 2023 00:33:01 +0300 Subject: [PATCH 03/33] HUD --- DangerousD/Content/Content.mgcb | 47 ++++++++++------------ DangerousD/GameCore/Managers/AppManager.cs | 2 +- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/DangerousD/Content/Content.mgcb b/DangerousD/Content/Content.mgcb index dbbe74b..37d9842 100644 --- a/DangerousD/Content/Content.mgcb +++ b/DangerousD/Content/Content.mgcb @@ -14,7 +14,14 @@ #---------------------------------- Content ---------------------------------# -#begin MonstersAnimations.png +#begin ButtonFont.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:PremultiplyAlpha=True +/processorParam:TextureFormat=Compressed +/build:ButtonFont.spritefont + +#begin checkboxs_off-on.png /importer:TextureImporter /processor:TextureProcessor /processorParam:ColorKeyColor=255,0,255,255 @@ -180,6 +187,18 @@ /processorParam:TextureFormat=Color /build:PC_Computer_Dangerous_Dave_In_The_Haunted_Mansion_Death_Sequences.png +#begin playerAnimation.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:playerAnimation.png + #begin slider.png /importer:TextureImporter /processor:TextureProcessor @@ -252,19 +271,7 @@ /processorParam:TextureFormat=Color /build:textboxbackground6-1.png -#begin MonstersAnimations.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:MonstersAnimations.png - -#begin PC_Computer_Dangerous_Dave_In_The_Haunted_Mansion_Death_Sequences.png +#begin tiles.png /importer:TextureImporter /processor:TextureProcessor /processorParam:ColorKeyColor=255,0,255,255 @@ -276,18 +283,6 @@ /processorParam:TextureFormat=Color /build:tiles.png -#begin playerAnimation.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:playerAnimation.png - #begin wall.jpg /importer:TextureImporter /processor:TextureProcessor diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 0167d15..0b89e48 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -26,7 +26,7 @@ namespace DangerousD.GameCore public GameState gameState { get; private set; } public MultiPlayerStatus multiPlayerStatus { get; private set; } = MultiPlayerStatus.SinglePlayer; public Point resolution = new Point(1920, 1080); - public Point inGameResolution = new Point(1366, 768); + public Point inGameResolution = new Point(1920, 1080); IDrawableObject MenuGUI; IDrawableObject OptionsGUI; IDrawableObject LoginGUI; From ae6aff16a5ac0544ab70d85d57d810cc657a9fc6 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 00:34:36 +0300 Subject: [PATCH 04/33] Map format change --- DangerousD/Content/debug.tmx | 371 +++++++++++++++++++++ DangerousD/Content/lvl.tmx | 12 +- DangerousD/Content/tiles.BMP | Bin 0 -> 668982 bytes DangerousD/GameCore/Managers/AppManager.cs | 2 +- DangerousD/GameCore/Managers/MapManager.cs | 5 +- 5 files changed, 381 insertions(+), 9 deletions(-) create mode 100644 DangerousD/Content/debug.tmx create mode 100644 DangerousD/Content/tiles.BMP diff --git a/DangerousD/Content/debug.tmx b/DangerousD/Content/debug.tmx new file mode 100644 index 0000000..de462c2 --- /dev/null +++ b/DangerousD/Content/debug.tmx @@ -0,0 +1,371 @@ + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570 + + +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,50,50,50,50,50, +0,0,0,0,0,0,0,0,0,0,0,50,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,50,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,49,49,49,49,49, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +371,371,371,371,371,371,371,371,371,371,371,371,371,371,371,371, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +371,371,371,371,371,371,371,371,371,371,371,371,371,371,371,371, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0, +49,49,49,49,49,49,49,49,49,49,49,49,49,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370 + + +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +369,370,0,0,0,0,0,0,0,0,369,370,0,0,0,0, +382,383,0,0,0,0,0,0,0,0,382,383,0,0,0,0, +395,396,0,0,0,0,0,0,0,0,395,396,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,369,370,0,0,0,0,0,0,0,0,369,370, +0,0,0,0,382,383,0,0,0,0,0,0,0,0,382,383, +0,0,0,0,395,396,0,0,0,0,0,0,0,0,395,396, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DangerousD/Content/lvl.tmx b/DangerousD/Content/lvl.tmx index 271b1e5..d643830 100644 --- a/DangerousD/Content/lvl.tmx +++ b/DangerousD/Content/lvl.tmx @@ -1,7 +1,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -130,19 +130,19 @@ 0,0,0,0,0,0,0,0,0,0,13,75,0,0,0,0 -52,0,0,0,52,0,0,0,52,52,52,52,52,52,52,52, +52,0,0,0,0,0,0,0,52,52,52,52,52,52,52,52, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -52,52,0,0,52,0,0,52,52,52,52,52,52,52,52,52, +52,52,0,0,0,0,0,52,52,52,52,52,52,52,52,52, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -52,52,52,0,52,0,52,52,52,52,52,52,52,52,52,52, +52,52,52,0,0,0,52,52,52,52,52,52,52,52,52,52, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -311,7 +311,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -517,7 +517,7 @@ - + 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, diff --git a/DangerousD/Content/tiles.BMP b/DangerousD/Content/tiles.BMP new file mode 100644 index 0000000000000000000000000000000000000000..a9709a09d41fed0b00c3abe188c136694e915519 GIT binary patch literal 668982 zcmeFaOOh=+vMY9Erj|zVhVYu|=ng>r*Q)_(I5nI%pfbCH6C?uR`~+ita%bjVv{g(H z4hNkK&&WLceCq%GU;p+0{9pgX_%HnLf8u}t8~^*i|IdH^`9J>oA3zv2&IRXx|MSmF zKL1}Cz14qz#^(m?2GAk@`q#hyUB-X@^B;WeXON*;cIKzw>{35)dIRh?wj4UGA8fWy zzfEuO6S#8&dbtf-uD;puW%-K3%S}I{(`)cfEg$Xgzk$+9@iUZzeTCjj?MGSaB`*1s zlym<(;qSk}&k66`02-)U_+vWX(X8ZJ8yN%D+@eT0jCR>g#G~&dt zEkFG>zQhl^eFN;b+D=&5uXAN}Fo8zzH@yZ0T((`vNBCFV0GbHRwlik^hVJs=%?A8e zT;k`D+cz-mw;7pw$(L+7XNb28`3V1t8$eg2m)o$}py_*Qhxscm@pH)S8|eEjT5I$} zcBi{~&2}Ll;a_nB?2z<|>szjGq)q0pxWvyPw{O7PMqTIcHy1pBw+s0Q|B4%UpoLzQ zfcWcPmucE>p|oA7%jJK+O|G; z3WDD=pUT>WmqV4E({JhchcxiV{`{xa{s|mQY+8QZ!i)h1qtp^SHPaoREcnUv^LhCw zb=wW#G;s(WA@K88y+e2#7(q+VbYfAT5E zDO{O!&j8qoErgl-lfiw^;z;{f?Zar!yCr?0p3kct`FND=p5u~B)Gql&<<+e(-Odjv z6+@HR9H+SShv2-0yWv64qO9a%i|WkoIPS2X{fI{646Mrgs?<>Gh*Ild-nrn}|s**)-bj%FL&#w!ZOju-c1&EQ3<@-yI*t!J^sEmK2cR8%L7h- zW)-TqkkB+daI0ldGn?B+W!vbSqgy~>cg}pL(Ges8W(+L(r>{}U*}>hu1J-pJzzJBm zK)GAHhgVhJHd^_|g|Y=|Rjh3`7kNpEe%Py7{xD@ptp}+VR2GHkn27$mjAD^Se%@-Y)P?6C^K9w@#HlrbJf!{}y7Rffyyx4vNX`#+M)uXC&r zGk#AaMz!1k)bxZlkFV_juw%N1;<<5@ zs2L-ay-D&+%aT=dk&m*=eA#lb*ZOm}l2jO$tfxHHm{28VG#ddKV2rA~d{WN~qLA9; z7w13Uj#hCk_2&W%SbID*3i?aP%<%)IWS1#xmd9*qQGQg?#I3?wQd{bj;+w%aT|R42 zlB;LA%T>QoS1w1ptDaK4)xX|%D_WbMb;ay2Iv%@~6tOpcN(skNyN9t3QC{w?w$|_t zL0%uBeBbGj^HQ#}&X?2DYrmm9IuzcI0s>3T1=i`*tGfl%Z>umw<=m-UZM@%nCy?By zY3fhatt&bocDFWWS<7K-^cx0?ITifO7VF%0Ej;*RbGge%wU+bitge?g!^gzTcue(* zjtfC3o0NBHBJJ6hs)|o55*{Em7kDgds2*f}bzRh)t>5@-WVvVT6X$9_%TPA%mA=4OS$eE9NIv)ncxK{2fkrTE%NC;%)OXb3P<8s=pj%Qro7w`G&76abID z7Pphut0~Xs85|F^JoI=#^%pSsVH~dHv5q57j#KoJRvrO=#KaN(Q#OMh

  • 0Qq4REzA3!WMWwakHO6J>tor9&{DUtvp;|8X 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
  • A^wnL;UR@$x(55NE&1 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 IXR%@VfBL4of&c&j literal 0 HcmV?d00001 diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index a4a1063..e781ae1 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -188,7 +188,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("lvl"); + GameManager.mapManager.LoadLevel("debug"); break; case GameState.Death: break; diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index 5d7d6fc..b38ac9f 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -100,12 +100,13 @@ namespace DangerousD.GameCore.Managers private void InstantiateEntities(XmlNode group) { - string entityType = group.Attributes["class"].Value; + string entityGroup = group.Attributes["class"] is not null ? group.Attributes["class"].Value : ""; float offsetX = group.Attributes["offsetx"] is not null ? float.Parse(group.Attributes["offsetx"].Value) : 0; float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0; foreach (XmlNode entity in group.ChildNodes) { - Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityType}"); + string entityType = group.Attributes["type"] is not null ? "." + group.Attributes["type"].Value : ""; + Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityGroup}{entityType}"); Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale); inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height)); inst.Height *= _scale; From 2deaa74edecfde6d1af65456fab36503334c8877 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 01:05:36 +0300 Subject: [PATCH 05/33] Add debug level --- DangerousD/Content/debug.tmx | 12 +++++++----- DangerousD/GameCore/Managers/MapManager.cs | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/DangerousD/Content/debug.tmx b/DangerousD/Content/debug.tmx index de462c2..c24a642 100644 --- a/DangerousD/Content/debug.tmx +++ b/DangerousD/Content/debug.tmx @@ -1,5 +1,5 @@ - + @@ -77,6 +77,11 @@ + + + + + @@ -189,7 +194,7 @@ - + @@ -343,9 +348,6 @@ - - - diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index b38ac9f..cf209f4 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -105,7 +105,8 @@ namespace DangerousD.GameCore.Managers float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0; foreach (XmlNode entity in group.ChildNodes) { - string entityType = group.Attributes["type"] is not null ? "." + group.Attributes["type"].Value : ""; + Debug.WriteLine(entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : ""); + string entityType = entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : ""; Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityGroup}{entityType}"); Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale); inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height)); From dec773d29067f4c76421bf72e4faa439ea3ee1c9 Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Fri, 18 Aug 2023 01:06:16 +0300 Subject: [PATCH 06/33] CameraAndScaleFix --- .../GameObjects/Entities/SilasBall.cs | 16 +++++++++++++- .../LivingEntities/Player/Player.cs | 2 +- .../GameCore/Graphics/GraphicsComponent.cs | 21 +++++++++++++++++-- DangerousD/GameCore/Managers/AppManager.cs | 2 +- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs index b14d8af..1c11e0e 100644 --- a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs +++ b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs @@ -1,7 +1,9 @@ using DangerousD.GameCore.Graphics; using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; using System; using System.Collections.Generic; + using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,6 +12,7 @@ namespace DangerousD.GameCore.GameObjects.Entities { public class SilasBall : LivingEntity { + private bool IsVisibility=true; public SilasBall(Vector2 position) : base(position) { Height = 60; @@ -30,7 +33,18 @@ namespace DangerousD.GameCore.GameObjects.Entities public override void Update(GameTime gameTime) { base.Update(gameTime); - + if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(Rectangle).Count>0) + { + IsVisibility = false; + } + } + public override void Draw(SpriteBatch spriteBatch) + { + if (IsVisibility) + { + base.Draw(spriteBatch); + } + } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 39b1926..8249673 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -100,7 +100,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public override void Update(GameTime gameTime) { - GraphicsComponent.CameraPosition = (_pos-new Vector2(200, 350)).ToPoint(); + GraphicsComponent.SetCameraPosition(Pos); if (!isAttacked) { Move(gameTime); diff --git a/DangerousD/GameCore/Graphics/GraphicsComponent.cs b/DangerousD/GameCore/Graphics/GraphicsComponent.cs index e4546b5..f218ba6 100644 --- a/DangerousD/GameCore/Graphics/GraphicsComponent.cs +++ b/DangerousD/GameCore/Graphics/GraphicsComponent.cs @@ -16,6 +16,7 @@ namespace DangerousD.GameCore.Graphics private List textures; private List texturesNames; private AnimationContainer currentAnimation; + static private int scaling=3; public AnimationContainer CurrentAnimation { get @@ -167,6 +168,8 @@ namespace DangerousD.GameCore.Graphics destinationRectangle.X -= CameraPosition.X; destinationRectangle.Y -= CameraPosition.Y; + + destinationRectangle = Scaling(destinationRectangle); _spriteBatch.Draw(texture, destinationRectangle, sourceRectangle, Color.White); } @@ -191,10 +194,18 @@ namespace DangerousD.GameCore.Graphics destinationRectangle.X -= CameraPosition.X; destinationRectangle.Y -= CameraPosition.Y; + destinationRectangle = Scaling(destinationRectangle); _spriteBatch.Draw(texture, destinationRectangle, sourceRectangle, Color.White); } - + private Rectangle Scaling(Rectangle destinationRectangle) + { + destinationRectangle.X *= scaling; + destinationRectangle.Y *= scaling; + destinationRectangle.Width *= scaling; + destinationRectangle.Height *= scaling; + return destinationRectangle; + } private void buildSourceRectangle() { sourceRectangle = new Rectangle(); @@ -222,6 +233,12 @@ namespace DangerousD.GameCore.Graphics interval = lastInterval; } } - public static Point CameraPosition = new Point(0, 0); + public static void SetCameraPosition(Vector2 playerPosition) + { + CameraPosition=(playerPosition).ToPoint(); + CameraPosition.X -= 300; + CameraPosition.Y -= 200; + } + public static Point CameraPosition = new Point(-700, 300); } } diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 9c07648..488442f 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -26,7 +26,7 @@ namespace DangerousD.GameCore public GameState gameState { get; private set; } public MultiPlayerStatus multiPlayerStatus { get; private set; } = MultiPlayerStatus.SinglePlayer; public Point resolution = new Point(1920, 1080); - public Point inGameResolution = new Point(1366, 768); + public Point inGameResolution = new Point(1920, 1080); IDrawableObject MenuGUI; IDrawableObject OptionsGUI; IDrawableObject LoginGUI; From 925b03fd3aa83fee70cc1c5dd890092a8642ea9d Mon Sep 17 00:00:00 2001 From: MARKPRO44 <119742977+MARKPRO4444@users.noreply.github.com> Date: Fri, 18 Aug 2023 01:11:17 +0300 Subject: [PATCH 07/33] commit 000 --- .../GameObjects/LivingEntities/Monsters/CoreEnemy.cs | 7 +------ .../GameObjects/LivingEntities/Monsters/FlameSkull.cs | 11 +++-------- .../GameObjects/LivingEntities/Monsters/Frank.cs | 6 ++++-- .../GameObjects/LivingEntities/Monsters/FrankBalls.cs | 4 ++-- .../GameObjects/LivingEntities/Monsters/Ghost.cs | 7 +++++-- .../GameObjects/LivingEntities/Monsters/Hunchman.cs | 4 ++-- .../LivingEntities/Monsters/HunchmanDagger.cs | 4 ++-- .../GameObjects/LivingEntities/Monsters/SilasHands.cs | 4 ++-- .../LivingEntities/Monsters/SilasMaster.cs | 4 ++-- .../GameObjects/LivingEntities/Monsters/Slime.cs | 4 ++-- .../GameObjects/LivingEntities/Monsters/Spider.cs | 7 +++++-- .../GameObjects/LivingEntities/Monsters/SpiderWeb.cs | 4 ++-- .../GameObjects/LivingEntities/Monsters/Werewolf.cs | 7 +++++-- .../GameObjects/LivingEntities/Monsters/Zombie.cs | 7 +++++-- 14 files changed, 42 insertions(+), 38 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs index 22ea566..06fed0f 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs @@ -13,11 +13,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public abstract class CoreEnemy : LivingEntity { protected int monster_health; - protected float monster_speed = 2; + protected int monster_speed; protected string name; protected bool isAlive = true; - protected bool isAttack = false; - protected bool isGoRight; protected int leftBoarder = 0; protected int rightBoarder = 700; @@ -33,7 +31,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public abstract void Death(); public abstract void Attack(); - public abstract void Attack(GameTime gameTime); public abstract void Move(GameTime gameTime); @@ -46,7 +43,5 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities isAlive = false; } } - - public abstract void Target(); } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs index f7591ac..b4f3ec7 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs @@ -12,6 +12,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class FlameSkull : CoreEnemy { + private bool isGoRight; + private bool isAttack; + public FlameSkull(Vector2 position) : base(position) { Width = 62; @@ -71,14 +74,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) - { - } - - public override void Target() - { - throw new NotImplementedException(); - } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs index 8ecddcd..fd25246 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs @@ -12,6 +12,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { internal class Frank : CoreEnemy { + private bool isGoRight; + public Frank(Vector2 position) : base(position) { isGoRight = false; @@ -70,12 +72,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs index bc28f6b..4c37e6a 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs @@ -82,12 +82,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs index 6236554..3df9012 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs @@ -10,6 +10,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Ghost : CoreEnemy { + private bool isGoRight; + private bool isAttack; + public Ghost(Vector2 position) : base(position) { isGoRight = true; @@ -76,12 +79,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs index ba342ec..d804512 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs @@ -81,7 +81,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } @@ -129,7 +129,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters Debug.WriteLine("Collision"); } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs index 9cd2b4f..9c2415b 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs @@ -27,7 +27,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } @@ -42,7 +42,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs index 16c06e1..ed4dfcb 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs @@ -30,7 +30,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } @@ -61,7 +61,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 5dc8df2..66f9527 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -72,7 +72,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } @@ -113,7 +113,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs index 0e5e954..1cdf9bb 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs @@ -233,12 +233,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters base.Update(gameTime); } - public override void Target() + public void Target() { } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs index 0d797aa..93f3ef4 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs @@ -12,6 +12,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Spider : CoreEnemy { + private bool isGoRight; + private bool isAttack; + protected SpiderWeb web; protected float delay; protected int webLength; @@ -57,7 +60,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters /// Атака паука РАБОЧАЯ /// /// - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { //48 72 if (isDownUp) { @@ -144,7 +147,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs index cde2ab0..8bd0af1 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs @@ -28,7 +28,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } @@ -43,7 +43,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs index 2d9ebae..c5f1b8c 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs @@ -12,6 +12,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Werewolf : CoreEnemy { + private bool isGoRight; + private bool isAttack; + public Werewolf(Vector2 position) : base(position) { name = "Wolf"; @@ -70,11 +73,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) { } - public override void Target() + public void Target() { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index 4ab4494..06c41a1 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -13,6 +13,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Zombie : CoreEnemy { + private bool isGoRight; + private bool isAttack; + float leftBorder; float rightBorder; bool isAttaking = false; @@ -118,7 +121,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } base.OnCollision(gameObject); } - public override void Target() + public void Target() { if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 50, (int)Pos.Y, Width + 100, Height), typeof(Player)).Count > 0) { @@ -149,7 +152,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public override void Attack(GameTime gameTime) + public void Attack(GameTime gameTime) {} } } From 424583837a4458606e3eb3e5d8bd19ff989b5cb3 Mon Sep 17 00:00:00 2001 From: AnloGames <7383an@gmail.com> Date: Fri, 18 Aug 2023 01:20:35 +0300 Subject: [PATCH 08/33] Pre 3 player support --- .../GameObjects/LivingEntities/Player/Player.cs | 12 +++++++----- DangerousD/GameCore/Managers/AppManager.cs | 12 +++++++++--- DangerousD/GameCore/Managers/GameManager.cs | 5 ++--- DangerousD/GameCore/Managers/MapManager.cs | 12 +++++++++++- DangerousD/GameCore/Managers/PhysicsManager.cs | 6 +++--- DangerousD/GameCore/Network/NetworkManager.cs | 13 +++++++++---- 6 files changed, 41 insertions(+), 19 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 03c24b6..5149e24 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -27,15 +27,17 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities private bool isAttacked = false; public GameObject objectAttack; - public Player(Vector2 position) : base(position) + public Player(Vector2 position, bool isNetworkPlayer = false) : base(position) { Width = 16; Height = 32; - AppManager.Instance.InputManager.ShootEvent += Shoot; - - AppManager.Instance.InputManager.MovEventJump += Jump; - AppManager.Instance.InputManager.MovEventDown += MoveDown; + if (!isNetworkPlayer) + { + AppManager.Instance.InputManager.ShootEvent += Shoot; + AppManager.Instance.InputManager.MovEventJump += Jump; + AppManager.Instance.InputManager.MovEventDown += MoveDown; + } velocity = new Vector2(0, 0); rightBorder = (int)position.X + 100; diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 5e53677..49187a0 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -231,16 +231,22 @@ namespace DangerousD.GameCore case NetworkTaskOperationEnum.ChangeState: break; case NetworkTaskOperationEnum.ConnectToHost: - Player connectedPlayer = new Player(Vector2.Zero); + Player connectedPlayer = new Player(Vector2.Zero, true); NetworkTasks.Add(new NetworkTask(connectedPlayer.id)); NetworkTask task = new NetworkTask(); - NetworkTasks.Add(task.AddConnectedPlayer(GameManager.GetPlayer1.id, GameManager.GetPlayer1.Pos)); + foreach (Player player in GameManager.players) + { + if (player.id != connectedPlayer.id) + { + NetworkTasks.Add(task.AddConnectedPlayer(player.id, player.Pos)); + } + } break; case NetworkTaskOperationEnum.GetClientPlayerId: GameManager.GetPlayer1.id = networkTask.objId; break; case NetworkTaskOperationEnum.AddConnectedPlayer: - Player remoteConnectedPlayer = new Player(networkTask.position); + Player remoteConnectedPlayer = new Player(networkTask.position, true); remoteConnectedPlayer.id = networkTask.objId; GameManager.players.Add(remoteConnectedPlayer); break; diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 7e4851a..d4363d5 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -99,7 +99,8 @@ namespace DangerousD.GameCore public void Update(GameTime gameTime) { - AppManager.Instance.DebugHUD.Set("playerId: ", GetPlayer1.id.ToString()); + Player p = players.Find(x => x.id == 16); + if (p != null) AppManager.Instance.DebugHUD.Set("NextPlayerVelocity: ", p.velocity.ToString()); if (AppManager.Instance.NetworkTasks.Count > 0) { AppManager.Instance.NetworkManager.SendMsg(AppManager.Instance.NetworkTasks.ToList()); @@ -117,7 +118,6 @@ namespace DangerousD.GameCore { livingEntitiesWithoutPlayers[i].Update(gameTime); } - GetPlayer1.Update(gameTime); } else { @@ -125,7 +125,6 @@ namespace DangerousD.GameCore { livingEntitiesWithoutPlayers[i].PlayAnimation(); } - GetPlayer1.Update(gameTime); } GetPlayer1.Update(gameTime); foreach (var item in otherObjects) diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index 5d7d6fc..3367a2f 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -9,6 +9,7 @@ using Microsoft.Xna.Framework.Graphics; using System.Xml.Serialization; using DangerousD.GameCore.GameObjects; using System.Globalization; +using DangerousD.GameCore.GameObjects.LivingEntities; namespace DangerousD.GameCore.Managers { @@ -106,7 +107,16 @@ namespace DangerousD.GameCore.Managers foreach (XmlNode entity in group.ChildNodes) { Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityType}"); - Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale); + Vector2 vector = new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY); + Entity inst; + if (type.Equals(typeof(Player))) + { + inst = (Entity)Activator.CreateInstance(type, vector * _scale, false); + } + else + { + inst = (Entity)Activator.CreateInstance(type, vector * _scale); + } inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height)); inst.Height *= _scale; inst.Width *= _scale; diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 7899c98..95bb8a1 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -21,9 +21,9 @@ namespace DangerousD.GameCore.Managers item.velocity = item.velocity + item.acceleration * delta; } - CheckCollisionsLE_MO(livingEntities, mapObjects); - CheckCollisionsE_LE(entities, livingEntities); - CheckCollisionsLE_LE(livingEntities); + CheckCollisionsLE_MO(livingEntities.ToList(), mapObjects); + CheckCollisionsE_LE(entities, livingEntities.ToList()); + CheckCollisionsLE_LE(livingEntities.ToList()); //entities dont move //Living entities dont move diff --git a/DangerousD/GameCore/Network/NetworkManager.cs b/DangerousD/GameCore/Network/NetworkManager.cs index 292e210..2d6bfc5 100644 --- a/DangerousD/GameCore/Network/NetworkManager.cs +++ b/DangerousD/GameCore/Network/NetworkManager.cs @@ -91,7 +91,7 @@ namespace DangerousD.GameCore.Network } catch { } } - public void SendMsg(List networkTask) + public void SendMsg(List networkTask, Socket ignoreSocket = null) { byte[] Data = Encoding.Unicode.GetBytes(JsonConvert.SerializeObject(networkTask)); int count = Data.Length; @@ -101,8 +101,11 @@ namespace DangerousD.GameCore.Network { foreach (Socket socket in clientSockets) { - socket.Send(BitConverter.GetBytes(count)); - socket.Send(Data); + if (!(socket == ignoreSocket)) + { + socket.Send(BitConverter.GetBytes(count)); + socket.Send(Data); + } } } catch { } @@ -148,7 +151,9 @@ namespace DangerousD.GameCore.Network } else { - GetReceivingMessages(JsonConvert.DeserializeObject>(so.sb.ToString())); + List tasks = JsonConvert.DeserializeObject>(so.sb.ToString()); + //SendMsg(tasks, clientSocket); + GetReceivingMessages(tasks); } } catch { } From b9f0740c17b03b98a043f9e8801195c257f9196b Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 01:29:21 +0300 Subject: [PATCH 09/33] Add map god mode --- DangerousD/Content/debug.tmx | 12 +++---- .../LivingEntities/Player/Player.cs | 6 ++-- DangerousD/GameCore/Managers/MapManager.cs | 31 +++++++++---------- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/DangerousD/Content/debug.tmx b/DangerousD/Content/debug.tmx index c24a642..f52dbe7 100644 --- a/DangerousD/Content/debug.tmx +++ b/DangerousD/Content/debug.tmx @@ -1,5 +1,5 @@ - + @@ -77,11 +77,6 @@ - - - - - @@ -194,6 +189,11 @@ + + + + + diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 03c24b6..43e191f 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -25,9 +25,10 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public int leftBorder; public bool isVisible = true; private bool isAttacked = false; + public bool isInvincible; public GameObject objectAttack; - public Player(Vector2 position) : base(position) + public Player(Vector2 position, bool isInvincible = false) : base(position) { Width = 16; Height = 32; @@ -40,6 +41,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities velocity = new Vector2(0, 0); rightBorder = (int)position.X + 100; leftBorder = (int)position.X - 100; + this.isInvincible = isInvincible; } @@ -98,7 +100,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public override void Update(GameTime gameTime) { GraphicsComponent.CameraPosition = (_pos-new Vector2(200, 350)).ToPoint(); - if (!isAttacked) + if (!isAttacked || isInvincible) { Move(gameTime); } diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index cf209f4..a8e1239 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -9,6 +9,7 @@ using Microsoft.Xna.Framework.Graphics; using System.Xml.Serialization; using DangerousD.GameCore.GameObjects; using System.Globalization; +using DangerousD.GameCore.GameObjects.LivingEntities; namespace DangerousD.GameCore.Managers { @@ -70,22 +71,8 @@ namespace DangerousD.GameCore.Managers Rectangle sourceRect = new(new Point((tiles[i] -1) % _columns, (tiles[i] -1) / _columns) * tileSize.ToPoint(), tileSize.ToPoint()); Type type = Type.GetType($"DangerousD.GameCore.GameObjects.MapObjects.{tileType}"); Activator.CreateInstance(type, pos, tileSize * _scale, sourceRect); - - /*switch (tileType) - { - case "collidable": - new StopTile(pos, tileSize * _scale, sourceRect); - break; - case "platform": - new Platform(pos, tileSize * _scale, sourceRect); - break; - case "non_collidable": - new Tile(pos, tileSize * _scale, sourceRect); - break; - }*/ - } - } + } } } @@ -105,10 +92,20 @@ namespace DangerousD.GameCore.Managers float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0; foreach (XmlNode entity in group.ChildNodes) { - Debug.WriteLine(entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : ""); string entityType = entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : ""; Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityGroup}{entityType}"); - Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale); + Vector2 pos = + new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, + float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale; + Entity inst; + if (type.Equals(typeof(Player)) && entity.Attributes["name"].Value == "DEBUGUS") + { + inst = (Entity)Activator.CreateInstance(type, pos, true); + } + else + { + inst = (Entity)Activator.CreateInstance(type, pos); + } inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height)); inst.Height *= _scale; inst.Width *= _scale; From 9c9b2b035e46f4cf7db443cfba7ae793b9c4a70d Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 01:36:16 +0300 Subject: [PATCH 10/33] Main map convert to new format --- DangerousD/Content/lvl.tmx | 10 +++++----- .../GameObjects/LivingEntities/Monsters/SilasHands.cs | 2 +- .../GameObjects/LivingEntities/Player/Player.cs | 11 +++++++---- DangerousD/GameCore/Managers/AppManager.cs | 2 +- DangerousD/GameCore/Managers/MapManager.cs | 2 +- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/DangerousD/Content/lvl.tmx b/DangerousD/Content/lvl.tmx index d643830..5377e12 100644 --- a/DangerousD/Content/lvl.tmx +++ b/DangerousD/Content/lvl.tmx @@ -1,7 +1,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -311,7 +311,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -441,7 +441,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -517,7 +517,7 @@ - + 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, @@ -701,7 +701,7 @@ - + diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs index 16c06e1..a250868 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs @@ -1,4 +1,4 @@ -using DangerousD.GameCore.Graphics; + using DangerousD.GameCore.Graphics; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 43e191f..4e0b0cc 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -25,10 +25,10 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public int leftBorder; public bool isVisible = true; private bool isAttacked = false; - public bool isInvincible; + public bool isInvincible = false; public GameObject objectAttack; - public Player(Vector2 position, bool isInvincible = false) : base(position) + public Player(Vector2 position) : base(position) { Width = 16; Height = 32; @@ -41,8 +41,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities velocity = new Vector2(0, 0); rightBorder = (int)position.X + 100; leftBorder = (int)position.X - 100; - this.isInvincible = isInvincible; + } + public Player(Vector2 position, bool isInvincible = false) : this(position) + { + this.isInvincible = isInvincible; } public bool IsAlive { get { return isAlive; } } @@ -127,7 +130,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities if (GraphicsComponent.GetCurrentAnimation != "playerMoveLeft") { GraphicsComponent.StartAnimation("playerMoveLeft"); - } + } } else if(AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит { diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index cd8bfe4..5e53677 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -202,7 +202,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("debug"); + GameManager.mapManager.LoadLevel("lvl"); break; case GameState.Death: break; diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index a8e1239..fd23e3c 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -98,7 +98,7 @@ namespace DangerousD.GameCore.Managers new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY) * _scale; Entity inst; - if (type.Equals(typeof(Player)) && entity.Attributes["name"].Value == "DEBUGUS") + if (type.Equals(typeof(Player)) && entity.Attributes["name"] is not null && entity.Attributes["name"].Value == "DEBUGUS") { inst = (Entity)Activator.CreateInstance(type, pos, true); } From 24919cf07f26336c8929c68db80a890ce855e719 Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 01:44:29 +0300 Subject: [PATCH 11/33] player can shoot --- DangerousD/Content/animation1.png | Bin 0 -> 39961 bytes DangerousD/Content/animations/playerReload | 1 + DangerousD/Content/animations/playerShootLeft | 1 + .../Content/animations/playerShootRight | 1 + .../LivingEntities/Monsters/Zombie.cs | 17 ++- .../LivingEntities/Player/Player.cs | 103 +++++++++++++++--- 6 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 DangerousD/Content/animation1.png create mode 100644 DangerousD/Content/animations/playerReload create mode 100644 DangerousD/Content/animations/playerShootLeft create mode 100644 DangerousD/Content/animations/playerShootRight diff --git a/DangerousD/Content/animation1.png b/DangerousD/Content/animation1.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc21578051879474ccecca9bd1ad8082331373e GIT binary patch literal 39961 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

    $9%q07X|K^A0boh2(Fyy`btyMs@XS{ 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 MtR1W{mNygs4@|oGiU0rr literal 0 HcmV?d00001 diff --git a/DangerousD/Content/animations/playerReload b/DangerousD/Content/animations/playerReload new file mode 100644 index 0000000..2dd0586 --- /dev/null +++ b/DangerousD/Content/animations/playerReload @@ -0,0 +1 @@ +{"id":"playerReload","textureName":"playerAnimation","startSpriteRectangle":{"X":101,"Y":67,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/playerShootLeft b/DangerousD/Content/animations/playerShootLeft new file mode 100644 index 0000000..f2b9f3b --- /dev/null +++ b/DangerousD/Content/animations/playerShootLeft @@ -0,0 +1 @@ +{"id":"playerShootLeft","textureName":"playerAnimation","startSpriteRectangle":{"X":201,"Y":34,"Width":32,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"4, 0"} diff --git a/DangerousD/Content/animations/playerShootRight b/DangerousD/Content/animations/playerShootRight new file mode 100644 index 0000000..922862b --- /dev/null +++ b/DangerousD/Content/animations/playerShootRight @@ -0,0 +1 @@ +{"id":"playerShootRight","textureName":"playerAnimation","startSpriteRectangle":{"X":201,"Y":1,"Width":32,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"4, 0"} diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index 4ab4494..02fa96d 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -24,8 +24,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters Height = 40; monster_speed = 3; name = "Zombie"; - leftBorder = (int)position.X - 50; - rightBorder = (int)position.X + 50; + monster_health = 2; + leftBorder = (int)position.X - 100; + rightBorder = (int)position.X + 100; physicsManager = new PhysicsManager(); Random random = new Random(); if(random.Next(0, 2) == 0) @@ -74,7 +75,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Death() { - + AppManager.Instance.GameManager.Remove(this); } public override void Move(GameTime gameTime) @@ -151,5 +152,15 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Attack(GameTime gameTime) {} + + public void TakeDamage() + { + monster_health--; + GraphicsComponent.StartAnimation("ZombieRightAttack"); + if (monster_health <= 0) + { + Death(); + } + } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 39b1926..2071350 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using DangerousD.GameCore.GameObjects.PlayerDeath; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; +using DangerousD.GameCore.GameObjects.LivingEntities.Monsters; namespace DangerousD.GameCore.GameObjects.LivingEntities { @@ -24,7 +25,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public int leftBorder; public bool isVisible = true; private bool isAttacked = false; + private bool isShooting = false; public GameObject objectAttack; + private int bullets; public Player(Vector2 position) : base(position) { @@ -35,17 +38,30 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities AppManager.Instance.InputManager.MovEventJump += Jump; AppManager.Instance.InputManager.MovEventDown += MoveDown; + AppManager.Instance.InputManager.ShootEvent += Shoot; velocity = new Vector2(0, 0); rightBorder = (int)position.X + 100; leftBorder = (int)position.X - 100; + bullets = 5; + this.GraphicsComponent.actionOfAnimationEnd += (a) => + { + if (a == "playerShootLeft" || a == "playerShootRight") + { + isShooting = false; + } + if (a == "playerReload") + { + bullets++; + } + }; } public bool IsAlive { get { return isAlive; } } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "playerMoveLeft", "playerMoveRight", "DeathFromZombie", "playerRightStay", "playerStayLeft", - "playerJumpRight" , "playerJumpLeft"}, "playerStayLeft"); + "playerJumpRight" , "playerJumpLeft", "playerShootLeft", "playerShootRight", "playerReload"}, "playerReload"); public void Attack() { @@ -53,6 +69,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities { isVisible = false; } + } public override void OnCollision(GameObject gameObject) { @@ -95,9 +112,47 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void Shoot() { - + if (bullets > 0) + { + if (!isShooting) + { + isShooting = true; + bullets--; + if (isRight) + { + if (GraphicsComponent.GetCurrentAnimation != "playerShootRight") + { + GraphicsComponent.StartAnimation("playerShootRight"); + } + var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), 100, 10), typeof(Zombie)); + if (targets != null) + { + foreach (var target in targets) + { + Zombie targetZombie = (Zombie)target; + targetZombie.TakeDamage(); + } + } + } + else + { + if (GraphicsComponent.GetCurrentAnimation != "playerShootRight") + { + GraphicsComponent.StartAnimation("playerShootRight"); + } + var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), -100, 10), typeof(Zombie)); + if (targets != null) + { + foreach (var target in targets) + { + Zombie targetZombie = (Zombie)target; + targetZombie.TakeDamage(); + } + } + } + } + } } - public override void Update(GameTime gameTime) { GraphicsComponent.CameraPosition = (_pos-new Vector2(200, 350)).ToPoint(); @@ -116,25 +171,41 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities { float delta = (float)gameTime.ElapsedGameTime.TotalSeconds; velocity.X = 5 * AppManager.Instance.InputManager.VectorMovementDirection.X; - if (AppManager.Instance.InputManager.VectorMovementDirection.X > 0) + if (GraphicsComponent.GetCurrentAnimation != "playerShootLeft" && GraphicsComponent.GetCurrentAnimation != "playerShootRight") { - if (GraphicsComponent.GetCurrentAnimation != "playerMoveRight")//идёт направо + if (AppManager.Instance.InputManager.VectorMovementDirection.X > 0) { - GraphicsComponent.StartAnimation("playerMoveRight"); + isRight = true; + if (GraphicsComponent.GetCurrentAnimation != "playerMoveRight")//идёт направо + { + GraphicsComponent.StartAnimation("playerMoveRight"); + } } - } - else if (AppManager.Instance.InputManager.VectorMovementDirection.X < 0)//идёт налево - { - if (GraphicsComponent.GetCurrentAnimation != "playerMoveLeft") + else if (AppManager.Instance.InputManager.VectorMovementDirection.X < 0)//идёт налево { - GraphicsComponent.StartAnimation("playerMoveLeft"); + isRight = false; + if (GraphicsComponent.GetCurrentAnimation != "playerMoveLeft") + { + GraphicsComponent.StartAnimation("playerMoveLeft"); + } } - } - else if(AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит - { - if (GraphicsComponent.GetCurrentAnimation != "ZombieMoveLeft") + else if (AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит { - GraphicsComponent.StartAnimation("ZombieMoveLeft"); + if(bullets < 5) + { + if (GraphicsComponent.GetCurrentAnimation != "playerReload") + { + GraphicsComponent.StartAnimation("playerReload"); + } + } + else if (isRight) + { + GraphicsComponent.StartAnimation("playerRightStay"); + } + else if (!isRight) + { + GraphicsComponent.StartAnimation("playerStayLeft"); + } } } } From d4b29d72033383a9eaa05ad83cf3e06345899888 Mon Sep 17 00:00:00 2001 From: Ivan Filipenkov Date: Fri, 18 Aug 2023 01:52:31 +0300 Subject: [PATCH 12/33] GameManager.Remove --- DangerousD/GameCore/Managers/GameManager.cs | 30 +++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 7e4851a..75dba06 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -83,6 +83,36 @@ namespace DangerousD.GameCore otherObjects.Add(gameObject); } } + + public void Remove(GameObject gameObject) + { + GetAllGameObjects.Remove(gameObject); + if (gameObject is Player objPl) + { + livingEntities.Remove(gameObject as LivingEntity); + players.Remove(objPl); + } + else if (gameObject is LivingEntity objLE) + { + livingEntities.Remove(objLE); + } + else if (gameObject is Entity objE) + { + entities.Remove(objE); + } + else if (gameObject is MapObject obj) + { + if (obj.IsColliderOn) + mapObjects.Remove(obj); + else + BackgroundObjects.Remove(obj); + } + else + { + otherObjects.Remove(gameObject); + } + } + public void Draw(SpriteBatch _spriteBatch) { foreach (var item in BackgroundObjects) From 52b404c9db441dfe49134d7e9e919e5102560065 Mon Sep 17 00:00:00 2001 From: Ivan Filipenkov Date: Fri, 18 Aug 2023 01:58:34 +0300 Subject: [PATCH 13/33] laaaaaaaaaadder --- .../LivingEntities/Player/Player.cs | 2 + DangerousD/GameCore/Managers/GameManager.cs | 2 +- .../GameCore/Managers/PhysicsManager.cs | 40 ++++++++++++++++++- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 066b1d4..9358d38 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -9,6 +9,7 @@ using DangerousD.GameCore.GameObjects.PlayerDeath; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; using DangerousD.GameCore.GameObjects.LivingEntities.Monsters; +using DangerousD.GameCore.Network; namespace DangerousD.GameCore.GameObjects.LivingEntities { @@ -84,6 +85,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void Death(string monsterName) { + return; isAttacked = true; if(monsterName == "Zombie") { diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 75dba06..6b3c2b4 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -161,7 +161,7 @@ namespace DangerousD.GameCore foreach (var item in otherObjects) item.Update(gameTime); - physicsManager.UpdateCollisions(entities, livingEntities, mapObjects, gameTime); + physicsManager.UpdateCollisions(entities, livingEntities, mapObjects, players, gameTime); } } } \ No newline at end of file diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 7899c98..e41b848 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using DangerousD.GameCore.GameObjects.LivingEntities; +using DangerousD.GameCore.GameObjects.MapObjects; using Microsoft.Xna.Framework; namespace DangerousD.GameCore.Managers @@ -13,7 +14,7 @@ namespace DangerousD.GameCore.Managers { public void UpdateCollisions(List entities, List livingEntities, - List mapObjects, GameTime gameTime) + List mapObjects, List players, GameTime gameTime) { float delta = (float)gameTime.ElapsedGameTime.TotalSeconds; foreach (var item in livingEntities) @@ -21,7 +22,8 @@ namespace DangerousD.GameCore.Managers item.velocity = item.velocity + item.acceleration * delta; } - CheckCollisionsLE_MO(livingEntities, mapObjects); + CheckCollisionsLE_MO(livingEntities, mapObjects.Where(mo => mo is StopTile).ToList()); + CheckCollisionsPlayer_Platform(players, mapObjects.OfType().ToList()); CheckCollisionsE_LE(entities, livingEntities); CheckCollisionsLE_LE(livingEntities); @@ -100,6 +102,40 @@ namespace DangerousD.GameCore.Managers currentEntity.SetPosition(new Vector2(newRect.X, newRect.Y)); } + } + private void CheckCollisionsPlayer_Platform(List players, List platforms) + { + foreach (var player in players) + { + if (player.velocity.Y <= 0) + { + continue; + } + var currentRect = player.Rectangle; + var newRect = currentRect; + + var collidedY = false; + var tryingRectY = currentRect; + tryingRectY.Offset(0, (int)Math.Ceiling(player.velocity.Y)); + AppManager.Instance.DebugHUD.Set("intersects platform", "false"); + foreach (var platform in platforms) + { + if (tryingRectY.Intersects(platform.Rectangle)) + { + AppManager.Instance.DebugHUD.Set("intersects platform", "true"); + collidedY = true; + break; + } + } + if (collidedY) + { + player.isOnGround = true; + player.velocity.Y = 0; + } + + player.SetPosition(new Vector2(newRect.X, newRect.Y)); + } + } private void CheckCollisionsE_LE(List entities, List livingEntities) { From ba49674c3b963d1dff9caf1d8ec3f9246fd44f98 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 02:13:01 +0300 Subject: [PATCH 14/33] Boss level --- DangerousD/Content/boss.tmx | 162 ++++++++++++++++++ .../GameObjects/Entities/SilasBall.cs | 2 +- .../LivingEntities/Monsters/SilasMaster.cs | 1 + .../LivingEntities/Player/Player.cs | 9 +- DangerousD/GameCore/Managers/AppManager.cs | 2 +- 5 files changed, 173 insertions(+), 3 deletions(-) create mode 100644 DangerousD/Content/boss.tmx diff --git a/DangerousD/Content/boss.tmx b/DangerousD/Content/boss.tmx new file mode 100644 index 0000000..97ea7e8 --- /dev/null +++ b/DangerousD/Content/boss.tmx @@ -0,0 +1,162 @@ + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,799,799,799,799,799,799,799, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,799,799,799,799,799,799,799,799 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799 + + +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,799,0,0,0,0,0, +799,799,799,799,799,799,799,799,799,799,799,0,0,0,0,0 + + + + + + + + + + + + + + diff --git a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs index 1c11e0e..48dd53b 100644 --- a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs +++ b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs @@ -12,7 +12,7 @@ namespace DangerousD.GameCore.GameObjects.Entities { public class SilasBall : LivingEntity { - private bool IsVisibility=true; + public bool IsVisibility=true; public SilasBall(Vector2 position) : base(position) { Height = 60; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 66f9527..4b3b5cb 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -67,6 +67,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters for (int i = 0; i < balls.Count; i++) { balls[i].SetPosition(new Vector2(Pos.X + i * 40, Pos.Y + 120)); + balls[i].IsVisibility=true; } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 066b1d4..41a7aad 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -9,6 +9,7 @@ using DangerousD.GameCore.GameObjects.PlayerDeath; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; using DangerousD.GameCore.GameObjects.LivingEntities.Monsters; +using DangerousD.GameCore.Network; namespace DangerousD.GameCore.GameObjects.LivingEntities { @@ -27,6 +28,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities private bool isAttacked = false; private bool isShooting = false; public GameObject objectAttack; + public bool isInvincible; private int bullets; public Player(Vector2 position) : base(position) @@ -58,6 +60,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities }; } + public Player(Vector2 position, bool isInvincible) : this(position) + { + this.isInvincible = isInvincible; + } + public bool IsAlive { get { return isAlive; } } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "playerMoveLeft", "playerMoveRight", "DeathFromZombie", "playerRightStay", "playerStayLeft", @@ -152,7 +159,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public override void Update(GameTime gameTime) { GraphicsComponent.SetCameraPosition(Pos); - if (!isAttacked) + if (!isAttacked || isInvincible) { Move(gameTime); } diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 84d6b07..661932c 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -202,7 +202,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("lvl"); + GameManager.mapManager.LoadLevel("boss"); break; case GameState.Death: break; From 5f36ee7b79deba5dfb0653759a9a43cf391710e7 Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 02:19:11 +0300 Subject: [PATCH 15/33] edited player --- DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 066b1d4..eef557f 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -9,6 +9,7 @@ using DangerousD.GameCore.GameObjects.PlayerDeath; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; using DangerousD.GameCore.GameObjects.LivingEntities.Monsters; +using DangerousD.GameCore.Network; namespace DangerousD.GameCore.GameObjects.LivingEntities { From e7c375d9e7adbe9146dc40b08e55f7fd98b1a2ee Mon Sep 17 00:00:00 2001 From: Ivan Filipenkov Date: Fri, 18 Aug 2023 02:27:44 +0300 Subject: [PATCH 16/33] ladders somewhat work --- DangerousD/GameCore/GUI/DebugHUD.cs | 24 ++++++++++++++++++- .../LivingEntities/Player/Player.cs | 11 +++++++-- .../GameCore/Managers/PhysicsManager.cs | 5 +++- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/DangerousD/GameCore/GUI/DebugHUD.cs b/DangerousD/GameCore/GUI/DebugHUD.cs index b56d90a..c4e3e55 100644 --- a/DangerousD/GameCore/GUI/DebugHUD.cs +++ b/DangerousD/GameCore/GUI/DebugHUD.cs @@ -11,6 +11,7 @@ namespace DangerousD.GameCore.GUI { private SpriteFont _spriteFont; private Dictionary _text = new(); + private List _log = new(); public void Initialize() { @@ -27,10 +28,11 @@ namespace DangerousD.GameCore.GUI public void Draw(SpriteBatch spriteBatch) { + var keysString = Join("\n", _text.Select(el => el.Key + ": " + el.Value).ToList()); spriteBatch.Begin(); spriteBatch.DrawString( _spriteFont, - Join("\n", _text.Select(el => el.Key + ": " + el.Value).ToList()), + keysString, new Vector2(10, 10), Color.Cyan, 0, @@ -39,6 +41,17 @@ namespace DangerousD.GameCore.GUI SpriteEffects.None, 0 ); + spriteBatch.DrawString( + _spriteFont, + Join("\n", _log), + new Vector2(10, 10 + _spriteFont.MeasureString(keysString).Y), + Color.Green, + 0, + Vector2.Zero, + 1, + SpriteEffects.None, + 0 + ); spriteBatch.End(); } @@ -46,5 +59,14 @@ namespace DangerousD.GameCore.GUI { _text[key] = value; } + + public void Log(string value) + { + _log.Add(value); + if (_log.Count > 30) + { + _log.RemoveAt(0); + } + } } } \ No newline at end of file diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 9358d38..62bad69 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -29,6 +29,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities private bool isShooting = false; public GameObject objectAttack; private int bullets; + public bool FallingThroughPlatform = false; public Player(Vector2 position) : base(position) { @@ -153,6 +154,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public override void Update(GameTime gameTime) { + if (isOnGround && FallingThroughPlatform) + { + FallingThroughPlatform = false; + AppManager.Instance.DebugHUD.Log("not falling"); + } GraphicsComponent.SetCameraPosition(Pos); if (!isAttacked) { @@ -214,8 +220,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void MoveDown() { - // ПОЧЕМУ - velocity.Y = -11; + FallingThroughPlatform = true; + isOnGround = false; + AppManager.Instance.DebugHUD.Log("FallingThroughPlatform"); } } diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index e41b848..dee4c27 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -77,6 +77,7 @@ namespace DangerousD.GameCore.Managers if (currentEntity is Player) { AppManager.Instance.DebugHUD.Set("velocity", currentEntity.velocity.ToString()); + AppManager.Instance.DebugHUD.Set("falling", (currentEntity as Player).FallingThroughPlatform.ToString()); AppManager.Instance.DebugHUD.Set("intersects y", ""); } foreach (var mapObject in mapObjects) @@ -107,7 +108,7 @@ namespace DangerousD.GameCore.Managers { foreach (var player in players) { - if (player.velocity.Y <= 0) + if (player.velocity.Y <= 0 || player.FallingThroughPlatform) { continue; } @@ -129,6 +130,8 @@ namespace DangerousD.GameCore.Managers } if (collidedY) { + // костыль потому что в CheckCollisionsLE_MO он спускается + newRect.Y -= (int)Math.Ceiling(player.velocity.Y); player.isOnGround = true; player.velocity.Y = 0; } From c9523578e4c02bbc3ea83b5873faa79a4a3a5f8d Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Fri, 18 Aug 2023 02:59:53 +0300 Subject: [PATCH 17/33] SilasCommit --- .../GameObjects/Entities/SilasBall.cs | 24 ++++++++-------- .../LivingEntities/Monsters/SilasHands.cs | 4 +-- .../LivingEntities/Monsters/SilasMaster.cs | 28 +++++++++---------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs index 48dd53b..94e7ca6 100644 --- a/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs +++ b/DangerousD/GameCore/GameObjects/Entities/SilasBall.cs @@ -12,20 +12,22 @@ namespace DangerousD.GameCore.GameObjects.Entities { public class SilasBall : LivingEntity { - public bool IsVisibility=true; + + private Vector2 v; public SilasBall(Vector2 position) : base(position) { - Height = 60; - Width = 60; + Height = 24; + Width = 24; acceleration = Vector2.Zero; } public SilasBall(Vector2 position, Vector2 velosity) : base(position) { - Height = 60; - Width = 60; + Height = 24; + Width = 24; acceleration = Vector2.Zero; velocity = velosity; + v = velosity; } @@ -33,17 +35,17 @@ namespace DangerousD.GameCore.GameObjects.Entities public override void Update(GameTime gameTime) { base.Update(gameTime); - if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(Rectangle).Count>0) + if (AppManager.Instance.GameManager.physicsManager.CheckRectangle( new Rectangle(Rectangle.X-2,Rectangle.Y-2,Rectangle.Width+8,Rectangle.Height+8)).Count>0) { - IsVisibility = false; + AppManager.Instance.GameManager.Remove(this); } + velocity = v; } public override void Draw(SpriteBatch spriteBatch) { - if (IsVisibility) - { - base.Draw(spriteBatch); - } + + base.Draw(spriteBatch); + } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs index e16f168..a54a59b 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs @@ -15,8 +15,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public SilasHands(Vector2 position) : base(position) { name = "SilasHand"; - Width = 48; - Height = 48; + Width = 16; + Height = 16; monster_health = 2; monster_speed = 2; acceleration = Vector2.Zero; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 4b3b5cb..34069af 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -24,21 +24,17 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public SilasMaster(Vector2 position) : base(position) { name = "SilasMaster"; - Width = 144; - Height = 160; + Width = 48; + Height = 53; monster_health = 15; - monster_speed = 4; + monster_speed = 2; acceleration = Vector2.Zero; leftBorder = (int)position.X - 60; rightBorder = (int)position.X + 120; acceleration = Vector2.Zero; - hands.Add(new SilasHands(new Vector2(Pos.X+60,Pos.Y+120))); - hands.Add(new SilasHands(new Vector2(Pos.X + 90, Pos.Y + 120))); - for (int i = 0; i < 4; i++) - { - SilasBall silasball = new SilasBall(new Vector2(Pos.X + i * 40, Pos.Y + 120), new Vector2((i - 2) * 4, 6)); - balls.Add(silasball); - } + hands.Add(new SilasHands(new Vector2(Pos.X+0,Pos.Y+53))); + hands.Add(new SilasHands(new Vector2(Pos.X + 24, Pos.Y + 53))); + } protected override GraphicsComponent GraphicsComponent { get; } = new GraphicsComponent(new List() { "SilasMove", "SilasAttack" }, "SilasMove"); public override void Attack() @@ -64,13 +60,15 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters private void SpawnAttackBall() { - for (int i = 0; i < balls.Count; i++) + balls.Clear(); + for (int i = 0; i < 4; i++) { - balls[i].SetPosition(new Vector2(Pos.X + i * 40, Pos.Y + 120)); - balls[i].IsVisibility=true; + SilasBall silasball = new SilasBall(new Vector2(Pos.X + i * 12, Pos.Y + 53), new Vector2((i - 2) * 2, 2)); + + balls.Add(silasball); } - - + + } public void Attack(GameTime gameTime) From f26c88ffdcbe56f6b27a22afea47d992a1d714cd Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 03:16:42 +0300 Subject: [PATCH 18/33] nightCommit --- DangerousD/GameCore/GUI/HUD.cs | 4 +--- .../GameCore/GameObjects/LivingEntities/Player/Player.cs | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DangerousD/GameCore/GUI/HUD.cs b/DangerousD/GameCore/GUI/HUD.cs index 07e446a..ee17186 100644 --- a/DangerousD/GameCore/GUI/HUD.cs +++ b/DangerousD/GameCore/GUI/HUD.cs @@ -11,7 +11,6 @@ namespace DangerousD.GameCore.GUI { public class HUD : AbstractGui { - int ammout = 0; List rects = new List { }; int wigth = AppManager.Instance.inGameResolution.X; int height = AppManager.Instance.inGameResolution.Y; @@ -27,9 +26,8 @@ namespace DangerousD.GameCore.GUI } public override void Update(GameTime gameTime) { - rects.Clear(); - for (int i = 0; i < ammout; i++) + for (int i = 0; i < AppManager.Instance.GameManager.GetPlayer1.Bullets; i++) { rects.Add(new Rect(Manager) { rectangle = new Rectangle(wigth / 29 + i * 13, height / 17, 5, 20), mainColor = Color.Yellow }); rects[i].LoadTexture(AppManager.Instance.Content); diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index eef557f..2a2a7ca 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -30,6 +30,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public GameObject objectAttack; private int bullets; + public int Bullets { get { return bullets; } } + public Player(Vector2 position) : base(position) { Width = 16; From 465fc4056246edb9a6b4d2ac9171a51b0179f9a5 Mon Sep 17 00:00:00 2001 From: SergoDobro Date: Fri, 18 Aug 2023 03:41:38 +0300 Subject: [PATCH 19/33] added cool sign --- DangerousD/GameCore/GUI/MenuGUI.cs | 31 +++++++++++++++++----- DangerousD/GameCore/Managers/AppManager.cs | 2 +- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/DangerousD/GameCore/GUI/MenuGUI.cs b/DangerousD/GameCore/GUI/MenuGUI.cs index 82170b1..5842e62 100644 --- a/DangerousD/GameCore/GUI/MenuGUI.cs +++ b/DangerousD/GameCore/GUI/MenuGUI.cs @@ -1,9 +1,12 @@ using DangerousD.GameCore.Managers; +using Microsoft.VisualBasic; using Microsoft.Xna.Framework; using MonogameLibrary.UI.Base; using MonogameLibrary.UI.Elements; +using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Runtime.Serialization; namespace DangerousD.GameCore.GUI; @@ -11,6 +14,12 @@ namespace DangerousD.GameCore.GUI; internal class MenuGUI : AbstractGui { int selected = 0; + Color[] colors = new Color[] { new Color(64, 53, 51), new Color(84, 58, 52), + new Color(170, 101, 63), new Color(254, 208, 116), new Color(252, 231, 124) }; + List

    - + diff --git a/DangerousD/GameCore/Graphics/GraphicsComponent.cs b/DangerousD/GameCore/Graphics/GraphicsComponent.cs index f218ba6..00d6298 100644 --- a/DangerousD/GameCore/Graphics/GraphicsComponent.cs +++ b/DangerousD/GameCore/Graphics/GraphicsComponent.cs @@ -1,4 +1,5 @@ -using Microsoft.Xna.Framework; +using DangerousD.GameCore.Managers; +using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using System; @@ -16,7 +17,7 @@ namespace DangerousD.GameCore.Graphics private List textures; private List texturesNames; private AnimationContainer currentAnimation; - static private int scaling=3; + static private int scaling = 4; public AnimationContainer CurrentAnimation { get @@ -129,12 +130,12 @@ namespace DangerousD.GameCore.Graphics { if (!currentAnimation.IsCycle) { - if(actionOfAnimationEnd != null) + if (actionOfAnimationEnd != null) { actionOfAnimationEnd(currentAnimation.Id); - } + } currentAnimation = neitralAnimation; - + } currentFrame = 0; @@ -152,12 +153,12 @@ namespace DangerousD.GameCore.Graphics { Texture2D texture = textures[texturesNames.FindIndex(x => x == currentAnimation.TextureName)]; float scale; - if (currentAnimation.Offset.X!=0) + if (currentAnimation.Offset.X != 0) { destinationRectangle.X -= (int)currentAnimation.Offset.X; - scale=destinationRectangle.Height/sourceRectangle.Height; + scale = destinationRectangle.Height / sourceRectangle.Height; destinationRectangle.Width = (int)(sourceRectangle.Width * scale); - + } else if (currentAnimation.Offset.Y != 0) { @@ -235,9 +236,26 @@ namespace DangerousD.GameCore.Graphics } public static void SetCameraPosition(Vector2 playerPosition) { - CameraPosition=(playerPosition).ToPoint(); + CameraPosition = (playerPosition).ToPoint(); CameraPosition.X -= 300; CameraPosition.Y -= 200; + if (CameraPosition.X < AppManager.Instance.GameManager.CameraBorder.X) + { + CameraPosition.X = (int)AppManager.Instance.GameManager.CameraBorder.X; + } + if (CameraPosition.X > AppManager.Instance.GameManager.CameraBorder.Y - 460) + { + CameraPosition.X = (int)AppManager.Instance.GameManager.CameraBorder.Y - 460; + } + if (CameraPosition.Y < AppManager.Instance.GameManager.CameraBorder.Z) + { + CameraPosition.Y = (int)AppManager.Instance.GameManager.CameraBorder.Z; + } + if (CameraPosition.Y > AppManager.Instance.GameManager.CameraBorder.W - 470) + { + CameraPosition.Y = (int)AppManager.Instance.GameManager.CameraBorder.W - 470; + } + AppManager.Instance.DebugHUD.Set("CameraPosition", $"{CameraPosition.X}, {CameraPosition.Y}"); } public static Point CameraPosition = new Point(-700, 300); } diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 661932c..f957271 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -202,7 +202,8 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("boss"); + GameManager.mapManager.LoadLevel("lvl"); + GameManager.FindBorders(); break; case GameState.Death: break; diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 6b3c2b4..b60d776 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -28,7 +28,7 @@ namespace DangerousD.GameCore public PhysicsManager physicsManager; public List players; public List otherObjects = new(); - + public Vector4 CameraBorder; public Player GetPlayer1 { get; private set; } public GameManager() { @@ -42,6 +42,7 @@ namespace DangerousD.GameCore players = new List(); mapManager = new MapManager(1); physicsManager = new PhysicsManager(); + CameraBorder = Vector4.Zero; } @@ -150,6 +151,8 @@ namespace DangerousD.GameCore GetPlayer1.Update(gameTime); } else + + { for (int i = 0; i < livingEntitiesWithoutPlayers.Count; i++) { @@ -163,5 +166,27 @@ namespace DangerousD.GameCore physicsManager.UpdateCollisions(entities, livingEntities, mapObjects, players, gameTime); } + public void FindBorders() + { + foreach (var item in GetAllGameObjects) + { + if (item.Pos.X CameraBorder.Y) + { + CameraBorder.Y = item.Pos.X; + } + if (item.Pos.Y < CameraBorder.Z) + { + CameraBorder.Z = item.Pos.X; + } + if (item.Pos.Y > CameraBorder.W) + { + CameraBorder.W = item.Pos.X; + } + } + } } } \ No newline at end of file From 0bb77fe09d3c59f5deb36dc38c3d1763db29c0c6 Mon Sep 17 00:00:00 2001 From: N4K Date: Fri, 18 Aug 2023 05:12:32 +0300 Subject: [PATCH 24/33] spider changes --- .../Content/animations/GibsMoveLeftBottom | 1 + DangerousD/Content/animations/GibsMoveLeftTop | 1 + .../Content/animations/GibsMoveRightBottom | 1 + .../Content/animations/GibsMoveRightTop | 1 + DangerousD/Content/animations/GibsNotMove | 1 + .../Content/animations/HunchmanAttackLeft | 2 +- .../Content/animations/HunchmanAttackRight | 2 +- .../Content/animations/HunchmanMoveRight | 4 +- DangerousD/Content/map.tmx | 2 +- .../LivingEntities/Monsters/CoreEnemy.cs | 2 +- .../LivingEntities/Monsters/Spider.cs | 99 ++++++++++--------- .../LivingEntities/Player/Player.cs | 11 +++ DangerousD/GameCore/Managers/AppManager.cs | 2 +- DangerousD/GameCore/Managers/SoundManager.cs | 1 - 14 files changed, 72 insertions(+), 58 deletions(-) create mode 100644 DangerousD/Content/animations/GibsMoveLeftBottom create mode 100644 DangerousD/Content/animations/GibsMoveLeftTop create mode 100644 DangerousD/Content/animations/GibsMoveRightBottom create mode 100644 DangerousD/Content/animations/GibsMoveRightTop create mode 100644 DangerousD/Content/animations/GibsNotMove diff --git a/DangerousD/Content/animations/GibsMoveLeftBottom b/DangerousD/Content/animations/GibsMoveLeftBottom new file mode 100644 index 0000000..b0f96f0 --- /dev/null +++ b/DangerousD/Content/animations/GibsMoveLeftBottom @@ -0,0 +1 @@ +{"id":"GibsMoveLeftBottom","textureName":"MonstersAnimations","startSpriteRectangle":{"X":70,"Y":724,"Width":14,"Height":11},"frameSecond":[{"Item1":0,"Item2":6}],"textureFrameInterval":1,"framesCount":2,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/GibsMoveLeftTop b/DangerousD/Content/animations/GibsMoveLeftTop new file mode 100644 index 0000000..e80c714 --- /dev/null +++ b/DangerousD/Content/animations/GibsMoveLeftTop @@ -0,0 +1 @@ +{"id":"GibsMoveLeftTop","textureName":"MonstersAnimations","startSpriteRectangle":{"X":2,"Y":721,"Width":14,"Height":12},"frameSecond":[{"Item1":0,"Item2":8}],"textureFrameInterval":1,"framesCount":2,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/GibsMoveRightBottom b/DangerousD/Content/animations/GibsMoveRightBottom new file mode 100644 index 0000000..246ab34 --- /dev/null +++ b/DangerousD/Content/animations/GibsMoveRightBottom @@ -0,0 +1 @@ +{"id":"GibsMoveRightBottom","textureName":"MonstersAnimations","startSpriteRectangle":{"X":106,"Y":722,"Width":13,"Height":12},"frameSecond":[{"Item1":0,"Item2":6}],"textureFrameInterval":1,"framesCount":2,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/GibsMoveRightTop b/DangerousD/Content/animations/GibsMoveRightTop new file mode 100644 index 0000000..4b193fd --- /dev/null +++ b/DangerousD/Content/animations/GibsMoveRightTop @@ -0,0 +1 @@ +{"id":"GibsMoveRightTop","textureName":"MonstersAnimations","startSpriteRectangle":{"X":37,"Y":721,"Width":14,"Height":13},"frameSecond":[{"Item1":0,"Item2":6}],"textureFrameInterval":1,"framesCount":2,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/GibsNotMove b/DangerousD/Content/animations/GibsNotMove new file mode 100644 index 0000000..e5333b8 --- /dev/null +++ b/DangerousD/Content/animations/GibsNotMove @@ -0,0 +1 @@ +{"id":"GibsNotMove","textureName":"MonstersAnimations","startSpriteRectangle":{"X":137,"Y":731,"Width":16,"Height":5},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":1,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/HunchmanAttackLeft b/DangerousD/Content/animations/HunchmanAttackLeft index f6b0634..a84b54b 100644 --- a/DangerousD/Content/animations/HunchmanAttackLeft +++ b/DangerousD/Content/animations/HunchmanAttackLeft @@ -1 +1 @@ -{"id":"HunchmanAttackLeft","textureName":"MonstersAnimations","startSpriteRectangle":{"X":101,"Y":124,"Width":40,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":3,"isCycle":true,"offset":"0, 0"} +{"id":"HunchmanAttackLeft","textureName":"MonstersAnimations","startSpriteRectangle":{"X":112,"Y":124,"Width":27,"Height":24},"frameSecond":[{"Item1":0,"Item2":8}],"textureFrameInterval":1,"framesCount":3,"isCycle":true,"offset":"4, 0"} diff --git a/DangerousD/Content/animations/HunchmanAttackRight b/DangerousD/Content/animations/HunchmanAttackRight index 482d7f3..b4e8552 100644 --- a/DangerousD/Content/animations/HunchmanAttackRight +++ b/DangerousD/Content/animations/HunchmanAttackRight @@ -1 +1 @@ -{"id":"HunchmanAttackRight","textureName":"MonstersAnimations","startSpriteRectangle":{"X":101,"Y":99,"Width":40,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":3,"isCycle":true,"offset":"0, 0"} +{"id":"HunchmanAttackRight","textureName":"MonstersAnimations","startSpriteRectangle":{"X":102,"Y":99,"Width":31,"Height":24},"frameSecond":[{"Item1":0,"Item2":8}],"textureFrameInterval":1,"framesCount":3,"isCycle":true,"offset":"8, 0"} diff --git a/DangerousD/Content/animations/HunchmanMoveRight b/DangerousD/Content/animations/HunchmanMoveRight index a289fa5..2719ebe 100644 --- a/DangerousD/Content/animations/HunchmanMoveRight +++ b/DangerousD/Content/animations/HunchmanMoveRight @@ -1,3 +1 @@ - -{"id":"HunchmanMoveRight","textureName":"MonstersAnimations","startSpriteRectangle":{"X":1,"Y":99,"Width":24,"Height":24},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":4,"isCycle":true,"offset":"0, 0"} - +{"id":"HunchmanMoveRight","textureName":"MonstersAnimations","startSpriteRectangle":{"X":1,"Y":100,"Width":24,"Height":23},"frameSecond":[{"Item1":0,"Item2":10}],"textureFrameInterval":1,"framesCount":4,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/map.tmx b/DangerousD/Content/map.tmx index cd29fd9..71275ca 100644 --- a/DangerousD/Content/map.tmx +++ b/DangerousD/Content/map.tmx @@ -62,7 +62,7 @@ - + diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs index 22ea566..5fcbe7d 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs @@ -19,7 +19,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities protected bool isAttack = false; protected bool isGoRight; protected int leftBoarder = 0; - protected int rightBoarder = 700; + protected int rightBoarder = 800; public CoreEnemy(Vector2 position) : base(position) { diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs index dd60669..c0835dc 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs @@ -1,4 +1,5 @@ -using DangerousD.GameCore.Graphics; +using DangerousD.GameCore.GameObjects.MapObjects; +using DangerousD.GameCore.Graphics; using DangerousD.GameCore.Managers; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; @@ -35,6 +36,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters webLength = 0; monster_speed = 3; acceleration = new Vector2(0, -50); + isGoRight = true; } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "SpiderMoveRight", "SpiderMoveLeft", "SpiderOnWeb" }, "SpiderMoveRight"); @@ -66,34 +68,50 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Attack(GameTime gameTime) { //48 72 velocity.X = 0; - Width = 48; - Height = 72; delay += (float)gameTime.ElapsedGameTime.TotalSeconds; - if (delay > 0.5 && webLength <= 4 && isDown) + if (isAttack) { - StartCicycleAnimation("SpiderOnWeb"); - acceleration = Vector2.Zero; - webLength++; - _pos.Y += 25; - web.Height = webLength * 25; - web.SetPosition(new Vector2(_pos.X + Width / 2 - web.Width / 2 + 2, Pos.Y - 25 * webLength)); - delay = 0; - if (webLength == 4) + if (delay > 0.5 && webLength <= 4 && isDown) { - isDown = false; + Width = 48; + Height = 72; + StartCicycleAnimation("SpiderOnWeb"); + acceleration = Vector2.Zero; + webLength++; + _pos.Y += 25; + web.Height = webLength * 25; + web.SetPosition(new Vector2(_pos.X + Width / 2 - web.Width / 2, Pos.Y - 25 * webLength)); + delay = 0; + if (webLength == 4) + { + isDown = false; + } } - } - else if (delay > 0.5 && webLength != 0 && !isDown) - { - StartCicycleAnimation("SpiderOnWeb"); - webLength--; - _pos.Y -= 25; - web.Height = webLength * 25; - web.SetPosition(new Vector2(_pos.X + Width / 2 - web.Width / 2 + 2, Pos.Y - 25 * webLength)); - delay = 0; - if (webLength == 0) + else if (delay > 0.5 && webLength != 0 && !isDown) { - isDown = true; + Width = 48; + Height = 72; + StartCicycleAnimation("SpiderOnWeb"); + webLength--; + _pos.Y -= 25; + web.Height = webLength * 25; + web.SetPosition(new Vector2(_pos.X + Width / 2 - web.Width / 2, Pos.Y - 25 * webLength)); + delay = 0; + if (webLength == 0) + { + isDown = true; + } + } + var entitiesInter = physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y, 200, 600)); + if (entitiesInter.Count > 0) + { + foreach (var entity in entitiesInter) + { + if (entity.GetType() == typeof(Player)) + { + player.Death(name); + } + } } } if (webLength == 0) @@ -101,7 +119,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters isAttack = false; } } - //сделать условие с Артемом + public override void Draw(SpriteBatch spriteBatch) { if (GraphicsComponent.GetCurrentAnimation == "SpiderOnWeb") @@ -124,11 +142,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { Width = 112; Height = 24; - - int wallCheck = physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 10, (int)Pos.Y, 150, 10)).Count; - if (wallCheck > 0) + foreach (var entity in physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 7, (int)Pos.Y, 126, 10))) { - isGoRight = !isGoRight; + if (entity.GetType() == typeof(StopTile)) + { + isGoRight = !isGoRight; + } } if (isGoRight) { @@ -146,31 +165,13 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } velocity.X = -monster_speed; } - if (Pos.X >= rightBoarder) - { - isGoRight = false; - } - else if (Pos.X <= leftBoarder) - { - isGoRight = true; - } } public override void Target() { - if (physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y, 300, 600), typeof(Player)) != null) + if (player.Pos.X >= Pos.X && player.Pos.X <= Pos.X+Width) { - if (player.Pos.X - Pos.X <= 30) - { - isAttack = true; - } - } - if (physicsManager.CheckRectangle(new Rectangle((int)Pos.X-300, (int)Pos.Y, 300, 600), typeof(Player)) != null) - { - if (player.Pos.X - Pos.X <= 30) - { - isAttack = true; - } + isAttack = true; } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 03c24b6..f3008b2 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -80,6 +80,17 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } }; } + else if(monsterName == "Spider") + { + DeathRectangle deathRectangle = new DeathRectangle(Pos, "DeathFrom" + monsterName); + deathRectangle.Gr.actionOfAnimationEnd += (a) => + { + if (a == "DeathFrom" + monsterName) + { + AppManager.Instance.ChangeGameState(GameState.Death); + } + }; + } isAlive = false; } public void Jump() diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 84d6b07..2ec40c9 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -202,7 +202,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("lvl"); + GameManager.mapManager.LoadLevel("map"); break; case GameState.Death: break; diff --git a/DangerousD/GameCore/Managers/SoundManager.cs b/DangerousD/GameCore/Managers/SoundManager.cs index 8e2df9e..ab9a5d8 100644 --- a/DangerousD/GameCore/Managers/SoundManager.cs +++ b/DangerousD/GameCore/Managers/SoundManager.cs @@ -40,7 +40,6 @@ namespace DangerousD.GameCore public void StartAmbientSound(string soundName) // запустить звук у которого нет позиции { - return; var sound = new Sound(Sounds[soundName]); sound.SoundEffect.IsLooped = false; sound.SoundEffect.Play(); From 25ecea60f835a2609db573aa920e5e419e9ae1f0 Mon Sep 17 00:00:00 2001 From: SergoDobro Date: Fri, 18 Aug 2023 05:15:39 +0300 Subject: [PATCH 25/33] menu ui rework --- DangerousD/GameCore/GUI/AbstractGui.cs | 5 +-- DangerousD/GameCore/GUI/MenuGUI.cs | 19 ++++++-- .../LivingEntities/Player/Player.cs | 2 +- MonogameLibrary/UI/Base/UIManager.cs | 6 ++- MonogameLibrary/UI/Elements/ButtonText.cs | 45 ++++++++++++++++--- MonogameLibrary/UI/Elements/Label.cs | 2 + 6 files changed, 65 insertions(+), 14 deletions(-) diff --git a/DangerousD/GameCore/GUI/AbstractGui.cs b/DangerousD/GameCore/GUI/AbstractGui.cs index 7f7b212..feb3294 100644 --- a/DangerousD/GameCore/GUI/AbstractGui.cs +++ b/DangerousD/GameCore/GUI/AbstractGui.cs @@ -19,8 +19,7 @@ public abstract class AbstractGui : IDrawableObject private GraphicsDevice graphicsDevice; public virtual void Initialize() { - Manager.Initialize(AppManager.Instance.GraphicsDevice); - this.graphicsDevice = graphicsDevice; + Manager.Initialize(AppManager.Instance.GraphicsDevice); CreateUI(); } @@ -31,7 +30,7 @@ public abstract class AbstractGui : IDrawableObject public virtual void Update(GameTime gameTime) { - Manager.Update(); + Manager.Update(gameTime); } public virtual void Draw(SpriteBatch spriteBatch) diff --git a/DangerousD/GameCore/GUI/MenuGUI.cs b/DangerousD/GameCore/GUI/MenuGUI.cs index 5842e62..fedaacb 100644 --- a/DangerousD/GameCore/GUI/MenuGUI.cs +++ b/DangerousD/GameCore/GUI/MenuGUI.cs @@ -31,8 +31,9 @@ internal class MenuGUI : AbstractGui for (int i = 0; i < colors.Length; i++) { - Elements.Add(new Label(Manager) { rectangle = new Rectangle((wigth - 50) / 2 - 60, 200, 50, 50), text = "Dangerous", mainColor = Color.Transparent, scale = 1.35f - 0.05f * i * i / 10, fontName = "Font2", fontColor = colors[i] }); + Elements.Add(new Label(Manager) { rectangle = new Rectangle((wigth - 50) / 2 - 60, 220, 50, 50), text = "Dangerous", mainColor = Color.Transparent, scale = 1.35f - 0.05f * i * i / 10, fontName = "Font2", fontColor = colors[i] }); MainLetterLabels.Add(Elements.Last() as Label); + MainLetterPositions.Add(new Vector2(Elements.Last().rectangle.X, Elements.Last().rectangle.Y)); } int dx = 50; @@ -40,6 +41,7 @@ internal class MenuGUI : AbstractGui { Elements.Add(new Label(Manager) { rectangle = new Rectangle((wigth - 50) / 2 + 480 + dx - i * i, 260 - i * i / 5, 50, 50), text = "D", mainColor = Color.Transparent, scale = 2.15f - 0.05f * i * i / 5, fontName = "Font2", fontColor = colors[i] }); BigLetterLabels.Add(Elements.Last() as Label); + BigLetterPositions.Add(new Vector2(Elements.Last().rectangle.X, Elements.Last().rectangle.Y)); } var butSingle = new ButtonText(Manager) { rectangle = new Rectangle((wigth - (int)(300 * 2.4)) / 2, 350, (int)(300 * 2.4), (int)(50 * 2.4)), text = "Singleplayer", scale = 1.2f, fontName = "ButtonFont" }; @@ -77,10 +79,21 @@ internal class MenuGUI : AbstractGui { for (int i = 0; i < MainLetterLabels.Count; i++) { - MainLetterLabels[i].fontColor = Color.FromNonPremultiplied(colors[i].ToVector4() * (float)((Math.Sin(gameTime.TotalGameTime.TotalSeconds*2) + 1) / 2f + 0.5f) + MainLetterLabels[i].fontColor = Color.FromNonPremultiplied(colors[i].ToVector4() * + (float)(((Math.Sin(gameTime.TotalGameTime.TotalSeconds * 4) + 1) / 2f) * 0.3 + 0.8f) ); - BigLetterLabels[i].fontColor = Color.FromNonPremultiplied(colors[i].ToVector4() * (float)((Math.Sin(gameTime.TotalGameTime.TotalSeconds * 2) + 1) / 2f + 0.5f) + BigLetterLabels[i].fontColor = Color.FromNonPremultiplied(colors[i].ToVector4() + * (float)(((Math.Sin(gameTime.TotalGameTime.TotalSeconds * 4 - Math.PI) + 1) / 2f) * 0.3 + 0.8f) ); + MainLetterLabels[i].fontColor.A = 255; + BigLetterLabels[i].fontColor.A = 255; + MainLetterLabels[i].rectangle.Y = (int)(MainLetterPositions[i].Y + + (20 * (Math.Sin(gameTime.TotalGameTime.TotalSeconds * 4) + 1) / 2f * 0.25) * (i - MainLetterLabels.Count / 2) + ); + BigLetterLabels[i].rectangle.Y = (int)(BigLetterPositions[i].Y + + (20 * (Math.Sin(gameTime.TotalGameTime.TotalSeconds * 4 - Math.PI) + 1) / 2f * 0.25) * (i - MainLetterLabels.Count / 2) + ); + } base.Update(gameTime); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index edfc3bc..60eaf05 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -92,7 +92,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void Death(string monsterName) { - return; + return; //godmode isAttacked = true; if(monsterName == "Zombie") { diff --git a/MonogameLibrary/UI/Base/UIManager.cs b/MonogameLibrary/UI/Base/UIManager.cs index d37416d..826a0a1 100644 --- a/MonogameLibrary/UI/Base/UIManager.cs +++ b/MonogameLibrary/UI/Base/UIManager.cs @@ -51,8 +51,10 @@ namespace MonogameLibrary.UI.Base } } } - public void Update() - { + public GameTime gameTime; + public void Update(GameTime gameTime) + { + this.gameTime = gameTime; try { keyboardState = Keyboard.GetState(); diff --git a/MonogameLibrary/UI/Elements/ButtonText.cs b/MonogameLibrary/UI/Elements/ButtonText.cs index ba6243d..58ad958 100644 --- a/MonogameLibrary/UI/Elements/ButtonText.cs +++ b/MonogameLibrary/UI/Elements/ButtonText.cs @@ -16,22 +16,57 @@ namespace MonogameLibrary.UI.Elements public ButtonText(UIManager manager, int layerIndex = 0) : base(manager, layerIndex) { } + float gameTime = 0; + public override bool InteractUpdate(MouseState mouseState, MouseState prevmouseState) + { + gameTime += (float)Manager.gameTime.ElapsedGameTime.TotalSeconds; + return base.InteractUpdate(mouseState, prevmouseState); + } + public override void Draw(SpriteBatch _spriteBatch) { if (hoverState == HoverState.None) { - fontColor = Color.White; + var d = (float)(((Math.Sin(gameTime * 2 - Math.PI) + 1) / 2f) * 0.1 + 0.7f); + fontColor = Color.FromNonPremultiplied(new Vector4(0.8f,0.15f, 0.15f, 1) * d + ); } else if (hoverState == HoverState.Hovering) - { - fontColor = new Color(211, 211, 211); + { + var d2 = (float)(((Math.Sin(gameTime * 2 - Math.PI) + 1) / 2f) * 0.1 + 0.7f); + fontColor = Color.FromNonPremultiplied(new Vector4(0.8f, 0.15f, 0.15f, 1) * d2 + ); } else { - fontColor = new Color(112, 128, 144); + //fontColor = new Color(112, 128, 144); + fontColor = new Color(212, 228, 244); } - DrawText(_spriteBatch); + if (hoverState == HoverState.Hovering) + { + int kk = 50; + scale += 0.005f; + var d = (float)(((Math.Sin(gameTime * 1 - Math.PI) + 1) / 2f) * 0.1 + 1f); + Color oldColor = fontColor; + fontColor = Color.FromNonPremultiplied(new Vector4(252 / 255f, 231 / 255f, 124 / 255f, 1) * d + ); + DrawText(_spriteBatch); + fontColor = oldColor; + fontColor.A = 255; + scale -= 0.005f; + scale -= 0.0002f; + } + if (hoverState == HoverState.Pressing) + { + scale -= 0.025f; + DrawText(_spriteBatch); + scale += 0.025f; + } + else + { + DrawText(_spriteBatch); + } } } } diff --git a/MonogameLibrary/UI/Elements/Label.cs b/MonogameLibrary/UI/Elements/Label.cs index e14fc0d..1a8871e 100644 --- a/MonogameLibrary/UI/Elements/Label.cs +++ b/MonogameLibrary/UI/Elements/Label.cs @@ -19,8 +19,10 @@ namespace MonogameLibrary.UI.Elements } protected HoverState hoverState = HoverState.None; + float gameTime = 0; public virtual bool InteractUpdate(MouseState mouseState, MouseState prevmouseState) { + gameTime += (float)Manager.gameTime.ElapsedGameTime.TotalSeconds; if (rectangle.Intersects(new Rectangle(mouseState.Position, Point.Zero))) { if (mouseState.LeftButton == ButtonState.Pressed) From 64926792c9b30630f4e0bead283056a6dce53fb7 Mon Sep 17 00:00:00 2001 From: SergoDobro Date: Fri, 18 Aug 2023 05:28:09 +0300 Subject: [PATCH 26/33] Created but not checked triggers --- .../GameCore/GameObjects/Entities/Trigger.cs | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 DangerousD/GameCore/GameObjects/Entities/Trigger.cs diff --git a/DangerousD/GameCore/GameObjects/Entities/Trigger.cs b/DangerousD/GameCore/GameObjects/Entities/Trigger.cs new file mode 100644 index 0000000..72c1a80 --- /dev/null +++ b/DangerousD/GameCore/GameObjects/Entities/Trigger.cs @@ -0,0 +1,36 @@ +using DangerousD.GameCore.Graphics; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DangerousD.GameCore.GameObjects.Entities +{ + internal class Trigger : Entity + { + public Action OnCollisionAction; + string trigger_Name; + public Trigger(Rectangle rectangle, string trigger_Name) : base(new Vector2(rectangle.X, rectangle.Y)) + { + _pos = new Vector2(rectangle.X, rectangle.Y); + Width = rectangle.Width; + Height = rectangle.Height; + this.trigger_Name = trigger_Name; + } + + protected override GraphicsComponent GraphicsComponent => new GraphicsComponent(new List() { "SilasBallMove" }, "SilasBallMove"); + public override void OnCollision(GameObject gameObject) + { + OnCollisionAction?.Invoke(gameObject); + } + public override void Update(GameTime gameTime) + { + } + public override void Draw(SpriteBatch spriteBatch) + { + } + } +} From 07412ddba135c5df4201c5661d0ad98d26e30730 Mon Sep 17 00:00:00 2001 From: N4K Date: Fri, 18 Aug 2023 05:46:37 +0300 Subject: [PATCH 27/33] fix conflicts --- DangerousD/GameCore/GUI/AbstractGui.cs | 4 ---- .../GameObjects/LivingEntities/Monsters/CoreEnemy.cs | 2 ++ .../LivingEntities/Monsters/FlameSkull.cs | 6 ++++-- .../GameObjects/LivingEntities/Monsters/Frank.cs | 4 +--- .../LivingEntities/Monsters/FrankBalls.cs | 7 +++---- .../GameObjects/LivingEntities/Monsters/Ghost.cs | 3 +-- .../GameObjects/LivingEntities/Monsters/Hunchman.cs | 2 +- .../LivingEntities/Monsters/HunchmanDagger.cs | 2 +- .../LivingEntities/Monsters/SilasHands.cs | 7 ++++--- .../LivingEntities/Monsters/SilasMaster.cs | 2 +- .../GameObjects/LivingEntities/Monsters/Slime.cs | 2 +- .../GameObjects/LivingEntities/Monsters/Spider.cs | 3 +-- .../GameObjects/LivingEntities/Monsters/SpiderWeb.cs | 2 +- .../GameObjects/LivingEntities/Monsters/Werewolf.cs | 3 +-- .../GameObjects/LivingEntities/Monsters/Zombie.cs | 12 +----------- DangerousD/GameCore/Managers/AppManager.cs | 4 ---- DangerousD/GameCore/Managers/MapManager.cs | 5 ----- 17 files changed, 23 insertions(+), 47 deletions(-) diff --git a/DangerousD/GameCore/GUI/AbstractGui.cs b/DangerousD/GameCore/GUI/AbstractGui.cs index 2e30de0..a8dc9c0 100644 --- a/DangerousD/GameCore/GUI/AbstractGui.cs +++ b/DangerousD/GameCore/GUI/AbstractGui.cs @@ -19,11 +19,7 @@ public abstract class AbstractGui : IDrawableObject private GraphicsDevice graphicsDevice; public virtual void Initialize() { -<<<<<<< HEAD Manager.Initialize(AppManager.Instance.GraphicsDevice); -======= - Manager.Initialize(AppManager.Instance.GraphicsDevice); ->>>>>>> ea55e2b4f2b2b9af627579f3c4b82bdf0171d80b CreateUI(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs index b7b4351..38b1cc0 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/CoreEnemy.cs @@ -18,6 +18,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities protected bool isAlive = true; protected int leftBoarder = 0; protected int rightBoarder = 800; + protected bool isGoRight; public CoreEnemy(Vector2 position) : base(position) { @@ -31,6 +32,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public abstract void Death(); public abstract void Attack(); + public abstract void Attack(GameTime gameTime); public abstract void Move(GameTime gameTime); diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs index b4f3ec7..c93b40a 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FlameSkull.cs @@ -12,7 +12,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class FlameSkull : CoreEnemy { - private bool isGoRight; private bool isAttack; public FlameSkull(Vector2 position) : base(position) @@ -74,6 +73,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - + public override void Attack(GameTime gameTime) + { + throw new NotImplementedException(); + } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs index 2afe14b..f164455 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Frank.cs @@ -12,8 +12,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { internal class Frank : CoreEnemy { - private bool isGoRight; - public Frank(Vector2 position) : base(position) { isGoRight = false; @@ -71,7 +69,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) { } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs index 031d594..013ed10 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/FrankBalls.cs @@ -80,13 +80,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters velocity.Y -= monster_speed; } } - - public void Attack(GameTime gameTime) + public void Target() { - + throw new NotImplementedException(); } - public void Target() + public override void Attack(GameTime gameTime) { throw new NotImplementedException(); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs index 3df9012..214a4c2 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Ghost.cs @@ -10,7 +10,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Ghost : CoreEnemy { - private bool isGoRight; private bool isAttack; public Ghost(Vector2 position) : base(position) @@ -79,7 +78,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) { } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs index d804512..5db5359 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Hunchman.cs @@ -81,7 +81,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) { } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs index 9c2415b..740c360 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/HunchmanDagger.cs @@ -27,7 +27,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) { } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs index a54a59b..15018ea 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasHands.cs @@ -10,7 +10,8 @@ using System.Threading.Tasks; namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { - public class SilasHands : CoreEnemy + public class + SilasHands : CoreEnemy { public SilasHands(Vector2 position) : base(position) { @@ -30,9 +31,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) { - + throw new NotImplementedException(); } public override void Death() diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs index 1b502be..6b436b7 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SilasMaster.cs @@ -70,7 +70,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) { } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs index c263a25..0f9e9c9 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs @@ -237,7 +237,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) { } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs index 8bc703b..a4963bf 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs @@ -14,7 +14,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Spider : CoreEnemy { - private bool isGoRight; private bool isAttack; protected SpiderWeb web; @@ -68,7 +67,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters /// Атака паука РАБОЧАЯ /// /// - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) { //48 72 velocity.X = 0; delay += (float)gameTime.ElapsedGameTime.TotalSeconds; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs index 8bd0af1..c5971de 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/SpiderWeb.cs @@ -28,7 +28,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) { } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs index c5f1b8c..837932f 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Werewolf.cs @@ -12,7 +12,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Werewolf : CoreEnemy { - private bool isGoRight; private bool isAttack; public Werewolf(Vector2 position) : base(position) @@ -73,7 +72,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } } - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) { } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index b1f8405..5a5711e 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -13,7 +13,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Zombie : CoreEnemy { - private bool isGoRight; private bool isAttack; float leftBorder; @@ -128,12 +127,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } base.OnCollision(gameObject); } -<<<<<<< HEAD - public override void Target() -======= public void Target() ->>>>>>> ea55e2b4f2b2b9af627579f3c4b82bdf0171d80b { if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 50, (int)Pos.Y, Width + 100, Height), typeof(Player)).Count > 0) { @@ -163,11 +158,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters rightBorder = 760; } } - -<<<<<<< HEAD - public override void Attack(GameTime gameTime) { } -======= - public void Attack(GameTime gameTime) + public override void Attack(GameTime gameTime) {} public void TakeDamage() @@ -180,6 +171,5 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters Death(); } } ->>>>>>> ea55e2b4f2b2b9af627579f3c4b82bdf0171d80b } } diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 7b79e45..33327c7 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -205,12 +205,8 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: -<<<<<<< HEAD - GameManager.mapManager.LoadLevel("map"); -======= GameManager.mapManager.LoadLevel("lvl"); GameManager.FindBorders(); ->>>>>>> main break; case GameState.Death: break; diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index a97a2f5..6ab49b0 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -92,10 +92,6 @@ namespace DangerousD.GameCore.Managers float offsetY = group.Attributes["offsety"] is not null ? float.Parse(group.Attributes["offsety"].Value) : 0; foreach (XmlNode entity in group.ChildNodes) { -<<<<<<< HEAD - Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityType}"); - Entity inst = (Entity)Activator.CreateInstance(type, new Vector2(float.Parse(entity.Attributes["x"].Value, CultureInfo.InvariantCulture) + offsetX, float.Parse(entity.Attributes["y"].Value, CultureInfo.InvariantCulture) + offsetY ) * _scale); -======= string entityType = entity.Attributes["type"] is not null ? "." + entity.Attributes["type"].Value : ""; Type type = Type.GetType($"DangerousD.GameCore.GameObjects.{entityGroup}{entityType}"); Vector2 pos = @@ -110,7 +106,6 @@ namespace DangerousD.GameCore.Managers { inst = (Entity)Activator.CreateInstance(type, pos); } ->>>>>>> ea55e2b4f2b2b9af627579f3c4b82bdf0171d80b inst.SetPosition(new Vector2(inst.Pos.X, inst.Pos.Y - inst.Height)); inst.Height *= _scale; inst.Width *= _scale; From acc82bd646317f3640a05e053cc345162898f783 Mon Sep 17 00:00:00 2001 From: N4K Date: Fri, 18 Aug 2023 05:51:17 +0300 Subject: [PATCH 28/33] fix map file --- DangerousD/Content/map.tmx | 3 --- DangerousD/GameCore/Managers/AppManager.cs | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/DangerousD/Content/map.tmx b/DangerousD/Content/map.tmx index 98f3653..9afca4d 100644 --- a/DangerousD/Content/map.tmx +++ b/DangerousD/Content/map.tmx @@ -66,13 +66,10 @@ -<<<<<<< HEAD -======= ->>>>>>> ea55e2b4f2b2b9af627579f3c4b82bdf0171d80b
    diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 33327c7..1d75e73 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -205,7 +205,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("lvl"); + GameManager.mapManager.LoadLevel("map"); GameManager.FindBorders(); break; case GameState.Death: From 2e467120c5bbc1fe19a775b43836a0a74004d7da Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Fri, 18 Aug 2023 05:56:36 +0300 Subject: [PATCH 29/33] StartWorkingWhithDoors --- .../GameCore/GameObjects/Entities/Door.cs | 37 +++++++++++++++++++ .../LivingEntities/Player/Player.cs | 10 ++++- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 DangerousD/GameCore/GameObjects/Entities/Door.cs diff --git a/DangerousD/GameCore/GameObjects/Entities/Door.cs b/DangerousD/GameCore/GameObjects/Entities/Door.cs new file mode 100644 index 0000000..0e21692 --- /dev/null +++ b/DangerousD/GameCore/GameObjects/Entities/Door.cs @@ -0,0 +1,37 @@ +using DangerousD.GameCore.GameObjects.LivingEntities; +using DangerousD.GameCore.Graphics; +using Microsoft.Xna.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DangerousD.GameCore.GameObjects.Entities +{ + public class Door : Entity + { + public Door(Vector2 position) : base(position) + { + } + + protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "SilasBallMove" }, "SilasBallMove"); + public override void Update(GameTime gameTime) + { + base.Update(gameTime); + + } + public override void OnCollision(GameObject gameObject) + { + base.OnCollision(gameObject); + if (gameObject is Player) + { + Player player = (Player)gameObject; + if (player.isUping) + { + + } + } + } + } +} diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 1790e25..0006914 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -31,7 +31,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public bool isInvincible; private int bullets; public bool FallingThroughPlatform = false; - + public bool isUping = false; @@ -162,6 +162,14 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public override void Update(GameTime gameTime) { + if (AppManager.Instance.InputManager.ScopeState==ScopeState.Up) + { + isUping = true; + } + else + { + isUping = false; + } if (isOnGround && FallingThroughPlatform) { FallingThroughPlatform = false; From 5f032d527b3262263877598ad7d9dee67d8deb2f Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Fri, 18 Aug 2023 05:58:02 +0300 Subject: [PATCH 30/33] Normalize --- DangerousD/GameCore/Managers/AppManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 1d75e73..33327c7 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -205,7 +205,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("map"); + GameManager.mapManager.LoadLevel("lvl"); GameManager.FindBorders(); break; case GameState.Death: From 088d9cb87c377f980ede4eceec680c5e6d6cd360 Mon Sep 17 00:00:00 2001 From: Ivan Filipenkov Date: Fri, 18 Aug 2023 10:21:53 +0300 Subject: [PATCH 31/33] cheats --- DangerousD/GameCore/GameObjects/GameObject.cs | 8 ++- .../LivingEntities/Player/Player.cs | 10 +-- DangerousD/GameCore/InputManager.cs | 67 ++++++++++++++++--- 3 files changed, 69 insertions(+), 16 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/GameObject.cs b/DangerousD/GameCore/GameObjects/GameObject.cs index 65bf8c9..a583904 100644 --- a/DangerousD/GameCore/GameObjects/GameObject.cs +++ b/DangerousD/GameCore/GameObjects/GameObject.cs @@ -59,7 +59,13 @@ namespace DangerousD.GameCore { GraphicsComponent.DrawAnimation(Rectangle, spriteBatch); //debug - //wdaspriteBatch.Draw(debugTexture,new Rectangle(Rectangle.X-GraphicsComponent.CameraPosition.X,Rectangle.Y-GraphicsComponent.CameraPosition.Y,Rectangle.Width,Rectangle.Height), Color.White); + if (AppManager.Instance.InputManager.CollisionsCheat) + { + spriteBatch.Draw(debugTexture, + new Rectangle(Rectangle.X - GraphicsComponent.CameraPosition.X, + Rectangle.Y - GraphicsComponent.CameraPosition.Y, Rectangle.Width, Rectangle.Height), + Color.White); + } } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index d0c144a..272f332 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -28,7 +28,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities private bool isAttacked = false; private bool isShooting = false; public GameObject objectAttack; - public bool isInvincible; private int bullets; public bool FallingThroughPlatform = false; public bool isUping = false; @@ -94,7 +93,10 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void Death(string monsterName) { - return; //godmode + if (AppManager.Instance.InputManager.InvincibilityCheat) + { + return; + } isAttacked = true; if(monsterName == "Zombie") { @@ -184,10 +186,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities if (isOnGround && FallingThroughPlatform) { FallingThroughPlatform = false; - AppManager.Instance.DebugHUD.Log("not falling"); } GraphicsComponent.SetCameraPosition(Pos); - if (!isAttacked || isInvincible) + if (!isAttacked || AppManager.Instance.InputManager.InvincibilityCheat) { Move(gameTime); } @@ -249,7 +250,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities { FallingThroughPlatform = true; isOnGround = false; - AppManager.Instance.DebugHUD.Log("FallingThroughPlatform"); } } diff --git a/DangerousD/GameCore/InputManager.cs b/DangerousD/GameCore/InputManager.cs index c171d6b..ef255ae 100644 --- a/DangerousD/GameCore/InputManager.cs +++ b/DangerousD/GameCore/InputManager.cs @@ -6,11 +6,12 @@ using System.Diagnostics; using System.Text; using System.Xml.Serialization; using System.Runtime.InteropServices; +using System.Security.Cryptography; namespace DangerousD.GameCore { public enum ScopeState { Up, Middle, Down } - public enum ControlsState { Gamepad, Keyboard, Mouse } + public enum ControlsState { Gamepad, Keyboard } public class InputManager { public delegate void Delegat(); @@ -21,31 +22,77 @@ namespace DangerousD.GameCore Vector2 vectorMovementDirection; ScopeState scopeState; // Положение оружия. Up, Middle, Down. ControlsState controlsState; + private bool _overrideControls = false; + private bool _cheatsEnabled = false; + public bool InvincibilityCheat { get; private set; } = false; + public bool CollisionsCheat { get; private set; } = false; private bool isJumpDown; // Блокирует физическое нажатие прыжка и спуска private bool isShoot; public Vector2 VectorMovementDirection { get => vectorMovementDirection; } public ScopeState ScopeState { get => scopeState; } - public string currentControlsState = ""; public InputManager() { this.isJumpDown = false; this.isShoot = false; scopeState = ScopeState.Middle; - controlsState= ControlsState.Mouse; + controlsState= ControlsState.Keyboard; vectorMovementDirection = new Vector2(0, 0); } - public void SetState(ControlsState controlsStates) - { - currentControlsState = controlsStates.ToString(); - } public void Update() { - // Работа с GamePad if (GamePad.GetState(0).IsConnected) - { + { + GamePadState gamepadState = GamePad.GetState(0); + if (gamepadState.Triggers.Left >= 0.9 && gamepadState.Triggers.Right >= 0.9) + { + _cheatsEnabled = true; + } + if (_cheatsEnabled) + { + if (gamepadState.Buttons.Y == ButtonState.Pressed) + { + InvincibilityCheat = true; + } + if (gamepadState.Buttons.B == ButtonState.Pressed) + { + CollisionsCheat = true; + } + } + } + + { + var keyboardState = Keyboard.GetState(); + if (keyboardState.IsKeyDown(Keys.LeftShift) && keyboardState.IsKeyDown(Keys.RightShift)) + { + _cheatsEnabled = true; + } + if (_cheatsEnabled) + { + if (keyboardState.IsKeyDown(Keys.I)) + { + InvincibilityCheat = true; + } + if (keyboardState.IsKeyDown(Keys.C)) + { + CollisionsCheat = true; + } + } + } + + if (_cheatsEnabled) + { + AppManager.Instance.DebugHUD.Set("cheats", _cheatsEnabled.ToString()); + AppManager.Instance.DebugHUD.Set("invincible", InvincibilityCheat.ToString()); + } + + // Работа с GamePad + if (_overrideControls ? controlsState == ControlsState.Gamepad : GamePad.GetState(0).IsConnected) + { + controlsState = ControlsState.Gamepad; + // Обработка гейм-пада. Задает Vector2 vectorMovementDirection являющийся вектором отклонения левого стика. GamePadState gamePadState = GamePad.GetState(0); vectorMovementDirection = gamePadState.ThumbSticks.Left; @@ -93,12 +140,12 @@ namespace DangerousD.GameCore { isShoot = false; } - SetState(ControlsState.Gamepad); } // Работа с KeyBoard else { + controlsState = ControlsState.Keyboard; KeyboardState keyBoardState = Keyboard.GetState(); // Состояние клавиатуры // Обработка движения вправо-влево. Меняет у вектора vectorMovementDirection значение X на -1/0/1. From 4d8172f3bdf384fb46339bd87768ddb23abce3d4 Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Fri, 18 Aug 2023 10:44:46 +0300 Subject: [PATCH 32/33] ClassDoors --- .../GameCore/GameObjects/Entities/Door.cs | 3 ++- .../GameCore/Graphics/GraphicsComponent.cs | 18 ++++++++++-------- DangerousD/GameCore/Managers/GameManager.cs | 4 ++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/Entities/Door.cs b/DangerousD/GameCore/GameObjects/Entities/Door.cs index 0e21692..bd823d5 100644 --- a/DangerousD/GameCore/GameObjects/Entities/Door.cs +++ b/DangerousD/GameCore/GameObjects/Entities/Door.cs @@ -29,7 +29,8 @@ namespace DangerousD.GameCore.GameObjects.Entities Player player = (Player)gameObject; if (player.isUping) { - + AppManager.Instance.GameManager.Remove(this); + //тут спавн лута } } } diff --git a/DangerousD/GameCore/Graphics/GraphicsComponent.cs b/DangerousD/GameCore/Graphics/GraphicsComponent.cs index 00d6298..5a659c8 100644 --- a/DangerousD/GameCore/Graphics/GraphicsComponent.cs +++ b/DangerousD/GameCore/Graphics/GraphicsComponent.cs @@ -237,23 +237,25 @@ namespace DangerousD.GameCore.Graphics public static void SetCameraPosition(Vector2 playerPosition) { CameraPosition = (playerPosition).ToPoint(); - CameraPosition.X -= 300; - CameraPosition.Y -= 200; - if (CameraPosition.X < AppManager.Instance.GameManager.CameraBorder.X) - { - CameraPosition.X = (int)AppManager.Instance.GameManager.CameraBorder.X; - } + CameraPosition.X -= 200; + CameraPosition.Y -= 120; + if (CameraPosition.X > AppManager.Instance.GameManager.CameraBorder.Y - 460) { CameraPosition.X = (int)AppManager.Instance.GameManager.CameraBorder.Y - 460; } + if (CameraPosition.Y < AppManager.Instance.GameManager.CameraBorder.Z) { CameraPosition.Y = (int)AppManager.Instance.GameManager.CameraBorder.Z; } - if (CameraPosition.Y > AppManager.Instance.GameManager.CameraBorder.W - 470) + if (CameraPosition.X < AppManager.Instance.GameManager.CameraBorder.X) { - CameraPosition.Y = (int)AppManager.Instance.GameManager.CameraBorder.W - 470; + CameraPosition.X = (int)AppManager.Instance.GameManager.CameraBorder.X; + } + if (CameraPosition.Y > AppManager.Instance.GameManager.CameraBorder.W - 240) + { + CameraPosition.Y = (int)AppManager.Instance.GameManager.CameraBorder.W - 240; } AppManager.Instance.DebugHUD.Set("CameraPosition", $"{CameraPosition.X}, {CameraPosition.Y}"); } diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 53ffa61..d7ed9ab 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -177,11 +177,11 @@ namespace DangerousD.GameCore } if (item.Pos.Y < CameraBorder.Z) { - CameraBorder.Z = item.Pos.X; + CameraBorder.Z = item.Pos.Y; } if (item.Pos.Y > CameraBorder.W) { - CameraBorder.W = item.Pos.X; + CameraBorder.W = item.Pos.Y; } } } From 34d0a9b64b084d9a1774f3be964c7698d4160779 Mon Sep 17 00:00:00 2001 From: Kaktus200020 Date: Fri, 18 Aug 2023 11:01:47 +0300 Subject: [PATCH 33/33] particlesAlreadyReady --- .../LivingEntities/Monsters/Zombie.cs | 1 + .../GameObjects/LivingEntities/Particle.cs | 43 ++++++++++++++++--- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index 5a5711e..ab0a681 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -123,6 +123,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters if (AppManager.Instance.GameManager.players[0].IsAlive) { Attack(); + } } base.OnCollision(gameObject); diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Particle.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Particle.cs index cf08319..d716fe3 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Particle.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Particle.cs @@ -12,29 +12,58 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public class Particle : LivingEntity { int delay; + bool isFall; public Particle(Vector2 position) : base(position) { Width = 14; Height = 14; Random random = new Random(); - velocity = new Vector2(random.Next(3, 15), random.Next(3,30)); + velocity = new Vector2(random.Next(-6, 6), random.Next(-8,4)); acceleration.Y = 10; delay = 100; - + isFall = false; + isOnGround = false; } - protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "GibsMoveLeftBottom", "GibsMoveLeftTop", "GibsMoveRightBottom", "GibsMoveRightTop" }, "GibsMoveRightTop"); + protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "GibsMoveLeftBottom", "GibsMoveLeftTop", "GibsMoveRightBottom", "GibsMoveRightTop", "GibsNotMove" }, "GibsMoveRightTop"); public override void Update(GameTime gameTime) { + delay--; - if (velocity.X > 0) + if (delay<=80) { - velocity.X--; + velocity.X=0; } - if(velocity.Y<=0) + if(isOnGround) { - GraphicsComponent.StartAnimation("GipsNoMove"); + GraphicsComponent.StartAnimation("GibsNotMove"); + Width = 16; + Height = 5; + isFall=true; + ; } + + else if(!isFall) + { + Width = 14; + Height= 14; + if (velocity.Y<0 && velocity.X>0) + { + GraphicsComponent.StartAnimation("GibsMoveRightTop"); + } + else if (velocity.Y < 0 && velocity.X < 0) + { + GraphicsComponent.StartAnimation("GibsMoveLeftTop"); + } + else if (velocity.Y > 0 && velocity.X > 0) + { + GraphicsComponent.StartAnimation("GibsMoveRightBottom"); + } + else if (velocity.Y > 0 && velocity.X < 0) + { + GraphicsComponent.StartAnimation("GibsMoveLeftBottom"); + } + } if(delay<=0) { AppManager.Instance.GameManager.Remove(this);