C# XNA Tile engine рисует неправильные плитки

Я создаю движок плиток для своей первой игры и следую пошаговому руководству (не могу связать его, потому что я ограничен 2). Тем не менее, я сделал несколько изменений в тайлекарте, чтобы продолжить мой проект. И во время тестирования моей программы была обнаружена ошибка, которая, я надеюсь, вы, ребята, могли бы помочь мне решить...

... Плитка движок рисует не те плитки!

Это моя TileMap (с номерами, назначенными для каждой плитки), и это то, что рисует мой движок. Хотя это должно следовать в порядке, как показано ниже (код не требует пояснений)

        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;

Основы кода

Важные части моего кода

Tile.class

Где я определяю размер плитки и имею функцию, которая перемещается по карте плиток, чтобы найти мою плитку deiserd.

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 ответов

Другие вопросы по тегам