C# 单游戏层相互重叠-为什么?

C# 单游戏层相互重叠-为什么?,c#,monogame,tiled,C#,Monogame,Tiled,我对Monogame和C#还不熟悉。我正在尝试使用在屏幕上渲染测试平铺贴图。然而,当我尝试绘制多个图层时,它们显然是在彼此之间循环绘制的 以下是我的绘图方法代码: protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); // TODO: Add your drawing code here spr

我对Monogame和C#还不熟悉。我正在尝试使用在屏幕上渲染测试平铺贴图。然而,当我尝试绘制多个图层时,它们显然是在彼此之间循环绘制的

以下是我的绘图方法代码:

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

    }
protected override void Draw(游戏时间游戏时间)
{
图形设备。清晰(颜色:矢车菊蓝);
//TODO:在此处添加图形代码
spriteBatch.Begin(排序模式:SpriteSortMode.FrontToBack,blendState:blendState.AlphaBlend,samplestate:samplestate.PointClamp,null,null,null,
矩阵。CreateScale(6.0f));
对于(currentTileLayer=0;currentTileLayer磁贴的全局id
如果(gid==0)
{
}
其他的
{
int tileFrame=gid-1;
int column=tileFrame%tileSettlesWide;
int行=(int)数学地板((双)瓷砖名称/(双)瓷砖宽度);
浮动x=(i%easyMap.Width)*easyMap.TileWidth;
浮动y=(浮动)数学地板(i/(双)easyMap.Width)*easyMap.TileHeight;
矩形平铺树=新矩形(平铺宽度*列,平铺高度*行,平铺宽度,平铺高度);
spriteBatch.Draw(easyTileset,新矩形((int)x,(int)y,平铺宽度,平铺高度),平铺树,颜色.白色);
}
}
}
spriteBatch.End();
基础。抽签(游戏时间);
}
我的原始地图如下所示:

当我运行代码时,它如下所示:


地图有三层。如何修复循环?谢谢

我可能错了,但我认为您需要从后到前对瓷砖进行排序。应首先渲染底部的瓷砖

在的
中(currentTileLayer=0;currentTileLayer


var orderedTiles=easyMap.tileayers.OrderBy(t=>t.Tile.Gid)替换您的tileayers

我可能错了,但我认为您需要从后到前对Tile进行排序。应首先渲染底部的瓷砖

在的
中(currentTileLayer=0;currentTileLayer


将TileLayers替换为
var orderedTitles=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
        }
    }
}
public void绘图层(int层)
{
对于(var j=0;j
在本例中,“curMap”是通过curMap=newtmxmap(mapSource)加载的当前.tmx文件;
上面的绘图代码应该适合您的代码,因为我也基于TiledSharp示例;)

您应该使用已排序的层,因为平铺很好地支持它们。使用图层在地图设计方面为您提供了更多的可能性。我还使您能够将角色隐藏在对象后面,等等。 在平铺中,如果需要,请首先创建背景层顶部的多个层,以避免错误的绘图顺序

一个简单的解决方案可能是这样的

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
        }
    }
}
public void绘图层(int层)
{
对于(var j=0;j
在本例中,“curMap”是通过curMap=newtmxmap(mapSource)加载的当前.tmx文件;
上面的绘图代码应该适合您的代码,因为我也基于TiledSharp示例;)

不幸的是,改变排序顺序并不会改变它的外观,但这可能是一个好主意。在第二部分中,TileLayers实际上是TmxList,它没有OrderBy()方法。OrderBy是一个Linq表达式。如果不能在该对象上使用Linq,那么可以编写自己的排序方法。我仍然相信错误是渲染的顺序。如果是别的,我想不出来。如果你足够勇敢的话,也可以创建自己的
OrderBy()
方法作为扩展方法。不幸的是,更改排序顺序并不会改变它的外观,但这可能是一个好主意。在第二部分中,TileLayers实际上是TmxList,它没有OrderBy()方法。OrderBy是一个Linq表达式。如果不能在该对象上使用Linq,那么可以编写自己的排序方法。我仍然相信错误是渲染的顺序。如果是别的东西,我想不出来。也可以创建自己的
OrderBy()
方法作为扩展