public void Draw(SpriteBatch spritebatch) { List<IDrawable> SortDrawables() { List<IDrawable> drawables = new List<IDrawable>(); List<IDrawable> itemsToInsert = new List<IDrawable>(); itemsToInsert.AddRange(world.Pjs.Values); itemsToInsert.AddRange(world.Drops.Values); itemsToInsert.Sort((a, b) => b.GetSortY().CompareTo(a.GetSortY())); int mazeW = world.maze.GetLength(1); int mazeH = world.maze.GetLength(0); for (int y = 0; y < mazeH; y++) { for (int i = itemsToInsert.Count - 1; i >= 0; i--) { IDrawable item = itemsToInsert[i]; Rectangle itemAabb = ((IIntersectable)item).GetAABB(); int leftX = itemAabb.Left / Tile.Size; int rightX = itemAabb.Right / Tile.Size; if (leftX < 0 || rightX >= world.maze.GetLength(1)) { itemsToInsert.RemoveAt(i); } else { Cell leftCell = world.maze[y, leftX]; Cell rightCell = world.maze[y, rightX]; if (item.GetSortY() < leftCell.GetSortY() && item.GetSortY() < rightCell.GetSortY()) { drawables.Add(item); itemsToInsert.RemoveAt(i); } } } for (int x = 0; x < mazeW; x++) { drawables.Add(world.maze[y, x]); } } return drawables; } // Draw the game onto a texture spritebatch.GraphicsDevice.SetRenderTarget(renderTarget); { // Draw Background spritebatch.GraphicsDevice.Clear(Color.TransparentBlack); biomeBackgroundEffect.Parameters["u_blendMode"].SetValue((int)biome.BackgroundBlendingMode); spritebatch.Begin(SpriteSortMode.Immediate, null, SamplerState.PointWrap, null, null, biomeBackgroundEffect); spritebatch.Draw(biome.BackgroundOverlayTexture ?? pixel, renderTargetRectangle, renderTargetRectangle, biome.BackgroundColor); spritebatch.End(); // Draw floor biomeBackgroundEffect.Parameters["u_blendMode"].SetValue((int)biome.FloorBlendingMode); spritebatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointWrap, null, null, biomeBackgroundEffect, cameraMatrix); spritebatch.Draw(biome.FloorOverlayTexture ?? pixel, floorRectangle, floorRectangle, biome.FloorColor); spritebatch.End(); spritebatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, cameraMatrix); foreach (IDrawable drawable in SortDrawables()) { drawable.Draw(spritebatch, cameraMatrix); } spritebatch.End(); } // Post-process the texture and draw it to the back buffer spritebatch.GraphicsDevice.SetRenderTarget(null); spritebatch.GraphicsDevice.Clear(Color.Crimson); { spritebatch.Begin(SpriteSortMode.Immediate, null, null, null, null, biomeEffect); spritebatch.Draw(renderTarget, renderTargetRectangle, Color.White); spritebatch.End(); } }