From 81dd08214157e3c26c39130d715b93c9794c6f9e Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Thu, 17 Aug 2023 16:17:33 +0300 Subject: [PATCH] FixLowFpsBug --- .../LivingEntities/Monsters/Zombie.cs | 4 +- .../GameCore/GameObjects/LivingEntity.cs | 12 +++--- DangerousD/GameCore/GameObjects/MapObject.cs | 2 +- .../GameObjects/MapObjects/Platform.cs | 3 +- .../GameObjects/MapObjects/StopTile.cs | 2 +- .../GameCore/GameObjects/MapObjects/Tile.cs | 4 +- DangerousD/GameCore/Managers/GameManager.cs | 30 +++++++++----- DangerousD/GameCore/Managers/MapManager.cs | 7 ++-- .../GameCore/Managers/PhysicsManager.cs | 41 +++++-------------- 9 files changed, 47 insertions(+), 58 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index b679a37..a322e92 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -23,7 +23,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { Width = 24; Height = 40; - monster_speed = 3; + monster_speed = 1; name = "Zombie"; leftBorder = (int)position.X - 100; rightBorder = (int)position.X + 100; @@ -114,7 +114,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public void Target() { - if(physicsManager.RayCast(this, AppManager.Instance.GameManager.players[0]) == 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) { diff --git a/DangerousD/GameCore/GameObjects/LivingEntity.cs b/DangerousD/GameCore/GameObjects/LivingEntity.cs index 8341080..5620568 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntity.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntity.cs @@ -19,12 +19,12 @@ public abstract class LivingEntity : Entity public override void Update(GameTime gameTime) { - if (Vector2.Distance(Pos, targetPosition) > 0.5f) - { - Vector2 dir = targetPosition - Pos; - dir.Normalize(); - _pos += dir * velocity; - } + //if (Vector2.DistanceSquared(Pos, targetPosition) > 0.25f) + //{ + // Vector2 dir = targetPosition - Pos; + // dir.Normalize(); + // _pos += dir * velocity; + //} base.Update(gameTime); } diff --git a/DangerousD/GameCore/GameObjects/MapObject.cs b/DangerousD/GameCore/GameObjects/MapObject.cs index 24add79..654103d 100644 --- a/DangerousD/GameCore/GameObjects/MapObject.cs +++ b/DangerousD/GameCore/GameObjects/MapObject.cs @@ -7,7 +7,7 @@ namespace DangerousD.GameCore.GameObjects; public abstract class MapObject : GameObject { - public bool IsColliderOn; + public virtual bool IsColliderOn { get; protected set; } = true; private Rectangle _sourceRectangle; protected override GraphicsComponent GraphicsComponent { get; } = new("tiles"); public MapObject(Vector2 position, Vector2 size, Rectangle sourceRectangle) : base(position) diff --git a/DangerousD/GameCore/GameObjects/MapObjects/Platform.cs b/DangerousD/GameCore/GameObjects/MapObjects/Platform.cs index f3648f9..12d7813 100644 --- a/DangerousD/GameCore/GameObjects/MapObjects/Platform.cs +++ b/DangerousD/GameCore/GameObjects/MapObjects/Platform.cs @@ -5,8 +5,9 @@ namespace DangerousD.GameCore.GameObjects.MapObjects; public class Platform : MapObject { + public override bool IsColliderOn { get; protected set; } = true; public Platform(Vector2 position, Vector2 size, Rectangle sourceRectangle) : base(position, size, sourceRectangle) { - IsColliderOn = true; } + } \ No newline at end of file diff --git a/DangerousD/GameCore/GameObjects/MapObjects/StopTile.cs b/DangerousD/GameCore/GameObjects/MapObjects/StopTile.cs index 096973b..6b77cc9 100644 --- a/DangerousD/GameCore/GameObjects/MapObjects/StopTile.cs +++ b/DangerousD/GameCore/GameObjects/MapObjects/StopTile.cs @@ -5,8 +5,8 @@ namespace DangerousD.GameCore.GameObjects.MapObjects; public class StopTile : MapObject { + public override bool IsColliderOn { get; protected set; } = true; public StopTile(Vector2 position, Vector2 size, Rectangle sourceRectangle) : base(position, size, sourceRectangle) { - IsColliderOn = true; } } \ No newline at end of file diff --git a/DangerousD/GameCore/GameObjects/MapObjects/Tile.cs b/DangerousD/GameCore/GameObjects/MapObjects/Tile.cs index 2b11dda..5f36075 100644 --- a/DangerousD/GameCore/GameObjects/MapObjects/Tile.cs +++ b/DangerousD/GameCore/GameObjects/MapObjects/Tile.cs @@ -5,8 +5,8 @@ namespace DangerousD.GameCore.GameObjects.MapObjects; public class Tile : MapObject { + public override bool IsColliderOn { get; protected set; } = false; public Tile(Vector2 position, Vector2 size, Rectangle sourceRectangle) : base(position, size, sourceRectangle) - { - IsColliderOn = false; + { } } \ No newline at end of file diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index f2ce8c8..0dfe139 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -17,6 +17,7 @@ namespace DangerousD.GameCore public List livingEntities; public List entities; public List mapObjects; + public List BackgroundObjects; public List others; public MapManager mapManager; public PhysicsManager physicsManager; @@ -29,6 +30,7 @@ namespace DangerousD.GameCore GetAllGameObjects = new List(); livingEntities = new List(); mapObjects = new List(); + BackgroundObjects = new List(); entities = new List(); players = new List(); mapManager = new MapManager(1); @@ -46,23 +48,27 @@ namespace DangerousD.GameCore internal void Register(GameObject gameObject) { - if (gameObject is Player) + //GetAllGameObjects.Add(gameObject); + if (gameObject is Player objPl) { livingEntities.Add(gameObject as LivingEntity); - players.Add(gameObject as Player); + players.Add(objPl); GetPlayer1 = players[0]; } - else if (gameObject is LivingEntity) + else if (gameObject is LivingEntity objLE) { - livingEntities.Add(gameObject as LivingEntity); + livingEntities.Add(objLE); } - else if (gameObject is Entity) + else if (gameObject is Entity objE) { - entities.Add(gameObject as Entity); + entities.Add(objE); } - else if (gameObject is MapObject) + else if (gameObject is MapObject obj) { - mapObjects.Add(gameObject as MapObject); + if (obj.IsColliderOn) + mapObjects.Add(obj); + else + BackgroundObjects.Add(obj); } else { @@ -72,6 +78,8 @@ namespace DangerousD.GameCore public void Draw(SpriteBatch _spriteBatch) { + foreach (var item in BackgroundObjects) + item.Draw(_spriteBatch); foreach (var item in mapObjects) item.Draw(_spriteBatch); foreach (var item in entities) @@ -84,15 +92,15 @@ namespace DangerousD.GameCore public void Update(GameTime gameTime) { + foreach (var item in BackgroundObjects) + item.Update(gameTime); foreach (var item in mapObjects) item.Update(gameTime); foreach (var item in entities) item.Update(gameTime); - + for (int i = 0; i < livingEntities.Count; i++) - { livingEntities[i].Update(gameTime); - } foreach (var item in otherObjects) item.Update(gameTime); diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index 36a0f6b..5d7d6fc 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -8,6 +8,7 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System.Xml.Serialization; using DangerousD.GameCore.GameObjects; +using System.Globalization; namespace DangerousD.GameCore.Managers { @@ -46,8 +47,8 @@ namespace DangerousD.GameCore.Managers private void InstantiateTiles(XmlNode layer, Vector2 tileSize) { string tileType = layer.Attributes["class"].Value; - float offsetX = layer.Attributes["offsetx"] is not null ? float.Parse(layer.Attributes["offsetx"].Value) : 0; - float offsetY = layer.Attributes["offsety"] is not null ? float.Parse(layer.Attributes["offsety"].Value) : 0; + float offsetX = layer.Attributes["offsetx"] is not null ? float.Parse(layer.Attributes["offsetx"].Value, CultureInfo.InvariantCulture) : 0; + float offsetY = layer.Attributes["offsety"] is not null ? float.Parse(layer.Attributes["offsety"].Value, CultureInfo.InvariantCulture) : 0; Debug.Write(layer.SelectNodes("data/chunk").Count); @@ -105,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) + offsetX, float.Parse(entity.Attributes["y"].Value) + offsetY) * _scale); + 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; inst.Width *= _scale; diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 28ecf14..3fdac52 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -36,33 +36,24 @@ namespace DangerousD.GameCore.Managers public void CheckCollisions(List livingEntities, List mapObjects) { + LivingEntity currentEntity; + Rectangle oldRect; for (int i = 0; i < livingEntities.Count; i++) { - var currentEntity = livingEntities[i]; - Rectangle oldRect = currentEntity.Rectangle; + currentEntity = livingEntities[i]; + oldRect = currentEntity.Rectangle; bool isXNormalise = true; bool isYNormalise = true; - oldRect.Offset((int)currentEntity.velocity.X / 2, 0); + oldRect.Offset((int)currentEntity.velocity.X, 0); for (int j = 0; j < mapObjects.Count; j++) { - if (oldRect.Intersects(mapObjects[j].Rectangle)) - { - isXNormalise = false; - oldRect.Offset(-(int)currentEntity.velocity.X / 2, 0); - break; - } - - } - if (isXNormalise) - { - oldRect.Offset((int)currentEntity.velocity.X / 2, 0); - for (int j = 0; j < mapObjects.Count; j++) + if (Math.Abs(mapObjects[i].Pos.X - currentEntity.Pos.X)< currentEntity.velocity.X*2 && Math.Abs(mapObjects[i].Pos.Y - currentEntity.Pos.Y) < 50) { if (oldRect.Intersects(mapObjects[j].Rectangle)) { isXNormalise = false; - oldRect.Offset(-(int)currentEntity.velocity.X / 2, 0); + oldRect.Offset(-(int)currentEntity.velocity.X, 0); break; } } @@ -71,29 +62,17 @@ namespace DangerousD.GameCore.Managers currentEntity.velocity.X = 0; - oldRect.Offset(0, (int)currentEntity.velocity.Y/2); + oldRect.Offset(0, (int)currentEntity.velocity.Y); for (int j = 0; j < mapObjects.Count; j++) { + if (oldRect.Intersects(mapObjects[j].Rectangle)) { isYNormalise = false; - oldRect.Offset(0, -(int)currentEntity.velocity.Y / 2); + oldRect.Offset(0, -(int)currentEntity.velocity.Y); break; } } - if (isYNormalise) - { - oldRect.Offset(0, (int)currentEntity.velocity.Y / 2); - for (int j = 0; j < mapObjects.Count; j++) - { - if (oldRect.Intersects(mapObjects[j].Rectangle)) - { - isYNormalise = false; - oldRect.Offset(0, -(int)currentEntity.velocity.Y / 2); - break; - } - } - } if (!isYNormalise) currentEntity.velocity.Y = 0; currentEntity.SetPosition(new Vector2(oldRect.X, oldRect.Y));