diff --git a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs index cbef012..5f69441 100644 --- a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs +++ b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs @@ -13,9 +13,11 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager { //==ПОЛЯ== - public GameObject gameObject { get; set; } - public Rectangle Bounds { get; set; } - + //public GameObject gameObject { get; set; } + //public Rectangle Bounds { get; set; } + + public Rectangle Rectangle => new Rectangle(); + bool doesStop; Rectangle stopRectangle; @@ -26,15 +28,11 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager //delegate public delegate void EventHandler(object sender, EventArgs e); - public CollisionComponent(int x, int y, int width, int height) - { - Bounds = new Rectangle(x, y, width, height); - } + //public CollisionComponent(int x, int y, int width, int height) + //{ + // Bounds = new Rectangle(x, y, width, height); + //} - public CollisionComponent(Rectangle bounds) - { - Bounds = bounds; - } //events diff --git a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs index c8905f8..05808b4 100644 --- a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs +++ b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs @@ -22,22 +22,81 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager //чекаем коллизии в листе - public bool CheckComponentCollision(List collisionComponents, CollisionComponent component) + public void CheckComponentCollision(Entity entity) { - foreach (var collision in collisionComponents) - { - if (component.Bounds.IntersectsWith(collision.Bounds)) + //for (int i = 0; i < ObjectsWithCollisions.Count; i++) + //{ + var currentRect = entity.Rectangle;//задаём РЕК + var newRect = currentRect; // задаём значение старого РЕК новому РЕК + bool flagRemovedObject = false; //флаг удаления + + + var collidedX = false; // соприкосновение + var tryingRectX = currentRect;//переменная для попытки перемещения по X + + tryingRectX.Offset((int)(entity.velocity.X), 0);//задаём значения для tryingRectX по X и по Y + + foreach (var item in ObjectsWithCollisions)//фильтрация { - //Register(component, ); - return true; + if (Math.Abs(item.Pos.X - entity.Pos.X) < 550 + && Math.Abs(item.Pos.Y - entity.Pos.Y) < 550 + && tryingRectX.Intersect(item.Rectangle)) + + { + collidedX = true;// меняем значение соприкосновения на true + entity.OnCollision(item);//подписываем entity на ивент коллизии + + break;// выход + } + } + + if (collidedX)// срабатывает, если перемещение блокируется + { + entity.velocity.X = 0;// задаём значение смещения entity на 0 } + else + { + newRect.X = tryingRectX.X;//значение по X для нового РЕК приравниваем к значению испытуемого РЕК + } + + //==ПОВТОРЯЕМ ТОЖЕ САМОЕ ДЛЯ Y== + + var collidedY = false; // соприкосновение + var tryingRectY = currentRect;//переменная для попытки перемещения по X + + tryingRectY.Offset((int)(0, entity.velocity.Y));//задаём значения для tryingRectX по X и по Y + + foreach (var item in ObjectsWithCollisions)//фильтрация + { + if (Math.Abs(item.Pos.X - entity.Pos.X) < 550 + && Math.Abs(item.Pos.Y - entity.Pos.Y) < 550 + && tryingRectY.Intersect(item.Rectangle)) + + { + collidedY = true;// меняем значение соприкосновения на true + entity.OnCollision(item);//подписываем entity на ивент коллизии + + break;// выход + } } - return false; + if (collidedY)// срабатывает, если перемещение блокируется + { + entity.velocity.Y = 0;// задаём значение смещения entity на 0 + } + else + { + newRect.Y = tryingRectY.Y;//значение по X для нового РЕК приравниваем к значению испытуемого РЕК + } + + + + + //} } - //обновление позиций - public void UpdateObjectPosition(List collisionComponents, CollisionComponent component) + //обновление позиции объекта + public void UpdateObjectsPositions() { } @@ -51,12 +110,12 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager //регистрация компонента(его коллизии) - public void Register(CollisionComponent component, GameObject gameObject) + public void Register(CollisionComponent component) { + ObjectsWithCollisions.Add(component); if (component.gameObject is Entity) { - ObjectsWithCollisions.Add(component); - + EntitiesWithMovements.Add(component); } }