CheckComponentCollision normak version

This commit is contained in:
PetrKu09 2024-08-17 11:12:27 +03:00
parent 9882de9308
commit 997f5db24a
2 changed files with 80 additions and 23 deletions

View file

@ -13,8 +13,10 @@ 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

View file

@ -22,22 +22,81 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager
//чекаем коллизии в листе
public bool CheckComponentCollision(List<CollisionComponent> collisionComponents, CollisionComponent component)
public void CheckComponentCollision(Entity entity)
{
foreach (var collision in collisionComponents)
//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)//фильтрация
{
if (component.Bounds.IntersectsWith(collision.Bounds))
if (Math.Abs(item.Pos.X - entity.Pos.X) < 550
&& Math.Abs(item.Pos.Y - entity.Pos.Y) < 550
&& tryingRectX.Intersect(item.Rectangle))
{
//Register(component, );
return true;
collidedX = true;// меняем значение соприкосновения на true
entity.OnCollision(item);//подписываем entity на ивент коллизии
break;// выход
}
}
return false;
if (collidedX)// срабатывает, если перемещение блокируется
{
entity.velocity.X = 0;// задаём значение смещения entity на 0
}
else
{
newRect.X = tryingRectX.X;//значение по X для нового РЕК приравниваем к значению испытуемого РЕК
}
//обновление позиций
public void UpdateObjectPosition(List<CollisionComponent> collisionComponents, CollisionComponent component)
//==ПОВТОРЯЕМ ТОЖЕ САМОЕ ДЛЯ 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;// выход
}
}
if (collidedY)// срабатывает, если перемещение блокируется
{
entity.velocity.Y = 0;// задаём значение смещения entity на 0
}
else
{
newRect.Y = tryingRectY.Y;//значение по X для нового РЕК приравниваем к значению испытуемого РЕК
}
//}
}
//обновление позиции объекта
public void UpdateObjectsPositions()
{
}
@ -51,12 +110,12 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager
//регистрация компонента(его коллизии)
public void Register(CollisionComponent component, GameObject gameObject)
{
if (component.gameObject is Entity)
public void Register(CollisionComponent component)
{
ObjectsWithCollisions.Add(component);
if (component.gameObject is Entity)
{
EntitiesWithMovements.Add(component);
}
}