Merge pull request #42 from progtime-net/Collision

Collision
This commit is contained in:
Andrey 2024-08-17 11:37:04 +03:00 committed by GitHub
commit 572d784fc3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 110 additions and 37 deletions

View file

@ -0,0 +1,6 @@
namespace ZoFo.GameCore.GameManagers.CollisionManager
{
public class CollectionComponent
{
}
}

View file

@ -1,34 +1,41 @@
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
{
public class CollisionComponent
{
//поля
public Rectangle Bounds { get; set; }
//==ПОЛЯ==
public GameObject gameObject { get; set; }
//public Rectangle Bounds { get; set; }
//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);
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);
//}
//events

View file

@ -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;
@ -9,51 +8,106 @@ 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
{
public class CollisionManager
{
public List<CollisionComponent> CollisionComponent;
public List<CollisionComponent> TriggerComponent;
//листики
public void RegisterComponent()
public List<CollisionComponent> ObjectsWithCollisions;
public List<CollisionComponent> EntitiesWithMovements;
public List<CollisionComponent> ObjectsWithTriggers;
//чекаем коллизии в листе
public void CheckComponentCollision(LivingEntity entity)
{
}
public static bool CheckComponentCollision(List<CollisionComponent> collisionComponents, CollisionComponent component)
{
foreach (var collisionComponent in collisionComponents)
{
if (component.Bounds.IntersectsWith(collisionComponent.Bounds))
{
return true;
}
}
return false;
}
public void UpdateComponentCollision(List<CollisionComponent> collisionComponents)
{
}
public void UpdatePositions()
{
}
//public void GetObjectInArea(Rectangle area)
//for (int i = 0; i < ObjectsWithCollisions.Count; i++)
//{
var currentRect = entity.collisionComponent.stopRectangle;//задаём РЕК
var newRect = currentRect; // задаём значение старого РЕК новому РЕК
bool flagRemovedObject = false; //флаг удаления
//}
//public void Register(Rectangle rectangle)
//{
var collidedX = false; // соприкосновение
var tryingRectX = currentRect;//переменная для попытки перемещения по X
tryingRectX.Offset((int)(entity.velocity.X), 0);//задаём значения для tryingRectX по X и по Y
foreach (var item in ObjectsWithCollisions)//фильтрация
{
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
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(new Point(0, (int)entity.velocity.Y));//задаём значения для tryingRectX по X и по Y
foreach (var item in ObjectsWithCollisions)//фильтрация
{
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
entity.OnCollision(item);//подписываем entity на ивент коллизии
break;// выход
}
}
if (collidedY)// срабатывает, если перемещение блокируется
{
entity.velocity.Y = 0;// задаём значение смещения entity на 0
}
else
{
newRect.Y = tryingRectY.Y;//значение по X для нового РЕК приравниваем к значению испытуемого РЕК
}
}
//обновление позиции объекта
public void UpdateObjectsPositions()
{
}
//регистрация компонента(его коллизии)
public void Register(CollisionComponent component)
{
ObjectsWithCollisions.Add(component);
if (component.gameObject is Entity)
{
EntitiesWithMovements.Add(component);
}
}
//}
}

View file

@ -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)
{
}
}