Monogame 层相互吸引 - 为什么?
Monogame layers drawing over each other - why?
我是 Monogame 和 C# 的新手。我正在尝试使用 TiledSharp 在屏幕上渲染测试 Tiled 地图。但是,当我尝试绘制多个图层时,它们显然在循环并相互叠加。
这是我的绘制方法代码:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
spriteBatch.Begin(sortMode: SpriteSortMode.FrontToBack, blendState: BlendState.AlphaBlend, samplerState: SamplerState.PointClamp, null, null, null,
Matrix.CreateScale(6.0f));
for (currentTileLayer=0; currentTileLayer < easyMap.TileLayers.Count; currentTileLayer++)
{
Console.WriteLine(easyMap.TileLayers[currentTileLayer].Name.ToString());
for (var i = 0; i < easyMap.TileLayers[currentTileLayer].Tiles.Count; i++)
{
int gid = easyMap.TileLayers[currentTileLayer].Tiles[i].Gid;
// empty tile, do nothing
// gid => global id of tile
if (gid == 0)
{
}
else
{
int tileFrame = gid - 1;
int column = tileFrame % tilesetTilesWide;
int row = (int)Math.Floor((double)tileFrame / (double)tilesetTilesWide);
float x = (i % easyMap.Width) * easyMap.TileWidth;
float y = (float)Math.Floor(i / (double)easyMap.Width) * easyMap.TileHeight;
Rectangle tileSetRec = new Rectangle(tileWidth * column, tileHeight * row, tileWidth, tileHeight);
spriteBatch.Draw(easyTileset, new Rectangle((int)x, (int)y, tileWidth, tileHeight), tileSetRec, Color.White);
}
}
}
spriteBatch.End();
base.Draw(gameTime);
}
我原来的地图是这样的:
当我 运行 代码时,它看起来像这样:
地图共有三层。我该如何修复我的循环?谢谢!
我可能是错的,但我认为您需要从后到前对磁贴进行排序。应先渲染位于底部的任何图块。
在for (currentTileLayer=0; currentTileLayer < easyMap.TileLayers.Count; currentTileLayer++)
将您的 TileLayers 替换为 var orderedTiles = easyMap.TileLayers.OrderBy(t => t.Tile.Gid)
您应该使用排序图层,因为 Tiled 对它们的支持非常好。使用图层可以为您提供更多的地图设计可能性。我还可以让你的角色隐藏在物体后面等等。
在平铺中,如果需要在顶部创建多个图层,请先创建背景图层以避免错误的绘制顺序。
一个简单的解决方案可能如下所示
const int LAYER_BACKGROUNDLAYER = 0;
const int LAYER_FRONTLAYER = 1;
const int LAYER_TOPLAYER = 2;
取决于你想使用多少层。
然后您只需将要绘制的图层编号传递给您的绘制方法即可。通常从 0 到最大数。
public void DrawLayer(int layer)
{
for (var j = 0; j < curMap.Layers[layer].Tiles.Count; j++)
{
int gid = curMap.Layers[layer].Tiles[j].Gid;
if (gid == 0)
{
//empty tile
}
else
{
//draw your tile
}
}
}
在这种情况下,"curMap" 是您当前通过 curMap = new TmxMap(mapSource); 加载的 .tmx 文件
上面的绘制代码应该适合您的代码,因为我也是基于 TiledSharp 示例的;)
我是 Monogame 和 C# 的新手。我正在尝试使用 TiledSharp 在屏幕上渲染测试 Tiled 地图。但是,当我尝试绘制多个图层时,它们显然在循环并相互叠加。
这是我的绘制方法代码:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
spriteBatch.Begin(sortMode: SpriteSortMode.FrontToBack, blendState: BlendState.AlphaBlend, samplerState: SamplerState.PointClamp, null, null, null,
Matrix.CreateScale(6.0f));
for (currentTileLayer=0; currentTileLayer < easyMap.TileLayers.Count; currentTileLayer++)
{
Console.WriteLine(easyMap.TileLayers[currentTileLayer].Name.ToString());
for (var i = 0; i < easyMap.TileLayers[currentTileLayer].Tiles.Count; i++)
{
int gid = easyMap.TileLayers[currentTileLayer].Tiles[i].Gid;
// empty tile, do nothing
// gid => global id of tile
if (gid == 0)
{
}
else
{
int tileFrame = gid - 1;
int column = tileFrame % tilesetTilesWide;
int row = (int)Math.Floor((double)tileFrame / (double)tilesetTilesWide);
float x = (i % easyMap.Width) * easyMap.TileWidth;
float y = (float)Math.Floor(i / (double)easyMap.Width) * easyMap.TileHeight;
Rectangle tileSetRec = new Rectangle(tileWidth * column, tileHeight * row, tileWidth, tileHeight);
spriteBatch.Draw(easyTileset, new Rectangle((int)x, (int)y, tileWidth, tileHeight), tileSetRec, Color.White);
}
}
}
spriteBatch.End();
base.Draw(gameTime);
}
我原来的地图是这样的:
当我 运行 代码时,它看起来像这样:
地图共有三层。我该如何修复我的循环?谢谢!
我可能是错的,但我认为您需要从后到前对磁贴进行排序。应先渲染位于底部的任何图块。
在for (currentTileLayer=0; currentTileLayer < easyMap.TileLayers.Count; currentTileLayer++)
将您的 TileLayers 替换为 var orderedTiles = easyMap.TileLayers.OrderBy(t => t.Tile.Gid)
您应该使用排序图层,因为 Tiled 对它们的支持非常好。使用图层可以为您提供更多的地图设计可能性。我还可以让你的角色隐藏在物体后面等等。 在平铺中,如果需要在顶部创建多个图层,请先创建背景图层以避免错误的绘制顺序。
一个简单的解决方案可能如下所示
const int LAYER_BACKGROUNDLAYER = 0;
const int LAYER_FRONTLAYER = 1;
const int LAYER_TOPLAYER = 2;
取决于你想使用多少层。
然后您只需将要绘制的图层编号传递给您的绘制方法即可。通常从 0 到最大数。
public void DrawLayer(int layer)
{
for (var j = 0; j < curMap.Layers[layer].Tiles.Count; j++)
{
int gid = curMap.Layers[layer].Tiles[j].Gid;
if (gid == 0)
{
//empty tile
}
else
{
//draw your tile
}
}
}
在这种情况下,"curMap" 是您当前通过 curMap = new TmxMap(mapSource); 加载的 .tmx 文件 上面的绘制代码应该适合您的代码,因为我也是基于 TiledSharp 示例的;)