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,9 +13,11 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager
{ {
//==ПОЛЯ== //==ПОЛЯ==
public GameObject gameObject { get; set; } //public GameObject gameObject { get; set; }
public Rectangle Bounds { get; set; } //public Rectangle Bounds { get; set; }
public Rectangle Rectangle => new Rectangle();
bool doesStop; bool doesStop;
Rectangle stopRectangle; Rectangle stopRectangle;
@ -26,15 +28,11 @@ namespace ZoFo.GameCore.GameManagers.CollisionManager
//delegate //delegate
public delegate void EventHandler(object sender, EventArgs e); public delegate void EventHandler(object sender, EventArgs e);
public CollisionComponent(int x, int y, int width, int height) //public CollisionComponent(int x, int y, int width, int height)
{ //{
Bounds = new Rectangle(x, y, width, height); // Bounds = new Rectangle(x, y, width, height);
} //}
public CollisionComponent(Rectangle bounds)
{
Bounds = bounds;
}
//events //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++)
{ //{
if (component.Bounds.IntersectsWith(collision.Bounds)) 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, ); if (Math.Abs(item.Pos.X - entity.Pos.X) < 550
return true; && 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<CollisionComponent> 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) if (component.gameObject is Entity)
{ {
ObjectsWithCollisions.Add(component); EntitiesWithMovements.Add(component);
} }
} }