82 lines
3.2 KiB
C#
82 lines
3.2 KiB
C#
using Syntriax.Engine.Core;
|
|
using Syntriax.Engine.Core.Abstract;
|
|
using Syntriax.Engine.Physics2D.Abstract;
|
|
|
|
namespace Syntriax.Engine.Physics2D;
|
|
|
|
public abstract class Collider2DBehaviourBase : Behaviour, ICollider2D
|
|
{
|
|
public event ICollider2D.OnCollisionDetectedEventHandler? OnCollisionDetected = null;
|
|
public event ICollider2D.OnCollisionResolvedEventHandler? OnCollisionResolved = null;
|
|
public event ICollider2D.OnTriggeredEventHandler? OnTriggered = null;
|
|
|
|
|
|
protected bool NeedsRecalculation { get; private set; } = true;
|
|
protected IRigidBody2D? _rigidBody2D = null;
|
|
|
|
public IRigidBody2D? RigidBody2D => _rigidBody2D;
|
|
public bool IsTrigger { get; set; } = false;
|
|
|
|
ITransform IAssignableTransform.Transform => Transform;
|
|
public event IAssignableTransform.OnTransformAssignedEventHandler? OnTransformAssigned { add => GameObject.OnTransformAssigned += value; remove => GameObject.OnTransformAssigned -= value; }
|
|
|
|
bool IAssignableTransform.Assign(ITransform transform) => GameObject.Assign(transform);
|
|
|
|
public void Recalculate()
|
|
{
|
|
if (!NeedsRecalculation)
|
|
return;
|
|
|
|
CalculateCollider();
|
|
NeedsRecalculation = false;
|
|
}
|
|
|
|
public abstract void CalculateCollider();
|
|
|
|
protected override void OnInitialize()
|
|
{
|
|
BehaviourController.TryGetBehaviourInParent(out _rigidBody2D);
|
|
|
|
BehaviourController.OnBehaviourAdded += OnBehaviourAddedToController;
|
|
BehaviourController.OnBehaviourRemoved += OnBehaviourRemovedFromController;
|
|
|
|
Transform.OnPositionChanged += SetNeedsRecalculation;
|
|
Transform.OnRotationChanged += SetNeedsRecalculation;
|
|
Transform.OnScaleChanged += SetNeedsRecalculation;
|
|
Transform.OnParentChanged += UpdateRigidBody2D;
|
|
}
|
|
|
|
private void UpdateRigidBody2D(ITransform sender, ITransform? previousParent, ITransform? newParent)
|
|
{
|
|
BehaviourController.TryGetBehaviourInParent(out _rigidBody2D);
|
|
}
|
|
|
|
private void OnBehaviourAddedToController(IBehaviourController _, IBehaviour behaviour)
|
|
{
|
|
if (behaviour is IRigidBody2D rigidBody)
|
|
_rigidBody2D = rigidBody;
|
|
}
|
|
|
|
private void OnBehaviourRemovedFromController(IBehaviourController _, IBehaviour behaviour)
|
|
{
|
|
if (behaviour is IRigidBody2D _)
|
|
_rigidBody2D = null;
|
|
}
|
|
|
|
private void SetNeedsRecalculation(ITransform transform) => NeedsRecalculation = true;
|
|
|
|
protected override void OnFinalize()
|
|
{
|
|
BehaviourController.OnBehaviourAdded -= OnBehaviourAddedToController;
|
|
BehaviourController.OnBehaviourRemoved -= OnBehaviourRemovedFromController;
|
|
Transform.OnScaleChanged -= SetNeedsRecalculation;
|
|
|
|
Transform.OnPositionChanged -= SetNeedsRecalculation;
|
|
Transform.OnRotationChanged -= SetNeedsRecalculation;
|
|
}
|
|
|
|
public void Detect(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionDetected?.Invoke(this, collisionDetectionInformation);
|
|
public void Resolve(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionResolved?.Invoke(this, collisionDetectionInformation);
|
|
public void Trigger(ICollider2D initiator) => OnTriggered?.Invoke(this, initiator);
|
|
}
|