Exemplo n.º 1
0
        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();
            }
        }