diff --git a/DangerousD/GameCore/GameObjects/Entity.cs b/DangerousD/GameCore/GameObjects/Entity.cs index 685ffae..c7ea2f3 100644 --- a/DangerousD/GameCore/GameObjects/Entity.cs +++ b/DangerousD/GameCore/GameObjects/Entity.cs @@ -8,23 +8,11 @@ namespace DangerousD.GameCore.GameObjects { public abstract class Entity : GameObject { - private Vector2 targetPosition; - public float speed; + public Entity(Vector2 position) : base(position) {} - public void SetPosition(Vector2 position) { targetPosition = position; } - - public override void Update(GameTime gameTime) - { - if (Vector2.Distance(Pos, targetPosition) > 0.5f) - { - Vector2 dir = targetPosition - Pos; - dir.Normalize(); - Pos += dir * speed; - } - base.Update(gameTime); - } + } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntity.cs b/DangerousD/GameCore/GameObjects/LivingEntity.cs index db3cc2f..f5a2b98 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntity.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntity.cs @@ -4,7 +4,23 @@ 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, 10); + } + public void SetPosition(Vector2 position) { targetPosition = position; } + + public override void Update(GameTime gameTime) + { + if (Vector2.Distance(Pos, targetPosition) > 0.5f) + { + Vector2 dir = targetPosition - Pos; + dir.Normalize(); + Pos += dir * velocity; + } + base.Update(gameTime); } } \ No newline at end of file diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 497fa9c..da7e264 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -12,11 +12,13 @@ namespace DangerousD.GameCore { public class GameManager { - List livingEntities; - List entities; - List mapObjects; - public MapManager mapManager; - public Player Player { get; set; } + + public List livingEntities; + public List entities; + public List mapObjects; + public MapManager mapManager; + + public GameManager() { livingEntities = new List(); diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index ed159a7..242f372 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -4,14 +4,25 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.Xna.Framework; namespace DangerousD.GameCore.Managers { internal class PhysicsManager { + public void UpdateCollisions(List entities, List livingEntities, - List mapObjects) + List mapObjects, GameTime gameTime) { + float delta = (float)gameTime.ElapsedGameTime.TotalSeconds; + foreach (var item in livingEntities) + { + item.velocity = item.velocity + item.acceleration * delta; + } + CheckCollisions(livingEntities, mapObjects); + OnCollision(entities, livingEntities); + OnCollision(livingEntities); + //entities dont move //Living entities dont move //mapObjects dont move @@ -21,5 +32,120 @@ namespace DangerousD.GameCore.Managers //OnCollision } + public void CheckCollisions(List livingEntities, + List mapObjects) + { + for (int i = 0; i < livingEntities.Count; i++) + { + for (int j = 0; j < mapObjects.Count; j++) + { + if (livingEntities[i].Rectangle.Intersects(mapObjects[j].Rectangle)) + { + if (livingEntities[i].Rectangle.Right > mapObjects[j].Rectangle.Left) + { + + livingEntities[i].velocity.X = 0; + + livingEntities[i].SetPosition(new Vector2(livingEntities[i].Pos.X - (livingEntities[i].Rectangle.Right - mapObjects[j].Rectangle.Left), + livingEntities[i].Pos.Y)); + } + else if (livingEntities[i].Rectangle.Left < mapObjects[j].Rectangle.Right) + { + livingEntities[i].velocity.X = 0; + livingEntities[i].SetPosition(new Vector2(livingEntities[i].Pos.X + mapObjects[j].Rectangle.Right - livingEntities[i].Rectangle.Left, + livingEntities[i].Pos.Y)); + } + else if (livingEntities[i].Rectangle.Bottom > mapObjects[j].Rectangle.Top) + { + livingEntities[i].velocity.Y = 0; + livingEntities[i].SetPosition(new Vector2(livingEntities[i].Pos.X, + livingEntities[i].Pos.Y - (livingEntities[i].Rectangle.Bottom - mapObjects[j].Rectangle.Top))); + } + else if (livingEntities[i].Rectangle.Top < mapObjects[j].Rectangle.Bottom) + { + livingEntities[i].velocity.Y = 0; + livingEntities[i].SetPosition(new Vector2(livingEntities[i].Pos.X, + livingEntities[i].Pos.Y + (mapObjects[j].Rectangle.Bottom - livingEntities[i].Rectangle.Top))); + } + } + } + } + + } + public void OnCollision(List entities, List livingEntities) + { + for (int i = 0; i < entities.Count; i++) + { + for (int j = 0; j < livingEntities.Count; j++) + { + if (livingEntities[j].Rectangle.Intersects(entities[i].Rectangle)) + { + livingEntities[j].OnCollision(); + entities[i].OnCollision(); + } + } + } + + } + public void OnCollision(List livingEntities) + { + for (int i = 0; i < livingEntities.Count; i++) + { + for (int j = i + 1; j < livingEntities.Count; j++) + { + if (livingEntities[i].Rectangle.Intersects(livingEntities[j].Rectangle)) + { + livingEntities[i].OnCollision(); + livingEntities[j].OnCollision(); + } + } + } + } + + + public GameObject RayCast(LivingEntity entity1, LivingEntity entity2, ) + { + + Rectangle rectangle; + Vector2 distance = entity1.Pos - entity2.Pos; + rectangle = new Rectangle((int)entity1.Pos.X, (int)entity1.Pos.Y, entity2.Width, entity2.Height); + GameObject gameObject = null; + double length = distance.Length(); + + for (int i = 0; i < length; i++) + { + rectangle.X = (int)(entity2.Pos.X + (i / length) * distance.X); + rectangle.Y = (int)(entity2.Pos.Y + (i / length) * distance.Y); + + //if (rectangle.Intersects(GameManager.Rectangle)) + //{ + // return game + //} + } + return gameObject; + } + public GameObject RayCast(LivingEntity entity1, Vector2 targetCast) + { + Rectangle rectangle; + Vector2 direction = entity1.Pos - targetCast; + rectangle = new Rectangle((int)entity1.Pos.X, (int)entity1.Pos.Y, 1, 1); + GameObject gameObject = null; + double k = direction.Length(); + + for (int i = 0; i < k; i++) + { + rectangle.X = (int)(entity1.Pos.X + (i / k) * direction.X); + rectangle.Y = (int)(entity1.Pos.Y + (i / k) * direction.X); + if (gameObject != null) + { + break; + return gameObject; + } + + } + + + return null; + } } -} +} \ No newline at end of file