1

I'm building a tile engine for my first game ever and i've been following a guide step by step (can't link it because i'm limited to 2). I have however, made a few modifications to the tilemap so that i can continue with my project. And while testing my program a noticed a bug that i was hoping you guys could help me resolve...

...The tile engine is drawing the wrong tiles!

This is my TileMap (with numbers assigned to each tile) and this is what my engine draws. While it should follow the order as seen below (the code is self-explanatory)

        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

The Important parts of my code

Tile.class

Where i define the tile size and have a function which navigates the tilemap to find my deiserd tile.

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

Where i define the 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

Where i build the map

 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);
            }
        }
    }

Draw

And lastly my draw code.

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);
        }
Ahmed Ashour
  • 5,179
  • 10
  • 35
  • 56
Simon Surename
  • 23
  • 1
  • 1
  • 5
  • It appears to be drawing your tiles correctly, where you told it to draw them. What do you believe the problem is? – Seth Battin Oct 19 '14 at 16:55
  • I want it to follow the "row/column/tileID" blueprint that I pasted , but it doesn't. For some reason it prints correctly up to id nr 11, then resets for some reason (http://imgur.com/9cAOYhT,NK7Ljse#1). Is there something in the code that I've done wrong? – Simon Surename Oct 19 '14 at 17:44
  • Ah, you're right. According to your code, it should be drawing all tile-0. `thisRow.columns.Add(new MapCell(0));` I can't really tell why it's not drawing that. – Seth Battin Oct 19 '14 at 18:17
  • Have you put a breakpoint in your Draw function and stepped through to see what is happening? – Goose Nov 03 '14 at 19:00

0 Answers0