From 4a09635ff7e66f32a0273f3e54fcf8035925bc06 Mon Sep 17 00:00:00 2001 From: Lev Date: Tue, 15 Aug 2023 19:27:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=B5=D0=B4=D0=BE=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20RayCast=20=D1=81=201=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DangerousD/GameCore/GameObjects/Entity.cs | 16 +--- .../GameCore/GameObjects/LivingEntity.cs | 16 ++++ DangerousD/GameCore/Managers/GameManager.cs | 6 +- .../GameCore/Managers/PhysicsManager.cs | 80 ++++++++++++++++--- 4 files changed, 88 insertions(+), 30 deletions(-) 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 25021cd..31f7418 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -11,9 +11,9 @@ namespace DangerousD.GameCore { public class GameManager { - List livingEntities; - List entities; - List mapObjects; + public List livingEntities; + public List entities; + public List mapObjects; public MapManager mapManager; public GameManager() diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 46c4def..242f372 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -10,15 +10,19 @@ namespace DangerousD.GameCore.Managers { internal class PhysicsManager { + public void UpdateCollisions(List entities, List livingEntities, - List mapObjects) + List mapObjects, GameTime gameTime) { - - - CheckCollisions(livingEntities,mapObjects); + 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 @@ -39,33 +43,38 @@ namespace DangerousD.GameCore.Managers { 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(Listentities,List livingEntities ) + public void OnCollision(List entities, List livingEntities) { - for (int i = 0; i livingEntities) { for (int i = 0; i < livingEntities.Count; i++) { - for (int j = i+1; j < livingEntities.Count; j++) + for (int j = i + 1; j < livingEntities.Count; j++) { if (livingEntities[i].Rectangle.Intersects(livingEntities[j].Rectangle)) { @@ -92,6 +101,51 @@ namespace DangerousD.GameCore.Managers } } } - + + + 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