在映射xna-c#中只绘制了一个瓦片
本文关键字:一个 xna-c# 映射 绘制 | 更新日期: 2023-09-27 18:08:57
我遇到了这个问题,瓷砖只能绘制一个特定的纹理。在过去的几天里,我一直在研究tile引擎,并决定尝试自己的一个,用于教育目的。我设法在屏幕上只得到了一个磁贴,它在地图上画出了那个磁贴。在地图中,它将所有瓷砖视为相同的纹理,而我希望能够确定瓷砖的位置。例如,1=草地,2=天空,3=泥土等。我一直在这里和那里学习教程,并在网上搜索,试图找到这个问题,但没有成功。在TileMap类的LoadContent中,Console.WriteLine声明有3个纹理加载到列表中。我的印象是,tileMap中的绘制方法会将索引设置为与瓷砖纹理相对应的瓷砖ID,然后在游戏中在地图上绘制特定的瓷砖。例如,索引1将等于lost中的第一个纹理,索引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;
}
}
游戏1
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();
}
class MapCell
{
public int TileID { get; set; }
public MapCell(int tileID)
{
tileID = TileID;
}
}
应改为CCD_ 1。如果将3
传递给tileID,然后将0(tileID的默认值(分配给tileID。但是TileID永远不会改变,所以它总是0。把它们交换一下,可能会奏效。