Files
brick-framework/GameCore/Events/EventBus.cs

46 lines
1.3 KiB
C#

using GameCore.Events.Interfaces;
namespace GameCore.Events;
public class EventBus
{
private readonly Queue<IEvent> _eventQueue = new();
private readonly Dictionary<Type, List<Action<IEvent>>> _subscribers = new();
public void Subscribe<T>(Action<T> listener) where T : IEvent
{
var eventType = typeof(T);
if (!_subscribers.ContainsKey(eventType)) _subscribers[eventType] = [];
_subscribers[eventType].Add(e => listener((T)e));
}
public void Unsubscribe<T>(Action<T> listener) where T : IEvent
{
var eventType = typeof(T);
if (!_subscribers.TryGetValue(eventType, out var listeners)) return;
listeners.RemoveAll(e => e.Equals((Action<IEvent>)(e1 => listener((T)e1))));
if (listeners.Count == 0) _subscribers.Remove(eventType);
}
public void Publish(IEvent gameEvent)
{
_eventQueue.Enqueue(gameEvent);
}
public void ProcessEvents()
{
while (_eventQueue.Count > 0)
{
var gameEvent = _eventQueue.Dequeue();
var eventType = gameEvent.GetType();
if (!_subscribers.TryGetValue(eventType, out var listeners)) continue;
foreach (var listener in listeners)
listener.Invoke(gameEvent);
}
}
}