54 lines
1.8 KiB
C#

using System.Collections.Generic;
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Integration.MonoGame;
public class LoadContentManager : Behaviour, IFirstFrameUpdate
{
// We use Ascending order because we are using reverse for loop to call them
private static Comparer<IBehaviour> SortByAscendingPriority() => Comparer<IBehaviour>.Create((x, y) => x.Priority.CompareTo(y.Priority));
private readonly ActiveBehaviourCollectorSorted<ILoadContent> loadContents = new() { SortBy = SortByAscendingPriority() };
private readonly List<ILoadContent> toCallLoadContents = new(32);
private MonoGameWindowContainer monoGameWindowContainer = null!;
public void FirstActiveFrame()
{
monoGameWindowContainer = Universe.FindRequiredBehaviour<MonoGameWindowContainer>();
}
protected override void OnEnteredUniverse(IUniverse universe)
{
loadContents.Assign(universe);
universe.OnPreUpdate.AddListener(OnPreUpdate);
}
protected override void OnExitedUniverse(IUniverse universe)
{
loadContents.Unassign();
universe.OnPreUpdate.RemoveListener(OnPreUpdate);
}
private void OnPreUpdate(IUniverse sender, IUniverse.UpdateArguments args)
{
for (int i = toCallLoadContents.Count - 1; i >= 0; i--)
{
toCallLoadContents[i].LoadContent(monoGameWindowContainer.Window.Content);
toCallLoadContents.RemoveAt(i);
}
}
private void OnFirstFrameCollected(IBehaviourCollector<ILoadContent> sender, IBehaviourCollector<ILoadContent>.BehaviourCollectedArguments args)
{
toCallLoadContents.Add(args.BehaviourCollected);
}
public LoadContentManager()
{
loadContents.OnCollected.AddListener(OnFirstFrameCollected);
}
}