C#XNA Tile引擎绘制错误的图块

时间:2014-10-19 16:37:32

标签: c# xna 2d tile-engine

我为我的第一场比赛制作了一个磁贴引擎,并且我一直在按照指南进行操作(无法将其链接起来,因为我限制为2)。但是,我对tilemap进行了一些修改,以便我可以继续我的项目。 在测试我的程序时,我注意到一个错误,我希望你们可以帮我解决...

...磁贴引擎正在绘制错误的磁贴!

This是我的TileMap(为每个磁贴分配了数字),this是我的引擎绘制的。 虽然它应该遵循下面的顺序(代码是不言自明的)

        rows[0].columns[3].tileID = 0;
        rows[0].columns[4].tileID = 1;
        rows[0].columns[5].tileID = 2;
        rows[0].columns[6].tileID = 3;
        rows[0].columns[7].tileID = 4;

        rows[1].columns[3].tileID = 5;
        rows[1].columns[4].tileID = 6;
        rows[1].columns[5].tileID = 7;
        rows[1].columns[6].tileID = 8;
        rows[1].columns[7].tileID = 9;

        rows[2].columns[3].tileID = 10;
        rows[2].columns[4].tileID = 11;
        rows[2].columns[5].tileID = 12;
        rows[2].columns[6].tileID = 13;
        rows[2].columns[7].tileID = 14;

        rows[3].columns[3].tileID = 15;
        rows[3].columns[4].tileID = 16;
        rows[3].columns[5].tileID = 17;
        rows[3].columns[6].tileID = 18;
        rows[3].columns[7].tileID = 19;

        rows[4].columns[3].tileID = 20;
        rows[4].columns[4].tileID = 21;
        rows[4].columns[5].tileID = 22;
        rows[4].columns[6].tileID = 23;
        rows[4].columns[7].tileID = 24;

        rows[5].columns[3].tileID = 25;
        rows[5].columns[4].tileID = 26;
        rows[5].columns[5].tileID = 27;
        rows[5].columns[6].tileID = 28;
        rows[5].columns[7].tileID = 29;

Code Essentials

我的代码的重要部分

Tile.class

我定义了瓷砖尺寸,并且有一个导航瓷砖地图以找到我的防水瓷砖的功能。

namespace TileEngine
{
    static class Tile
    {
        static public Texture2D tileSetTexture;
        static public int tileWidth = 48;
        static public int tileHeight = 48;

        static public Rectangle getSourceRectangle(int tileIndex)
        {
            int tileY = tileIndex / (tileSetTexture.Width / tileWidth);
            int tileX = tileIndex % (tileSetTexture.Height / tileHeight);

            return new Rectangle(tileX * tileWidth, tileY * tileHeight, tileWidth, tileHeight);
        }
    }
}

MapCell

我在哪里定义tileID

class MapCell
    {
        public List<int> baseTiles = new List<int>();
        public int tileID 
        {
            get { return baseTiles.Count > 0 ? baseTiles[0] : 0; }
            set
            {
                if (baseTiles.Count > 0)
                    baseTiles[0] = value;
                else
                    addBaseTile(value);
            } 

        }

        public void addBaseTile(int tileID)
        {
            baseTiles.Add(tileID);
        }

        public MapCell(int tileID)
        {
            this.tileID = tileID;
        }
    }

tilemap的

我在哪里构建地图

 class MapRow
    {
        public List<MapCell> columns = new List<MapCell>();
    }

    class TileMap
    {
        public List<MapRow> rows = new List<MapRow>();
        public int mapWidth = 50;
        public int mapHeight = 50;

        public TileMap()
        {
            for (int y = 0; y < mapHeight; y++)
            {
                MapRow thisRow = new MapRow();
                for (int x = 0; x < mapWidth; x++)
                {
                    thisRow.columns.Add(new MapCell(0));
                }
                rows.Add(thisRow);
            }
        }
    }

绘制

最后是我的抽奖代码。

protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);
            spriteBatch.Begin();

            Vector2 firstSquare = new Vector2(Camera.location.X / Tile.tileWidth, Camera.location.Y / Tile.tileHeight);
            int firstX = (int)firstSquare.X;
            int firstY = (int)firstSquare.Y;

            Vector2 squareOffset = new Vector2(Camera.location.X % Tile.tileWidth, Camera.location.Y % Tile.tileHeight);
            int offsetX = (int)squareOffset.X;
            int offsetY = (int)squareOffset.Y;

            for (int y = 0; y < squaresDown; y++)
            {
               for (int x = 0; x < squaresAcross; x++)
                {
                    foreach (int tileID in myMap.rows[y + firstY].columns[x + firstX].baseTiles)
                    {
                        spriteBatch.Draw(
                            Tile.tileSetTexture,
                            new Rectangle(
                                (x * Tile.tileWidth) - offsetX, (y * Tile.tileHeight) - offsetY,
                                Tile.tileWidth, Tile.tileHeight),
                            Tile.getSourceRectangle(tileID),
                            Color.White);
                    }
                } 
            }

            spriteBatch.End();
            base.Draw(gameTime);
        }

0 个答案:

没有答案