CheckComponentCollision normak version
This commit is contained in:
parent
9882de9308
commit
997f5db24a
2 changed files with 80 additions and 23 deletions
|
@ -13,8 +13,10 @@ 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
|
||||||
|
|
|
@ -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, );
|
collidedX = true;// меняем значение соприкосновения на true
|
||||||
return true;
|
entity.OnCollision(item);//подписываем entity на ивент коллизии
|
||||||
|
|
||||||
|
break;// выход
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
if (collidedX)// срабатывает, если перемещение блокируется
|
||||||
|
{
|
||||||
|
entity.velocity.X = 0;// задаём значение смещения entity на 0
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newRect.X = tryingRectX.X;//значение по X для нового РЕК приравниваем к значению испытуемого РЕК
|
||||||
}
|
}
|
||||||
|
|
||||||
//обновление позиций
|
//==ПОВТОРЯЕМ ТОЖЕ САМОЕ ДЛЯ Y==
|
||||||
public void UpdateObjectPosition(List<CollisionComponent> collisionComponents, CollisionComponent component)
|
|
||||||
|
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)
|
public void Register(CollisionComponent component)
|
||||||
{
|
|
||||||
if (component.gameObject is Entity)
|
|
||||||
{
|
{
|
||||||
ObjectsWithCollisions.Add(component);
|
ObjectsWithCollisions.Add(component);
|
||||||
|
if (component.gameObject is Entity)
|
||||||
|
{
|
||||||
|
EntitiesWithMovements.Add(component);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue