From 226a5a5ccd479feeed77839a7a17025632d00192 Mon Sep 17 00:00:00 2001 From: PetrKu09 Date: Fri, 16 Aug 2024 11:37:43 +0300 Subject: [PATCH 1/5] Add Register Collision --- .../CollisionManager/CollectionComponent.cs | 6 ++++++ .../CollisionManager/CollisionComponent.cs | 7 ++++++- .../CollisionManager/CollisionManager.cs | 12 +++++++----- 3 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 ZoFo/GameCore/GameManagers/CollisionManager/CollectionComponent.cs diff --git a/ZoFo/GameCore/GameManagers/CollisionManager/CollectionComponent.cs b/ZoFo/GameCore/GameManagers/CollisionManager/CollectionComponent.cs new file mode 100644 index 0000000..7143312 --- /dev/null +++ b/ZoFo/GameCore/GameManagers/CollisionManager/CollectionComponent.cs @@ -0,0 +1,6 @@ +namespace ZoFo.GameCore.GameManagers.CollisionManager +{ + public class CollectionComponent + { + } +} \ No newline at end of file diff --git a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs index 755fc11..00ee287 100644 --- a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs +++ b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs @@ -13,7 +13,7 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager { //поля public Rectangle Bounds { get; set; } - + //остановлен ли перс bool doesStop; Rectangle stopRectangle; @@ -30,6 +30,11 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager Bounds = new Rectangle(x, y, width, height); } + public CollisionComponent(Rectangle bounds) + { + Bounds = bounds; + } + //events public event EventHandler OnTriggerEnter; diff --git a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs index 8cf63f2..81bc36e 100644 --- a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs +++ b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs @@ -19,12 +19,13 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager - public static bool CheckComponentCollision(List collisionComponents, CollisionComponent component) + public bool CheckComponentCollision(List collisionComponents, CollisionComponent component) { foreach (var collisionComponent in collisionComponents) { if (component.Bounds.IntersectsWith(collisionComponent.Bounds)) { + Register(component); return true; } } @@ -47,10 +48,11 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager //} - //public void Register(Rectangle rectangle) - //{ - - //} + public void Register(CollisionComponent component) + { + CollisionComponent.Add(component); + } + } From 9882de93087290645b5af0c6a5b277ec2dd0fbc8 Mon Sep 17 00:00:00 2001 From: PetrKu09 Date: Fri, 16 Aug 2024 19:24:54 +0300 Subject: [PATCH 2/5] Add Register Collision v2 --- .../CollisionManager/CollisionComponent.cs | 5 +-- .../CollisionManager/CollisionManager.cs | 35 +++++++++++-------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs index 00ee287..cbef012 100644 --- a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs +++ b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs @@ -11,10 +11,11 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager { public class CollisionComponent { - //поля + //==ПОЛЯ== + + public GameObject gameObject { get; set; } public Rectangle Bounds { get; set; } - //остановлен ли перс bool doesStop; Rectangle stopRectangle; diff --git a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs index 81bc36e..c8905f8 100644 --- a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs +++ b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs @@ -14,18 +14,21 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager { public class CollisionManager { - public List CollisionComponent; - public List TriggerComponent; + //листики + + public List ObjectsWithCollisions; + public List EntitiesWithMovements; + public List ObjectsWithTriggers; - + //чекаем коллизии в листе public bool CheckComponentCollision(List collisionComponents, CollisionComponent component) { - foreach (var collisionComponent in collisionComponents) + foreach (var collision in collisionComponents) { - if (component.Bounds.IntersectsWith(collisionComponent.Bounds)) + if (component.Bounds.IntersectsWith(collision.Bounds)) { - Register(component); + //Register(component, ); return true; } } @@ -33,24 +36,28 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager return false; } - public void UpdateComponentCollision(List collisionComponents) + //обновление позиций + public void UpdateObjectPosition(List collisionComponents, CollisionComponent component) { - + } - public void UpdatePositions() - { - - } + //получение объекта на поле(карте) //public void GetObjectInArea(Rectangle area) //{ //} - public void Register(CollisionComponent component) + + //регистрация компонента(его коллизии) + public void Register(CollisionComponent component, GameObject gameObject) { - CollisionComponent.Add(component); + if (component.gameObject is Entity) + { + ObjectsWithCollisions.Add(component); + + } } From 997f5db24a017f024a25614bfe4e0af8a4733156 Mon Sep 17 00:00:00 2001 From: PetrKu09 Date: Sat, 17 Aug 2024 11:12:27 +0300 Subject: [PATCH 3/5] CheckComponentCollision normak version --- .../CollisionManager/CollisionComponent.cs | 20 ++--- .../CollisionManager/CollisionManager.cs | 83 ++++++++++++++++--- 2 files changed, 80 insertions(+), 23 deletions(-) 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); } } From 72bfd52ae54c9ab4e012cf9b49c9b0b6f5e9baaa Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Sat, 17 Aug 2024 11:22:38 +0300 Subject: [PATCH 4/5] Start resolving issues --- .../GameManagers/CollisionManager/CollisionManager.cs | 4 +++- .../GameObjects/Entities/LivingEntities/LivingEntity.cs | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs index 193d540..943694f 100644 --- a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs +++ b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs @@ -9,6 +9,8 @@ using ZoFo.GameCore.GameObjects; using ZoFo.GameCore.GameManagers.CollisionManager; using Microsoft.Xna.Framework; using ZoFo.GameCore.GameManagers.MapManager.MapElements; +using ZoFo.GameCore.GameObjects.Entities; +using ZoFo.GameCore.GameObjects.Entities.LivingEntities; namespace ZoFo.GameCore.GameManagers.CollisionManager { @@ -22,7 +24,7 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager //чекаем коллизии в листе - public void CheckComponentCollision(Entity entity) + public void CheckComponentCollision(LivingEntity entity) { //for (int i = 0; i < ObjectsWithCollisions.Count; i++) //{ diff --git a/ZoFo/GameCore/GameObjects/Entities/LivingEntities/LivingEntity.cs b/ZoFo/GameCore/GameObjects/Entities/LivingEntities/LivingEntity.cs index 6842723..84e7d45 100644 --- a/ZoFo/GameCore/GameObjects/Entities/LivingEntities/LivingEntity.cs +++ b/ZoFo/GameCore/GameObjects/Entities/LivingEntities/LivingEntity.cs @@ -4,6 +4,7 @@ using System; using ZoFo.GameCore.GameObjects.Entities; using ZoFo.GameCore.ZoFo_graphics; using ZoFo.GameCore.GameManagers; +using ZoFo.GameCore.GameManagers.CollisionManager; namespace ZoFo.GameCore.GameObjects.Entities.LivingEntities; public class LivingEntity : Entity @@ -26,6 +27,11 @@ public class LivingEntity : Entity }*/ #endregion + public void OnCollision(CollisionComponent component) + { + + } + } From 1b77e35c32ed5eb85e83ae3c2dabe364e9eecc24 Mon Sep 17 00:00:00 2001 From: PetrKu09 Date: Sat, 17 Aug 2024 11:36:18 +0300 Subject: [PATCH 5/5] Resolve issues --- .../CollisionManager/CollisionComponent.cs | 15 +++++++++------ .../CollisionManager/CollisionManager.cs | 17 ++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs index f22b906..880e159 100644 --- a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs +++ b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionComponent.cs @@ -1,10 +1,11 @@ -using System; +using Microsoft.Xna.Framework; +using System; using System.Collections.Generic; -using System.Drawing; using System.Linq; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; +using ZoFo.GameCore.GameObjects; using ZoFo.GameCore.GameObjects.Entities.LivingEntities.Player; namespace ZoFo.GameCore.GameManagers.CollisionManager @@ -13,17 +14,19 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager { //==ПОЛЯ== - //public GameObject gameObject { get; set; } + public GameObject gameObject { get; set; } //public Rectangle Bounds { get; set; } - public Rectangle Rectangle => new Rectangle(); + //public Rectangle Rectangle => new Rectangle(); + + bool doesStop; - Rectangle stopRectangle; + public Rectangle stopRectangle; // triggers for rectangle bool isTrigger; - Rectangle triggerRectangle; + public Rectangle triggerRectanglee; //delegate public delegate void EventHandler(object sender, EventArgs e); diff --git a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs index 943694f..96c9cbc 100644 --- a/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs +++ b/ZoFo/GameCore/GameManagers/CollisionManager/CollisionManager.cs @@ -1,7 +1,6 @@ using Microsoft.VisualBasic; using System; using System.Collections.Generic; -using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -28,7 +27,7 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager { //for (int i = 0; i < ObjectsWithCollisions.Count; i++) //{ - var currentRect = entity.Rectangle;//задаём РЕК + var currentRect = entity.collisionComponent.stopRectangle;//задаём РЕК var newRect = currentRect; // задаём значение старого РЕК новому РЕК bool flagRemovedObject = false; //флаг удаления @@ -40,9 +39,9 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager foreach (var item in ObjectsWithCollisions)//фильтрация { - if (Math.Abs(item.Pos.X - entity.Pos.X) < 550 - && Math.Abs(item.Pos.Y - entity.Pos.Y) < 550 - && tryingRectX.Intersect(item.Rectangle)) + if (Math.Abs(item.stopRectangle.X - entity.collisionComponent.stopRectangle.X) < 550 + && Math.Abs(item.stopRectangle.Y - entity.collisionComponent.stopRectangle.Y) < 550 + && tryingRectX.Intersects(item.stopRectangle)) { collidedX = true;// меняем значение соприкосновения на true @@ -66,13 +65,13 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager var collidedY = false; // соприкосновение var tryingRectY = currentRect;//переменная для попытки перемещения по X - tryingRectY.Offset((int)(0, entity.velocity.Y));//задаём значения для tryingRectX по X и по Y + tryingRectY.Offset(new Point(0, (int)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)) + if (Math.Abs(item.stopRectangle.X - entity.collisionComponent.stopRectangle.X) < 550 + && Math.Abs(item.stopRectangle.Y - entity.collisionComponent.stopRectangle.Y) < 550 + && tryingRectY.Intersects(item.stopRectangle)) { collidedY = true;// меняем значение соприкосновения на true