using System.Collections.Generic; using Engine.Core; namespace Engine.Integration.MonoGame; public class SpriteBatcher : BehaviourBase, IFirstFrameUpdate, IDraw { private static Comparer SortByPriority() => Comparer.Create((x, y) => y.CompareTo(x)); private static System.Func GetPriority() => (b) => b.Priority; private ISpriteBatch spriteBatch = null!; private MonoGameCamera2D camera2D = null!; private readonly ActiveBehaviourCollectorOrdered drawableSprites = new(GetPriority(), SortByPriority()); public void FirstActiveFrame() { MonoGameWindowContainer windowContainer = Universe.FindRequiredBehaviour(); camera2D = Universe.FindRequiredBehaviour(); spriteBatch = new SpriteBatchWrapper(windowContainer.Window.GraphicsDevice); drawableSprites.Unassign(); drawableSprites.Assign(Universe); } public void Draw() { spriteBatch.Begin(transformMatrix: camera2D.MatrixTransform); for (int i = 0; i < drawableSprites.Count; i++) drawableSprites[i].Draw(spriteBatch); spriteBatch.End(); } }