Example #1
0
        private GameTileBuffer[][][] mTileBuffers; //Array is layer, autotile frame, buffer index

        //Initialization
        public MapInstance(Guid id) : base(id)
        {
            mTileBuffers = new GameTileBuffer[Options.LayerCount][][];
            for (var i = 0; i < Options.LayerCount; i++)
            {
                mTileBuffers[i] = new GameTileBuffer[3][]; //3 autotile frames
            }
        }
Example #2
0
        public override void DrawTileBuffer(GameTileBuffer buffer)
        {
            EndSpriteBatch();
            mGraphicsDevice?.SetRenderTarget(mScreenshotRenderTarget);
            mGraphicsDevice.BlendState        = mNormalState;
            mGraphicsDevice.RasterizerState   = RasterizerState.CullCounterClockwise;
            mGraphicsDevice.SamplerStates[0]  = SamplerState.LinearClamp;
            mGraphicsDevice.DepthStencilState = DepthStencilState.None;

            ((MonoTileBuffer)buffer).Draw(mBasicEffect, mCurrentView);
        }
Example #3
0
        private GameTileBuffer[][] DrawMapLayer(int layer, float xoffset = 0, float yoffset = 0)
        {
            var tileBuffers = new Dictionary <object, GameTileBuffer[]>();

            for (var x = 0; x < Options.MapWidth; x++)
            {
                for (var y = 0; y < Options.MapHeight; y++)
                {
                    var tile = Layers[layer].Tiles[x, y];
                    if (tile.TilesetTex == null)
                    {
                        continue;
                    }

                    var tilesetTex = (GameTexture)tile.TilesetTex;

                    if (tile.X < 0 || tile.Y < 0)
                    {
                        continue;
                    }

                    if (tile.X * Options.TileWidth >= tilesetTex.GetWidth() ||
                        tile.Y * Options.TileHeight >= tilesetTex.GetHeight())
                    {
                        continue;
                    }

                    var platformTex = tilesetTex.GetTexture();

                    GameTileBuffer[] buffers = null;
                    if (tileBuffers.ContainsKey(platformTex))
                    {
                        buffers = tileBuffers[platformTex];
                    }
                    else
                    {
                        buffers = new GameTileBuffer[3];
                        for (var i = 0; i < 3; i++)
                        {
                            buffers[i] = Graphics.Renderer.CreateTileBuffer();
                        }

                        tileBuffers.Add(platformTex, buffers);
                    }

                    switch (Autotiles.Autotile[x, y].Layer[layer].RenderState)
                    {
                    case MapAutotiles.RENDER_STATE_NORMAL:
                        for (var i = 0; i < 3; i++)
                        {
                            var buffer = buffers[i];
                            if (!buffer.AddTile(
                                    tilesetTex, x * Options.TileWidth + xoffset, y * Options.TileHeight + yoffset,
                                    Layers[layer].Tiles[x, y].X * Options.TileWidth,
                                    Layers[layer].Tiles[x, y].Y * Options.TileHeight, Options.TileWidth,
                                    Options.TileHeight
                                    ))
                            {
                                throw new Exception("Failed to add VBO!");
                            }
                        }

                        break;

                    case MapAutotiles.RENDER_STATE_AUTOTILE:
                        for (var i = 0; i < 3; i++)
                        {
                            DrawAutoTile(
                                layer, x * Options.TileWidth + xoffset, y * Options.TileHeight + yoffset, 1, x, y,
                                i, tilesetTex, buffers[i]
                                );

                            DrawAutoTile(
                                layer, x * Options.TileWidth + Options.TileWidth / 2 + xoffset,
                                y * Options.TileHeight + yoffset, 2, x, y, i, tilesetTex, buffers[i]
                                );

                            DrawAutoTile(
                                layer, x * Options.TileWidth + xoffset,
                                y * Options.TileHeight + Options.TileHeight / 2 + yoffset, 3, x, y, i, tilesetTex,
                                buffers[i]
                                );

                            DrawAutoTile(
                                layer, +x * Options.TileWidth + Options.TileWidth / 2 + xoffset,
                                y * Options.TileHeight + Options.TileHeight / 2 + yoffset, 4, x, y, i, tilesetTex,
                                buffers[i]
                                );
                        }

                        break;
                    }
                }
            }

            var outputBuffers = new GameTileBuffer[3][];

            for (var i = 0; i < 3; i++)
            {
                outputBuffers[i] = new GameTileBuffer[tileBuffers.Count];
            }

            var valueArrays = tileBuffers.Values.ToArray();

            for (var x = 0; x < valueArrays.Length; x++)
            {
                for (var i = 0; i < 3; i++)
                {
                    outputBuffers[i][x] = valueArrays[x][i];
                }
            }

            mTileBufferDict[layer] = tileBuffers;

            return(outputBuffers);
        }
Example #4
0
        private void DrawAutoTile(
            int layerNum,
            float destX,
            float destY,
            int quarterNum,
            int x,
            int y,
            int forceFrame,
            GameTexture tileset,
            GameTileBuffer buffer,
            bool update = false
            )
        {
            int yOffset = 0, xOffset = 0;

            // calculate the offset
            switch (Layers[layerNum].Tiles[x, y].Autotile)
            {
            case MapAutotiles.AUTOTILE_WATERFALL:
                yOffset = (forceFrame - 1) * Options.TileHeight;

                break;

            case MapAutotiles.AUTOTILE_ANIM:
                xOffset = forceFrame * Options.TileWidth * 2;

                break;

            case MapAutotiles.AUTOTILE_ANIM_XP:
                xOffset = forceFrame * Options.TileWidth * 3;

                break;

            case MapAutotiles.AUTOTILE_CLIFF:
                yOffset = -Options.TileHeight;

                break;
            }

            if (update)
            {
                if (!buffer.UpdateTile(
                        tileset, destX, destY,
                        (int)Autotiles.Autotile[x, y].Layer[layerNum].QuarterTile[quarterNum].X + xOffset,
                        (int)Autotiles.Autotile[x, y].Layer[layerNum].QuarterTile[quarterNum].Y + yOffset,
                        Options.TileWidth / 2, Options.TileHeight / 2
                        ))
                {
                    throw new Exception("Failed to update tile to VBO!");
                }
            }
            else
            {
                if (!buffer.AddTile(
                        tileset, destX, destY,
                        (int)Autotiles.Autotile[x, y].Layer[layerNum].QuarterTile[quarterNum].X + xOffset,
                        (int)Autotiles.Autotile[x, y].Layer[layerNum].QuarterTile[quarterNum].Y + yOffset,
                        Options.TileWidth / 2, Options.TileHeight / 2
                        ))
                {
                    throw new Exception("Failed to add tile to VBO!");
                }
            }
        }