PongFE/PongFE/Engines/CollisionEngine.cs

72 lines
2.2 KiB
C#
Raw Normal View History

2020-07-13 18:49:20 +00:00
using Encompass;
using PongFE.Components;
2020-07-15 20:08:58 +00:00
using PongFE.Enums;
2020-07-13 18:49:20 +00:00
using PongFE.Messages;
namespace PongFE.Engines
{
[Reads(
typeof(CanCauseBounceComponent),
2020-07-18 05:53:22 +00:00
typeof(CanCauseAngledBounceComponent),
2020-07-15 21:00:55 +00:00
typeof(CanBeBouncedComponent),
typeof(CanDestroyComponent),
typeof(CanBeDestroyedComponent)
2020-07-13 18:49:20 +00:00
)]
[Receives(typeof(CollisionMessage))]
2020-07-15 21:00:55 +00:00
[Sends(
typeof(BounceMessage),
2020-07-18 05:53:22 +00:00
typeof(AngledBounceMessage),
2020-07-15 21:00:55 +00:00
typeof(DestroyMessage)
)]
2020-07-13 18:49:20 +00:00
public class CollisionEngine : Engine
{
public override void Update(double dt)
{
foreach (ref readonly var message in ReadMessages<CollisionMessage>())
{
CheckBounce(message.EntityA, message.EntityB, message.HitOrientation);
CheckBounce(message.EntityB, message.EntityA, message.HitOrientation);
2020-07-15 21:00:55 +00:00
2020-07-18 05:53:22 +00:00
CheckAngledBounce(message.EntityA, message.EntityB, message.HitOrientation);
CheckAngledBounce(message.EntityB, message.EntityA, message.HitOrientation);
2020-07-15 21:00:55 +00:00
CheckDestroy(message.EntityA, message.EntityB);
CheckDestroy(message.EntityB, message.EntityA);
2020-07-13 18:49:20 +00:00
}
}
private void CheckBounce(Entity a, Entity b, HitOrientation hitOrientation)
{
if (HasComponent<CanCauseBounceComponent>(a))
{
if (HasComponent<CanBeBouncedComponent>(b))
{
SendMessage(new BounceMessage(b, hitOrientation));
}
}
}
2020-07-15 21:00:55 +00:00
2020-07-18 05:53:22 +00:00
private void CheckAngledBounce(Entity a, Entity b, HitOrientation hitOrientation)
{
if (HasComponent<CanCauseAngledBounceComponent>(a))
{
if (HasComponent<CanBeBouncedComponent>(b))
{
SendMessage(new AngledBounceMessage(a, b, hitOrientation));
}
}
}
2020-07-15 21:00:55 +00:00
private void CheckDestroy(Entity a, Entity b)
{
if (HasComponent<CanDestroyComponent>(a))
{
if (HasComponent<CanBeDestroyedComponent>(b))
{
2020-07-16 21:39:36 +00:00
SendMessage(new DestroyMessage(b, a));
2020-07-15 21:00:55 +00:00
}
}
}
2020-07-13 18:49:20 +00:00
}
}