From 3962ce4eac48e626a5bff040bf1358ff81acec7a Mon Sep 17 00:00:00 2001 From: N4K Date: Fri, 18 Aug 2023 00:25:34 +0300 Subject: [PATCH 01/39] 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 ae6aff16a5ac0544ab70d85d57d810cc657a9fc6 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 00:34:36 +0300 Subject: [PATCH 02/39] 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 03/39] 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 04/39] 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 05/39] 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 06/39] 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 07/39] 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 08/39] 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 09/39] 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 10/39] 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 11/39] 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 de702b6a8ed76d385bf9898438e158ddb184513f Mon Sep 17 00:00:00 2001 From: polten0 Date: Fri, 18 Aug 2023 02:00:58 +0300 Subject: [PATCH 12/39] FirstNotGoodWorkUI --- DangerousD/GameCore/GUI/AbstractGui.cs | 133 +++++++++++++++++++++++++ MonogameLibrary/UI/Elements/Button.cs | 6 +- 2 files changed, 138 insertions(+), 1 deletion(-) diff --git a/DangerousD/GameCore/GUI/AbstractGui.cs b/DangerousD/GameCore/GUI/AbstractGui.cs index 7f7b212..6615820 100644 --- a/DangerousD/GameCore/GUI/AbstractGui.cs +++ b/DangerousD/GameCore/GUI/AbstractGui.cs @@ -1,8 +1,13 @@ using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Xml; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; using MonogameLibrary.UI.Base; +using MonogameLibrary.UI.Elements; namespace DangerousD.GameCore.GUI; @@ -10,6 +15,9 @@ public abstract class AbstractGui : IDrawableObject { protected UIManager Manager = new(); protected List Elements = new(); + private List ActiveElements; + protected DrawableUIElement SelectedElement; + private bool isPressed = false; public AbstractGui() { @@ -22,6 +30,16 @@ public abstract class AbstractGui : IDrawableObject Manager.Initialize(AppManager.Instance.GraphicsDevice); this.graphicsDevice = graphicsDevice; CreateUI(); + ActiveElements = new List(); + foreach (var element in Elements) + { + if (CheckOnBadElements(element)) + { + ActiveElements.Add(element); + } + } + if (ActiveElements.Count > 0) { SelectedElement = ActiveElements.First(); } + } public virtual void LoadContent() @@ -31,6 +49,25 @@ public abstract class AbstractGui : IDrawableObject public virtual void Update(GameTime gameTime) { + string state = AppManager.Instance.InputManager.currentControlsState; + + if (ActiveElements.Count != 0) + { + switch (state) + { + case "Gamepad": + GamePadState gamePadState = GamePad.GetState(0); + GamepadInput(gamePadState); + break; + case "Keyboard": + KeyboardState keyBoardState = Keyboard.GetState(0); + KeyBoardInput(keyBoardState); + break; + default: + break; + } + } + Manager.Update(); } @@ -38,4 +75,100 @@ public abstract class AbstractGui : IDrawableObject { Manager.Draw(spriteBatch); } + protected virtual void GamepadInput(GamePadState gamePadState) + { + if (gamePadState.DPad.Up == ButtonState.Pressed && !isPressed) + { + isPressed = true; + ChangeSelectedElement(-1); + } + else if (gamePadState.DPad.Down == ButtonState.Pressed && !isPressed) + { + isPressed = true; + ChangeSelectedElement(1); + } + else if (gamePadState.Buttons.A == ButtonState.Pressed && !isPressed) + { + Debug.WriteLine("ssss"); + isPressed = true; + if (SelectedElement is ButtonText) + { + Button button = SelectedElement as ButtonText; + button.CallLeftBtnEvent(); + } + } + else if (isPressed) + { + isPressed = false; + } + } + protected virtual void KeyBoardInput(KeyboardState keyboardState) + { + if (keyboardState.IsKeyDown(Keys.Up) && !isPressed) + { + isPressed = true; + ChangeSelectedElement(-1); + } + else if (keyboardState.IsKeyDown(Keys.Down) && !isPressed) + { + isPressed = true; + ChangeSelectedElement(1); + } + else if (keyboardState.IsKeyDown(Keys.Enter) && !isPressed) + { + isPressed = true; + if (SelectedElement is Button) + { + Button button = SelectedElement as Button; + button.CallLeftBtnEvent(); + } + } + else if (isPressed) + { + isPressed = false; + } + } + private void ChangeSelectedElement(int x) // Меняет выбранный элемент + { + for (int i = 0; i < ActiveElements.Count; i++) + { + if (ActiveElements[i] == SelectedElement) + { + if (i == 0) + { + SelectedElement = ActiveElements.Last(); + } + else + { + if (i == ActiveElements.Count - 1 && x >= 1) + { + SelectedElement = ActiveElements.First(); + } + else + { + SelectedElement = ActiveElements[i + x]; + } + + } + + } + + } + } + private bool CheckOnBadElements(DrawableUIElement element) + { + if (element is Button) + { + return true; + } + else if (element is ButtonText) + { + return true; + } + else if (element is CheckBox) + { + return true; + } + else return false; + } } \ No newline at end of file diff --git a/MonogameLibrary/UI/Elements/Button.cs b/MonogameLibrary/UI/Elements/Button.cs index cf7d5ce..051f31f 100644 --- a/MonogameLibrary/UI/Elements/Button.cs +++ b/MonogameLibrary/UI/Elements/Button.cs @@ -40,7 +40,7 @@ namespace MonogameLibrary.UI.Elements if (mouseState.LeftButton != prevmouseState.LeftButton) { hoverState = HoverState.Pressing; - LeftButtonPressed?.Invoke(); + CallLeftBtnEvent(); return true; } } @@ -77,5 +77,9 @@ namespace MonogameLibrary.UI.Elements DrawText(_spriteBatch); } + public void CallLeftBtnEvent() + { + LeftButtonPressed?.Invoke(); + } } } From ba49674c3b963d1dff9caf1d8ec3f9246fd44f98 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 02:13:01 +0300 Subject: [PATCH 13/39] 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 14/39] 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 15/39] 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 1f3108adcdd37ef6bbcf3653bf7ab4067dcde61c Mon Sep 17 00:00:00 2001 From: polten0 Date: Fri, 18 Aug 2023 02:46:59 +0300 Subject: [PATCH 16/39] finish1IterOfSwitchingUI --- DangerousD/GameCore/GUI/AbstractGui.cs | 51 ++++++++++--------- .../LivingEntities/Player/Player.cs | 1 + DangerousD/GameCore/InputManager.cs | 1 + MonogameLibrary/UI/Elements/Button.cs | 2 +- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/DangerousD/GameCore/GUI/AbstractGui.cs b/DangerousD/GameCore/GUI/AbstractGui.cs index 6615820..34bea14 100644 --- a/DangerousD/GameCore/GUI/AbstractGui.cs +++ b/DangerousD/GameCore/GUI/AbstractGui.cs @@ -51,24 +51,25 @@ public abstract class AbstractGui : IDrawableObject { string state = AppManager.Instance.InputManager.currentControlsState; + + if (ActiveElements.Count != 0) { - switch (state) + if (state == "Gamepad") { - case "Gamepad": - GamePadState gamePadState = GamePad.GetState(0); - GamepadInput(gamePadState); - break; - case "Keyboard": - KeyboardState keyBoardState = Keyboard.GetState(0); - KeyBoardInput(keyBoardState); - break; - default: - break; + GamePadState gamePadState = GamePad.GetState(0); + GamepadInput(gamePadState); + } + else if (state == "Keyboard" || state == "Mouse") + { + KeyboardState keyBoardState = Keyboard.GetState(); + KeyBoardInput(keyBoardState); } } Manager.Update(); + + (SelectedElement as Button).hoverState = MonogameLibrary.UI.Enums.HoverState.Hovering; } public virtual void Draw(SpriteBatch spriteBatch) @@ -81,6 +82,7 @@ public abstract class AbstractGui : IDrawableObject { isPressed = true; ChangeSelectedElement(-1); + Debug.WriteLine("switch"); } else if (gamePadState.DPad.Down == ButtonState.Pressed && !isPressed) { @@ -89,7 +91,6 @@ public abstract class AbstractGui : IDrawableObject } else if (gamePadState.Buttons.A == ButtonState.Pressed && !isPressed) { - Debug.WriteLine("ssss"); isPressed = true; if (SelectedElement is ButtonText) { @@ -97,7 +98,9 @@ public abstract class AbstractGui : IDrawableObject button.CallLeftBtnEvent(); } } - else if (isPressed) + else if (isPressed && (gamePadState.Buttons.A == ButtonState.Released && + gamePadState.DPad.Down == ButtonState.Released && + gamePadState.DPad.Up == ButtonState.Released)) { isPressed = false; } @@ -123,7 +126,9 @@ public abstract class AbstractGui : IDrawableObject button.CallLeftBtnEvent(); } } - else if (isPressed) + else if (isPressed && (keyboardState.IsKeyUp(Keys.Enter) && + keyboardState.IsKeyUp(Keys.Down) && + keyboardState.IsKeyUp(Keys.Up))) { isPressed = false; } @@ -134,25 +139,25 @@ public abstract class AbstractGui : IDrawableObject { if (ActiveElements[i] == SelectedElement) { - if (i == 0) + if (i + x >= ActiveElements.Count) { - SelectedElement = ActiveElements.Last(); + SelectedElement = ActiveElements.First(); + return; } else { - if (i == ActiveElements.Count - 1 && x >= 1) + if (i + x < 0) { - SelectedElement = ActiveElements.First(); + SelectedElement = ActiveElements.Last(); + return; } else { SelectedElement = ActiveElements[i + x]; + return; } - } - } - } } private bool CheckOnBadElements(DrawableUIElement element) @@ -165,10 +170,6 @@ public abstract class AbstractGui : IDrawableObject { return true; } - else if (element is CheckBox) - { - return true; - } else return false; } } \ 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 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 { diff --git a/DangerousD/GameCore/InputManager.cs b/DangerousD/GameCore/InputManager.cs index c171d6b..3846bc2 100644 --- a/DangerousD/GameCore/InputManager.cs +++ b/DangerousD/GameCore/InputManager.cs @@ -158,6 +158,7 @@ namespace DangerousD.GameCore { isShoot = false; } + SetState(ControlsState.Keyboard); } } } diff --git a/MonogameLibrary/UI/Elements/Button.cs b/MonogameLibrary/UI/Elements/Button.cs index 051f31f..769335f 100644 --- a/MonogameLibrary/UI/Elements/Button.cs +++ b/MonogameLibrary/UI/Elements/Button.cs @@ -16,7 +16,7 @@ namespace MonogameLibrary.UI.Elements public delegate void OnButtonPressed(); public event OnButtonPressed? RightButtonPressed; public event OnButtonPressed? LeftButtonPressed; - protected HoverState hoverState = HoverState.None; + public HoverState hoverState = HoverState.None; public Button(UIManager manager, int layerIndex = 0) : base(manager, layerIndex) { From c9523578e4c02bbc3ea83b5873faa79a4a3a5f8d Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Fri, 18 Aug 2023 02:59:53 +0300 Subject: [PATCH 17/39] 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 731e69d92e8e9a84cfc5c59df363d5e0cff30b64 Mon Sep 17 00:00:00 2001 From: Kaktus200020 Date: Fri, 18 Aug 2023 03:03:11 +0300 Subject: [PATCH 18/39] tiltedSlime --- .../LivingEntities/Monsters/Slime.cs | 111 ++++++++++++++---- DangerousD/GameCore/Managers/AppManager.cs | 2 +- .../GameCore/Managers/PhysicsManager.cs | 15 +++ 3 files changed, 107 insertions(+), 21 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs index 0e5e954..e9cba93 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs @@ -13,7 +13,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public class Slime : CoreEnemy { private bool isGoRight = true; - private bool isDown = false; + private bool isDown = true; int leftBorder; int rightBorder; bool isAttaking = false; @@ -38,13 +38,14 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Attack() { - + } public void Jump() { var getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle(0, 0, 100, 100)); velocity.X = 0; Height = 32; + if (isGoRight && isDown) { if (GraphicsComponent.GetCurrentAnimation != "SlimeReadyJumpLeftBottom") @@ -54,8 +55,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters delay--; if (delay <= 0) { - isJumping = true; + velocity = new Vector2(5, -3); + acceleration.Y = 0; if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpLeftBottom") { GraphicsComponent.StartAnimation("SlimeJumpLeftBottom"); @@ -71,17 +73,19 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } else if (!isGoRight && isDown) { - if (GraphicsComponent.GetCurrentAnimation != "SlimeReadyJumpRightTop") + if (GraphicsComponent.GetCurrentAnimation != "SlimeReadyJumpRightBottom") { - GraphicsComponent.StartAnimation("SlimeReadyJumpRightTop"); + GraphicsComponent.StartAnimation("SlimeReadyJumpRightBottom"); } delay--; if (delay <= 0) { + velocity = new Vector2(-5, -3); - if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpRightTop") + acceleration.Y = 0; + if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpRightBottom") { - GraphicsComponent.StartAnimation("SlimeJumpRightTop"); + GraphicsComponent.StartAnimation("SlimeJumpRightBottom"); } getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y - 5, 48, 5)); if (getCols.Count > 0) @@ -101,17 +105,20 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters delay--; if (delay <= 0) { - isJumping = true; + velocity = new Vector2(5, 3); + acceleration.Y = 0; if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpLeftTop") { GraphicsComponent.StartAnimation("SlimeJumpLeftTop"); } - getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y + Height, 48, 5)); + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X+1, (int)Pos.Y + Height, 46, 5)); + if (getCols.Count > 0) { isJumping = false; isDown = true; + acceleration.Y = 10; } } @@ -126,15 +133,18 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters if (delay <= 0) { velocity = new Vector2(-5, 3); + acceleration.Y = 0; if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpRightTop") { GraphicsComponent.StartAnimation("SlimeJumpRightTop"); } - getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y + Height, 48, 5)); + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X+1, (int)Pos.Y + Height, 46, 5)); if (getCols.Count > 0) { isJumping = false; isDown = true; + acceleration.Y = 10; + } } @@ -144,8 +154,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } public override void Draw(SpriteBatch spriteBatch) { - spriteBatch.Draw(debugTexture, new Rectangle((int)Pos.X, (int)Pos.Y - 5, 48, 5), Color.White); - spriteBatch.Draw(debugTexture, new Rectangle((int)Pos.X, (int)Pos.Y + Height, 48, 5), Color.White); + + base.Draw(spriteBatch); } public override void Death() @@ -197,15 +207,24 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters velocity.X = -monster_speed; } - - if (Pos.X >= rightBorder) + var getCols= AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y + Height / 2 - 2, 50, 2)); ; + if (isGoRight) { - isGoRight = false; + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y + Height / 2 - 2, 51, 2)); } - - else if (Pos.X <= leftBorder) + else { - isGoRight = true; + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X-3, (int)Pos.Y + Height / 2 - 2, 51, 2)); + } + + + foreach(var item in getCols) + { + if(item is MapObject) + { + isGoRight = !isGoRight; + break; + } } } public override void Update(GameTime gameTime) @@ -227,8 +246,25 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters acceleration.Y = -acceleration.Y; } } - //if (!isAttaking){ Move(gameTime); } - + Attack(); + + if (!isJumping) + { + if (isDown) + { + Jump(); + } + else if(IsInAim()) + { + Jump(); + } + else + { + Move(gameTime); + } + + } + base.Update(gameTime); } @@ -237,10 +273,45 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { } + public bool IsInAim() + { + var getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y + Height, 48, 5)); + + if (isGoRight && !isDown) + { + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X + Width, (int)Pos.Y + Height, 200, 500), false); + if (getCols.Count > 0) + { + return true; + } + } + else if (!isGoRight && !isDown) + { + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 200, (int)Pos.Y + Height, 200, 500), false); + if (getCols.Count > 0) + { + return true; + } + } + + return false; + + } public override void Attack(GameTime gameTime) { } + public override void OnCollision(GameObject gameObject) + { + if (gameObject is Player) + { + if (AppManager.Instance.GameManager.players[0].IsAlive) + { + AppManager.Instance.GameManager.players[0].Death(name); + } + } + base.OnCollision(gameObject); + } } } diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 5e53677..e173abb 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/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 7899c98..a2fd4f2 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -234,6 +234,21 @@ namespace DangerousD.GameCore.Managers } return intersected; } + public List CheckRectangle(Rectangle rectangle, bool player) + { + var gameObjects = AppManager.Instance.GameManager.GetPlayer1; + List intersected = new List(); + + + + if (gameObjects.Rectangle.Intersects(rectangle)) + { + intersected.Add(gameObjects); + } + + + return intersected; + } public List CheckRectangle(Rectangle rectangle) { var gameObjects = AppManager.Instance.GameManager.mapObjects; From f26c88ffdcbe56f6b27a22afea47d992a1d714cd Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 03:16:42 +0300 Subject: [PATCH 19/39] 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 20/39] 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 26/39] 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 27/39] 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 28/39] 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 29/39] 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 30/39] 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 31/39] 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 32/39] 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 33/39] 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 34/39] 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 35/39] 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); From 99585effd24754f24316d69e6abac631f8e4e5ba Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 11:12:25 +0300 Subject: [PATCH 36/39] Door render --- DangerousD/Content/Content.mgcb | 60 +++-- DangerousD/Content/Door.tsx | 4 + DangerousD/Content/doors.png | Bin 0 -> 472 bytes DangerousD/Content/lvl.tmx | 215 ++++-------------- .../GameCore/GameObjects/Entities/Door.cs | 17 +- .../GameObjects/Entities/Items/Coin.cs | 13 ++ .../GameObjects/Entities/Items/Diamond.cs | 13 ++ DangerousD/GameCore/Managers/MapManager.cs | 13 +- 8 files changed, 141 insertions(+), 194 deletions(-) create mode 100644 DangerousD/Content/Door.tsx create mode 100644 DangerousD/Content/doors.png create mode 100644 DangerousD/GameCore/GameObjects/Entities/Items/Coin.cs create mode 100644 DangerousD/GameCore/GameObjects/Entities/Items/Diamond.cs diff --git a/DangerousD/Content/Content.mgcb b/DangerousD/Content/Content.mgcb index 37d9842..9924833 100644 --- a/DangerousD/Content/Content.mgcb +++ b/DangerousD/Content/Content.mgcb @@ -21,18 +21,6 @@ /processorParam:TextureFormat=Compressed /build:ButtonFont.spritefont -#begin checkboxs_off-on.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:checkboxs_off-on.png - #begin checkboxs_off.png /importer:TextureImporter /processor:TextureProcessor @@ -45,6 +33,18 @@ /processorParam:TextureFormat=Color /build:checkboxs_off.png +#begin checkboxs_off-on.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:checkboxs_off-on.png + #begin checkboxs_on.png /importer:TextureImporter /processor:TextureProcessor @@ -87,6 +87,18 @@ /processorParam:Quality=Best /build:DoomTestSong.mp3 +#begin doors.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:doors.png + #begin Font_12.spritefont /importer:FontDescriptionImporter /processor:FontDescriptionProcessor @@ -235,18 +247,6 @@ /processorParam:TextureFormat=Color /build:textboxbackground1-1.png -#begin textboxbackground2-1.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:textboxbackground2-1.png - #begin textboxbackground2,5-1.png /importer:TextureImporter /processor:TextureProcessor @@ -259,6 +259,18 @@ /processorParam:TextureFormat=Color /build:textboxbackground2,5-1.png +#begin textboxbackground2-1.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:textboxbackground2-1.png + #begin textboxbackground6-1.png /importer:TextureImporter /processor:TextureProcessor diff --git a/DangerousD/Content/Door.tsx b/DangerousD/Content/Door.tsx new file mode 100644 index 0000000..a250dd5 --- /dev/null +++ b/DangerousD/Content/Door.tsx @@ -0,0 +1,4 @@ + + + + diff --git a/DangerousD/Content/doors.png b/DangerousD/Content/doors.png new file mode 100644 index 0000000000000000000000000000000000000000..60742ae1fa145b78510306d091579331a2f8e571 GIT binary patch literal 472 zcmV;}0Vn>6P)Px#1ZP1_K>z@;j|==^1poj55>QN3Mg08ysHms_002}}RH#${{QOj~pRX+d000Sa zNLh0L01m?d01m?e$8V@)0003`NkllD_|0 zriv;E*miI^r6ExsU-ls%1HAwNTkh&HAoAaVAS?0; zv>9v#0JK;fFjj%4A%LT$=?d=wK+rir0p9u0{v#`Z;xCv2P!Hm&jeLTLG6z%z9*o#l z0T&u>;a5;913DHR@FTvjU7zANEG^64VFF+JQeqw*W_$s{$Sj z%Pd%db*1stR3I53zX45BVBhzgscArR<%gty39J*q`z!D}0yP&6*neigF#)b~h&TgY z6Cg~1+c~^vK)wQi$y)+wDaG}f2=p}8n*nqxt5IIoe!Uf*c50_>w{wuKY%y_@d+@V)p0nhWBdcy;MKKc8ron0 O0000 - + - + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -311,137 +312,7 @@ - - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,149,152,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,150,153,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,151,154,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,149,152,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,150,153,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,151,154,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,149,152,0,0,0,0,0,0,0,0,0,0 - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,79,80,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,92,93,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,105,106,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,149,152,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,150,153,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,151,154,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,149,152,0,0,0,0 - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,149,152,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,150,153,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,151,154,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,149,152,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,150,153,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,151,154,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - -0,0,0,0,150,153,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,151,154,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - -0,0,0,0,0,0,0,0,0,0,150,153,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,151,154,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,149,152,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,150,153,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,151,154,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,149,152,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,150,153,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,151,154,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - - - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -466,7 +337,7 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,147,199,199,148,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -517,7 +388,7 @@ - + 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, @@ -559,15 +430,15 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,178,179,157,157,157,157,157,157,157,157,157,157,157, -157,157,157,191,192,157,157,252,253,157,157,157,157,157,157,258, -157,157,157,157,157,157,157,265,266,157,157,157,696,697,157,271, -204,204,204,204,204,204,204,278,279,204,204,204,709,710,204,284, +157,157,157,191,192,157,157,149,152,157,157,157,157,157,157,258, +157,157,157,157,157,157,157,150,153,157,157,157,696,697,157,271, +204,204,204,204,204,204,204,151,154,204,204,204,709,710,204,284, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157, -157,157,157,157,157,157,258,157,157,157,252,253,157,157,157,157, -157,157,157,157,157,157,271,157,157,157,265,266,157,696,697,157, -157,157,272,204,204,204,284,204,204,204,278,279,204,709,710,204, +157,157,157,157,157,157,258,157,157,157,149,152,157,157,157,157, +157,157,157,157,157,157,271,157,157,157,150,153,157,696,697,157, +157,157,272,204,204,204,284,204,204,204,151,154,204,709,710,204, 157,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 157,157,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,157,157,157,167,157,157,209,210, @@ -589,25 +460,25 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 211,212,157,157,157,157,157,157,157,157,157,157,157,157,157,157, -224,225,157,157,252,253,157,248,249,157,157,258,157,157,157,157 +224,225,157,157,149,152,157,248,249,157,157,258,157,157,157,157 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -144,144,144,144,144,144,144,144,621,622,144,144,144,0,0,0, -157,157,157,157,157,157,157,157,634,635,157,157,157,0,0,0, -157,248,249,157,157,157,272,157,647,648,157,272,157,0,0,0, +144,144,144,144,144,144,144,144,79,80,144,144,144,0,0,0, +157,157,157,157,157,157,157,157,92,93,157,157,157,0,0,0, +157,248,249,157,157,157,272,157,105,106,157,272,157,0,0,0, 157,250,251,157,157,157,145,147,199,200,148,145,157,0,0,0, 204,239,240,204,204,204,204,160,199,200,161,204,204,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,0,0,0, 178,179,157,157,157,157,157,243,157,157,157,157,157,0,0,0, -191,192,157,157,157,157,157,256,257,157,252,253,157,0,0,0, -157,157,157,157,157,157,157,269,270,157,265,266,157,0,0,0, -204,204,204,204,204,204,204,282,283,204,278,279,204,0,0,0, +191,192,157,157,157,157,157,256,257,157,149,152,157,0,0,0, +157,157,157,157,157,157,157,269,270,157,150,153,157,0,0,0, +204,204,204,204,204,204,204,282,283,204,151,154,204,0,0,0, 0,0,0,147,199,148,0,0,0,0,0,0,0,0,0,0, 144,144,144,147,199,148,144,144,144,144,144,144,144,0,0,0, 157,157,157,147,199,148,157,243,157,157,157,157,157,0,0,0, -254,255,157,147,199,148,157,256,257,157,252,253,157,0,0,0 +254,255,157,147,199,148,157,256,257,157,149,152,157,0,0,0 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, @@ -633,9 +504,9 @@ 29,29,29,29,0,0,0,0,0,0,0,0,157,157,260,157, 29,29,29,29,0,0,144,144,144,144,144,144,157,157,260,157, 29,29,29,29,0,0,157,167,157,157,157,157,157,157,260,157, -29,29,29,29,0,0,157,180,157,252,253,157,157,157,260,157, -29,29,29,29,0,0,157,193,157,265,266,157,157,157,260,157, -6,29,29,29,0,0,204,204,204,278,279,204,272,157,260,157, +29,29,29,29,0,0,157,180,157,149,152,157,157,157,260,157, +29,29,29,29,0,0,157,193,157,150,153,157,157,157,260,157, +6,29,29,29,0,0,204,204,204,151,154,204,272,157,260,157, 29,29,29,29,0,0,0,0,0,0,0,0,0,157,260,157, 29,29,29,29,0,0,144,144,144,144,144,144,144,157,260,157, 29,29,29,29,0,0,157,157,157,157,157,157,157,219,220,221, @@ -657,15 +528,15 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,243,157,157,209,210,211,212,157, -157,252,253,157,157,258,157,157,256,257,157,222,223,224,225,157, -218,265,266,157,157,271,157,157,269,270,157,235,236,237,238,157, -231,278,279,204,204,284,204,204,282,283,204,204,204,204,204,204, +157,149,152,157,157,258,157,157,256,257,157,222,223,224,225,157, +218,150,153,157,157,271,157,157,269,270,157,235,236,237,238,157, +231,151,154,204,204,284,204,204,282,283,204,204,204,204,204,204, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -237,238,157,157,265,266,157,250,251,157,157,271,157,157,157,157, -204,204,204,204,278,279,204,239,240,204,204,284,204,204,204,204, +237,238,157,157,150,153,157,250,251,157,157,271,157,157,157,157, +204,204,204,204,151,154,204,239,240,204,204,284,204,204,204,204, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,157,243,157,157,209,210,211,212, @@ -682,26 +553,26 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -267,268,157,147,199,148,157,269,270,157,265,266,218,0,0,0, -280,281,204,160,200,161,204,282,283,204,278,279,231,0,0,0, +267,268,157,147,199,148,157,269,270,157,150,153,218,0,0,0, +280,281,204,160,200,161,204,282,283,204,151,154,231,0,0,0, 0,0,0,147,199,148,0,0,0,0,0,0,0,0,0,0, 144,144,144,147,199,148,144,144,144,144,144,144,144,0,0,0, 157,157,157,147,199,148,157,157,157,157,157,157,157,0,0,0, -157,157,157,147,199,148,157,157,157,157,252,253,157,0,0,0, -157,157,157,147,199,148,157,217,157,157,265,266,157,0,0,0, -204,204,204,160,200,161,204,230,204,204,278,279,204,0,0,0, +157,157,157,147,199,148,157,157,157,157,149,152,157,0,0,0, +157,157,157,147,199,148,157,217,157,157,150,153,157,0,0,0, +204,204,204,160,200,161,204,230,204,204,151,154,204,0,0,0, 0,0,0,147,199,148,0,0,0,0,0,0,0,0,0,0, 144,144,144,147,199,148,144,144,144,144,144,144,144,0,0,0, 157,157,159,160,200,161,162,157,157,157,157,157,157,0,0,0, -157,171,172,173,199,174,175,176,157,157,252,253,157,0,0,0, -183,184,185,186,199,187,188,189,190,157,265,266,157,0,0,0, -196,197,198,199,199,200,201,202,203,204,278,279,204,0,0,0, +157,171,172,173,199,174,175,176,157,157,149,152,157,0,0,0, +183,184,185,186,199,187,188,189,190,157,150,153,157,0,0,0, +196,197,198,199,199,200,201,202,203,204,151,154,204,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - + @@ -756,4 +627,16 @@ + + + + + + + + + + + + diff --git a/DangerousD/GameCore/GameObjects/Entities/Door.cs b/DangerousD/GameCore/GameObjects/Entities/Door.cs index 0e21692..9c8afe6 100644 --- a/DangerousD/GameCore/GameObjects/Entities/Door.cs +++ b/DangerousD/GameCore/GameObjects/Entities/Door.cs @@ -6,21 +6,34 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.Xna.Framework.Graphics; namespace DangerousD.GameCore.GameObjects.Entities { public class Door : Entity { - public Door(Vector2 position) : base(position) + private Rectangle _sourceRectangle; + + public Door(Vector2 position, Vector2 size, Rectangle sourceRectangle) : base(position) { + _sourceRectangle = sourceRectangle; + Width = (int)size.X; + Height = (int)size.Y; } - protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "SilasBallMove" }, "SilasBallMove"); + protected override GraphicsComponent GraphicsComponent { get; } = new("doors"); + public override void Update(GameTime gameTime) { base.Update(gameTime); } + + public override void Draw(SpriteBatch spriteBatch) + { + GraphicsComponent.DrawAnimation(Rectangle, spriteBatch, _sourceRectangle); + //spriteBatch.Draw(debugTexture, new Rectangle(Rectangle.X - GraphicsComponent.CameraPosition.X, Rectangle.Y - GraphicsComponent.CameraPosition.Y, Rectangle.Width, Rectangle.Height), Color.White); + } public override void OnCollision(GameObject gameObject) { base.OnCollision(gameObject); diff --git a/DangerousD/GameCore/GameObjects/Entities/Items/Coin.cs b/DangerousD/GameCore/GameObjects/Entities/Items/Coin.cs new file mode 100644 index 0000000..a42900e --- /dev/null +++ b/DangerousD/GameCore/GameObjects/Entities/Items/Coin.cs @@ -0,0 +1,13 @@ +using DangerousD.GameCore.Graphics; +using Microsoft.Xna.Framework; + +namespace DangerousD.GameCore.GameObjects.Entities.Items; + +public class Coin : Entity +{ + public Coin(Vector2 position) : base(position) + { + } + + protected override GraphicsComponent GraphicsComponent { get; } +} \ No newline at end of file diff --git a/DangerousD/GameCore/GameObjects/Entities/Items/Diamond.cs b/DangerousD/GameCore/GameObjects/Entities/Items/Diamond.cs new file mode 100644 index 0000000..7f81c6b --- /dev/null +++ b/DangerousD/GameCore/GameObjects/Entities/Items/Diamond.cs @@ -0,0 +1,13 @@ +using DangerousD.GameCore.Graphics; +using Microsoft.Xna.Framework; + +namespace DangerousD.GameCore.GameObjects.Entities.Items; + +public class Diamond : Entity +{ + public Diamond(Vector2 position) : base(position) + { + } + + protected override GraphicsComponent GraphicsComponent { get; } +} \ No newline at end of file diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index 6ab49b0..d45d53d 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -9,15 +9,18 @@ using Microsoft.Xna.Framework.Graphics; using System.Xml.Serialization; using DangerousD.GameCore.GameObjects; using System.Globalization; +using System.IO; +using DangerousD.GameCore.GameObjects.Entities; using DangerousD.GameCore.GameObjects.LivingEntities; namespace DangerousD.GameCore.Managers { public class MapManager { - private int _columns; + private int _scale; - + private int _columns; + public MapManager(int scale) { _scale = scale; @@ -78,6 +81,7 @@ namespace DangerousD.GameCore.Managers private void LoadTilesData() { + XmlDocument xml = new(); xml.Load($"../../../Content/map.tsx"); XmlNode root = xml.DocumentElement; @@ -102,6 +106,11 @@ namespace DangerousD.GameCore.Managers { inst = (Entity)Activator.CreateInstance(type, pos, false); } + else if (type.Equals(typeof(Door))) + { + int gid = entity.Attributes["type"] is not null ? int.Parse(entity.Attributes["type"].Value) : 0; + inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle(0, 0, 32, 48)); + } else { inst = (Entity)Activator.CreateInstance(type, pos); From a0de50ba70c4f3fe49613b802e1ec76f18f86eef Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Fri, 18 Aug 2023 11:39:01 +0300 Subject: [PATCH 37/39] Fix --- DangerousD/GameCore/Managers/PhysicsManager.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index dee4c27..4e8216e 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -142,14 +142,18 @@ namespace DangerousD.GameCore.Managers } private void CheckCollisionsE_LE(List entities, List livingEntities) { - foreach (var entity in entities) + for (int i = 0; i < entities.Count; i++) { - foreach (var livingEntity in livingEntities) + + + for (int j = 0; j < livingEntities.Count; j++) { - if (livingEntity.Rectangle.Intersects(entity.Rectangle)) + + + if (livingEntities[j].Rectangle.Intersects(entities[i].Rectangle)) { - livingEntity.OnCollision(entity); - entity.OnCollision(livingEntity); + livingEntities[j].OnCollision(entities[i]); + entities[i].OnCollision(livingEntities[j]); } } } From bf04d373b9279ac28f9a3b00e66b938129240c17 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 11:47:24 +0300 Subject: [PATCH 38/39] Door fix --- DangerousD/Content/lvl.tmx | 33 +++++++++++++--------- DangerousD/GameCore/Managers/MapManager.cs | 4 +-- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/DangerousD/Content/lvl.tmx b/DangerousD/Content/lvl.tmx index b26fa01..df88666 100644 --- a/DangerousD/Content/lvl.tmx +++ b/DangerousD/Content/lvl.tmx @@ -1,8 +1,13 @@ - - - - + + + + + + + + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -32,13 +37,13 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,272,0,272,0,0,0,0,0,0,0,0,0,0, 52,52,52,52,0,52,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, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +272,0,0,0,0,0,0,0,272,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -136,13 +141,13 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,272,0,0,0,0,0,272,0,0,0,0,0,0,0,0, 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, +0,0,272,0,0,0,0,0,0,0,0,0,0,0,0,0, 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, @@ -414,13 +419,13 @@ 29,29,29,29,0,0,157,157,167,157,157,157,157,157,260,157, 29,29,29,29,0,0,157,157,180,157,254,255,157,157,260,157, 29,29,29,29,0,0,157,157,193,157,267,268,157,157,260,157, -29,29,29,29,0,0,204,204,204,204,280,281,204,272,260,272, +29,29,29,29,0,0,204,204,204,204,280,281,204,0,260,0, 29,29,29,29,0,0,147,199,148,0,0,0,0,0,260,0, 29,29,29,29,0,0,147,199,148,144,144,144,144,144,260,144, 29,29,29,29,0,0,147,199,148,157,157,157,157,157,260,157, 29,29,29,29,0,0,147,199,148,157,157,157,157,157,260,157, 29,29,29,29,0,0,147,199,148,157,157,157,157,157,260,157, -29,29,29,29,0,0,147,199,148,204,272,157,157,157,260,157, +29,29,29,29,0,0,147,199,148,204,0,157,157,157,260,157, 29,29,29,29,0,0,147,199,148,0,0,157,157,157,260,157, 29,29,29,29,0,0,147,199,148,144,144,157,157,157,260,157, 29,29,29,29,0,0,147,199,148,157,157,157,157,157,260,157, @@ -438,7 +443,7 @@ 157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157, 157,157,157,157,157,157,258,157,157,157,149,152,157,157,157,157, 157,157,157,157,157,157,271,157,157,157,150,153,157,696,697,157, -157,157,272,204,204,204,284,204,204,204,151,154,204,709,710,204, +157,157,0,204,204,204,284,204,204,204,151,154,204,709,710,204, 157,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 157,157,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,157,157,157,167,157,157,209,210, @@ -500,13 +505,13 @@ 29,29,29,29,0,0,147,199,148,157,157,157,157,157,260,157, -29,29,29,29,0,0,160,200,161,204,204,272,157,157,260,157, +29,29,29,29,0,0,160,200,161,204,204,0,157,157,260,157, 29,29,29,29,0,0,0,0,0,0,0,0,157,157,260,157, 29,29,29,29,0,0,144,144,144,144,144,144,157,157,260,157, 29,29,29,29,0,0,157,167,157,157,157,157,157,157,260,157, 29,29,29,29,0,0,157,180,157,149,152,157,157,157,260,157, 29,29,29,29,0,0,157,193,157,150,153,157,157,157,260,157, -6,29,29,29,0,0,204,204,204,151,154,204,272,157,260,157, +6,29,29,29,0,0,204,204,204,151,154,204,0,157,260,157, 29,29,29,29,0,0,0,0,0,0,0,0,0,157,260,157, 29,29,29,29,0,0,144,144,144,144,144,144,144,157,260,157, 29,29,29,29,0,0,157,157,157,157,157,157,157,219,220,221, @@ -518,7 +523,7 @@ 157,157,157,157,267,268,157,696,697,157,157,193,157,157,235,236, -157,272,204,204,280,281,204,709,710,204,204,204,204,204,204,204, +157,0,204,204,280,281,204,709,710,204,204,204,204,204,204,204, 157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 157,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,178,179,157,157,157,157,157,157,157,157,157,157,157, diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index d45d53d..9087d97 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -108,8 +108,8 @@ namespace DangerousD.GameCore.Managers } else if (type.Equals(typeof(Door))) { - int gid = entity.Attributes["type"] is not null ? int.Parse(entity.Attributes["type"].Value) : 0; - inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle(0, 0, 32, 48)); + int gid = entity.Attributes["gid"] is not null ? int.Parse(entity.Attributes["gid"].Value) : 0; + inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle((gid - 872)*32, 0, 32, 48)); } else { From 2d76a9bc14e8b325458a8cc652ceaa3c2d2f5429 Mon Sep 17 00:00:00 2001 From: SergoDobro Date: Fri, 18 Aug 2023 11:53:23 +0300 Subject: [PATCH 39/39] gunshot fixes --- DangerousD/Content/Content.mgcb | 66 ++++++++++-------- DangerousD/Content/animations/playerShootLeft | 25 ++++++- .../Content/animations/playerShootRight | 25 ++++++- .../Content/{ => sounds}/DoomTestSong.mp3 | Bin DangerousD/Content/sounds/shotgun_shot.mp3 | Bin 0 -> 35691 bytes .../LivingEntities/Player/Player.cs | 1 + DangerousD/GameCore/Managers/SoundManager.cs | 8 +-- 7 files changed, 89 insertions(+), 36 deletions(-) rename DangerousD/Content/{ => sounds}/DoomTestSong.mp3 (100%) create mode 100644 DangerousD/Content/sounds/shotgun_shot.mp3 diff --git a/DangerousD/Content/Content.mgcb b/DangerousD/Content/Content.mgcb index 37d9842..d6828ea 100644 --- a/DangerousD/Content/Content.mgcb +++ b/DangerousD/Content/Content.mgcb @@ -21,18 +21,6 @@ /processorParam:TextureFormat=Compressed /build:ButtonFont.spritefont -#begin checkboxs_off-on.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:checkboxs_off-on.png - #begin checkboxs_off.png /importer:TextureImporter /processor:TextureProcessor @@ -45,6 +33,18 @@ /processorParam:TextureFormat=Color /build:checkboxs_off.png +#begin checkboxs_off-on.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:checkboxs_off-on.png + #begin checkboxs_on.png /importer:TextureImporter /processor:TextureProcessor @@ -81,12 +81,6 @@ /processorParam:TextureFormat=Color /build:deathBackground.jpg -#begin DoomTestSong.mp3 -/importer:Mp3Importer -/processor:SoundEffectProcessor -/processorParam:Quality=Best -/build:DoomTestSong.mp3 - #begin Font_12.spritefont /importer:FontDescriptionImporter /processor:FontDescriptionProcessor @@ -223,6 +217,18 @@ /processorParam:TextureFormat=Color /build:sliderBackground.png +#begin sounds/DoomTestSong.mp3 +/importer:Mp3Importer +/processor:SoundEffectProcessor +/processorParam:Quality=Best +/build:sounds/DoomTestSong.mp3 + +#begin sounds/shotgun_shot.mp3 +/importer:Mp3Importer +/processor:SoundEffectProcessor +/processorParam:Quality=Best +/build:sounds/shotgun_shot.mp3 + #begin textboxbackground1-1.png /importer:TextureImporter /processor:TextureProcessor @@ -235,18 +241,6 @@ /processorParam:TextureFormat=Color /build:textboxbackground1-1.png -#begin textboxbackground2-1.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:textboxbackground2-1.png - #begin textboxbackground2,5-1.png /importer:TextureImporter /processor:TextureProcessor @@ -259,6 +253,18 @@ /processorParam:TextureFormat=Color /build:textboxbackground2,5-1.png +#begin textboxbackground2-1.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:textboxbackground2-1.png + #begin textboxbackground6-1.png /importer:TextureImporter /processor:TextureProcessor diff --git a/DangerousD/Content/animations/playerShootLeft b/DangerousD/Content/animations/playerShootLeft index f2b9f3b..e710737 100644 --- a/DangerousD/Content/animations/playerShootLeft +++ b/DangerousD/Content/animations/playerShootLeft @@ -1 +1,24 @@ -{"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"} +{ + "id": "playerShootLeft", + "textureName": "playerAnimation", + "startSpriteRectangle": { + "X": 201, + "Y": 34, + "Width": 32, + "Height": 32 + }, + "frameSecond": [ + { + "Item1": 0, + "Item2": 3 + }, + { + "Item1": 1, + "Item2": 20 + } + ], + "textureFrameInterval": 1, + "framesCount": 2, + "isCycle": false, + "offset": "4, 0" +} diff --git a/DangerousD/Content/animations/playerShootRight b/DangerousD/Content/animations/playerShootRight index 922862b..3b7ef81 100644 --- a/DangerousD/Content/animations/playerShootRight +++ b/DangerousD/Content/animations/playerShootRight @@ -1 +1,24 @@ -{"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"} +{ + "id": "playerShootRight", + "textureName": "playerAnimation", + "startSpriteRectangle": { + "X": 201, + "Y": 1, + "Width": 32, + "Height": 32 + }, + "frameSecond": [ + { + "Item1": 0, + "Item2": 3 + }, + { + "Item1": 1, + "Item2": 20 + } + ], + "textureFrameInterval": 1, + "framesCount": 2, + "isCycle": false, + "offset": "4, 0" +} diff --git a/DangerousD/Content/DoomTestSong.mp3 b/DangerousD/Content/sounds/DoomTestSong.mp3 similarity index 100% rename from DangerousD/Content/DoomTestSong.mp3 rename to DangerousD/Content/sounds/DoomTestSong.mp3 diff --git a/DangerousD/Content/sounds/shotgun_shot.mp3 b/DangerousD/Content/sounds/shotgun_shot.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..56a4a56bfb7c6bde5d7adb3634efbb21492a241f GIT binary patch literal 35691 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 x.EndsWith("mp3")); + var k = Directory.GetFiles("../../..//Content//sounds").Where(x => x.EndsWith("mp3")); if (k.Count() > 0) { @@ -27,7 +27,7 @@ namespace DangerousD.GameCore string[] soundFiles = k.Select(x => x.Split("\\").Last().Split("/").Last().Replace(".mp3", "")).ToArray();// папка со звуками там где exe foreach (var soundFile in soundFiles) { - Sounds.Add(soundFile, AppManager.Instance.Content.Load(soundFile).CreateInstance()); + Sounds.Add(soundFile, AppManager.Instance.Content.Load("sounds//" + soundFile).CreateInstance()); } } @@ -53,7 +53,7 @@ namespace DangerousD.GameCore { var sound = new Sound(Sounds[soundName], soundPos); sound.SoundEffect.IsLooped = false; - sound.SoundEffect.Volume = (float)sound.GetDistance(playerPos) / MaxSoundDistance; + sound.SoundEffect.Volume = (float)(MaxSoundDistance-sound.GetDistance(playerPos)) / MaxSoundDistance; sound.SoundEffect.Play(); PlayingSounds.Add(sound); if (AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Host) @@ -79,7 +79,7 @@ namespace DangerousD.GameCore for (int i = 0; i < PlayingSounds.Count; i++) { if (!PlayingSounds[i].isAmbient) - PlayingSounds[i].SoundEffect.Volume = (float)PlayingSounds[i].GetDistance(player.Pos) / MaxSoundDistance; + PlayingSounds[i].SoundEffect.Volume = (float)(MaxSoundDistance - PlayingSounds[i].GetDistance(player.Pos)) / MaxSoundDistance; if (PlayingSounds[i].SoundEffect.State == SoundState.Stopped) PlayingSounds.Remove(PlayingSounds[i]); }