using System.Collections.Generic; using Syntriax.Engine.Core; namespace Syntriax.Engine.Integration.MonoGame; public class SpriteBatcher : BehaviourBase, IFirstFrameUpdate, IDraw { private static Comparer SortByPriority() => Comparer.Create((x, y) => y.Priority.CompareTo(x.Priority)); private ISpriteBatch spriteBatch = null!; private MonoGameCamera2DBehaviour camera2D = null!; private readonly ActiveBehaviourCollectorSorted drawableSprites = new() { SortBy = 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(); } }