地图中只绘制了一个瓷砖xna c#

时间:2016-09-27 11:21:12

标签: c# xna draw monogame tile

我遇到这个问题,其中瓷砖只会绘制一个特定的纹理。过去几天我一直在看瓦片引擎,并决定自己去学习教育用途。我设法在屏幕上只获得一个图块,并在地图中绘制该图块。在地图中,它将所有瓷砖视为相同的纹理,而我希望能够确定哪些瓷砖在哪里。例如,1 =草,2 =天空,3 =污垢等。我一直在这里和那里按照教程和在线搜索尝试找到这个问题但无济于事。 在TileMap类的LoadContent中,Console.WriteLine声明列表中有3个纹理。 我的印象是,tileMap中的draw方法会将索引设置为对应于tile纹理的tile ID,然后该特定tile将在游戏中的地图上绘制。例如,索引1将等于丢失中的第一个纹理,索引2将等于第二个纹理,依此类推。 这是一个正确的假设还是我离开了?

另外,您能否就如何解决屏幕上只显示一个纹理问题的方法给我任何帮助/指示。

提前谢谢。

平铺地图

 class TileMap
    {
        private MapCell[,] mapCell;
        public const int TILE_WIDTH = 64;
        public const int TILE_HEIGHT = 64;

    private List<Texture2D> tileList = new List<Texture2D>();

    public TileMap(int[,] exisitingMap)
    {
        //initialise this to a new multidimensional array;
        mapCell = new MapCell[exisitingMap.GetLength(0), exisitingMap.GetLength(1)];
        // x always starts on one 
        for (int x = 0; x < mapCell.GetLength(1); x++)
        {
            for (int y = 0; y < mapCell.GetLength(0); y++)
            {
                mapCell[y, x] = new MapCell(exisitingMap[y, x]);
            }
        }       
     }

    public void loadTextureFiles(ContentManager content, params string[] fileNames)
    {
        Texture2D tileTexture;
        foreach (string fileName in fileNames)
        {
            tileTexture = content.Load<Texture2D>(fileName);
            tileList.Add(tileTexture);
            Console.WriteLine(tileList.Count + " Tile texture count ");
        }
    }

    public void Draw(SpriteBatch spriteBatch)
    {

        for (int x = 0; x < mapCell.GetLength(1); x++)
        {
            for (int y = 0; y < mapCell.GetLength(0); y++)
            {
                // setting the index to the tile ID
                int index = mapCell[y,x].TileID;
                Texture2D texture = tileList[index];

                spriteBatch.Draw(texture, new Rectangle( x * TILE_WIDTH, y * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT), Color.White);

            }
        }   
    }
}

映射单元格

class MapCell
{
    public int TileID { get; set; }

    public MapCell(int tileID) 
    {
        tileID = TileID;
    }
}

的Game1

TileMap tileMap = new TileMap(new int[,]
    {
        { 0,0,0,0,0,0,0 },
        { 1,1,1,1,1,1,1 },
        { 0,1,1,2,1,1,1 },
        { 0,2,1,3,1,3,0 },
        { 0,3,0,3,0,0,0 },
        { 0,0,0,2,0,0,0 },
        { 0,0,0,1,0,1,0 },
    });

 protected override void LoadContent()
    {
        new SpriteBatch(GraphicsDevice);
        tileMap.loadTextureFiles(Content, "Tiles/Tile1", "Tiles/sky", "Tiles/dirt" );  
    }

protected override void Draw(GameTime gameTime)
    {
        spriteBatch.Begin();
        tileMap.Draw(spriteBatch);
        base.Draw(gameTime);

        spriteBatch.End();
    }

1 个答案:

答案 0 :(得分:1)

class MapCell
{
    public int TileID { get; set; }

    public MapCell(int tileID) 
    {
        tileID = TileID;
    }
}

应该是TileID = tileID。如果您将3传递给tileID,然后将0(TileID的默认值)分配给tileID。但是TileID永远不会改变,所以它总是为0.交换它们并且它可能会起作用。