71 lines
1.7 KiB
C#
71 lines
1.7 KiB
C#
|
using Godot;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
namespace SupaLidlGame.BoundingBoxes;
|
||
|
|
||
|
public partial class InteractionReceiver : Area2D
|
||
|
{
|
||
|
[Signal]
|
||
|
public delegate void TriggerEventHandler(
|
||
|
InteractionTrigger trigger,
|
||
|
InteractionTrigger closestTrigger);
|
||
|
|
||
|
[Signal]
|
||
|
public delegate void ClosestTriggerEventHandler(InteractionTrigger trigger);
|
||
|
|
||
|
private InteractionTrigger _closestTrigger;
|
||
|
|
||
|
private HashSet<InteractionTrigger> _triggers;
|
||
|
|
||
|
public InteractionReceiver()
|
||
|
{
|
||
|
_triggers = new HashSet<InteractionTrigger>();
|
||
|
}
|
||
|
|
||
|
private void UpdateClosestTrigger()
|
||
|
{
|
||
|
float minDist = float.MaxValue;
|
||
|
InteractionTrigger best = null;
|
||
|
|
||
|
foreach (var trigger in _triggers)
|
||
|
{
|
||
|
float dist = trigger.GlobalPosition
|
||
|
.DistanceSquaredTo(GlobalPosition);
|
||
|
|
||
|
if (dist <= minDist)
|
||
|
{
|
||
|
best = trigger;
|
||
|
minDist = dist;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (_closestTrigger != best)
|
||
|
{
|
||
|
EmitSignal(SignalName.ClosestTrigger, best);
|
||
|
_closestTrigger = best;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void _on_area_entered(Area2D area)
|
||
|
{
|
||
|
if (area is InteractionTrigger trigger)
|
||
|
{
|
||
|
EmitSignal(SignalName.Trigger, _closestTrigger);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void _on_area_exited(Area2D area)
|
||
|
{
|
||
|
// update closest trigger
|
||
|
if (area is InteractionTrigger trigger)
|
||
|
{
|
||
|
if (_triggers.Contains(trigger))
|
||
|
{
|
||
|
_triggers.Remove(trigger);
|
||
|
}
|
||
|
UpdateClosestTrigger();
|
||
|
}
|
||
|
GD.PushWarning("Area entered is not an InteractionTrigger.");
|
||
|
}
|
||
|
}
|