【问题标题】:Monogame C# - How do I draw my sprites between tilemap layer 0 and 1?Monogame C# - 如何在 tilemap 图层 0 和 1 之间绘制我的精灵?
【发布时间】:2021-06-01 20:30:33
【问题描述】:

我有一个瓷砖地图:

this.TileMap = Content.Load<TiledMap>("Maps/MyTileMap");
_tiledMapRenderer = new TiledMapRenderer(GraphicsDevice, this.TileMap);

我想在第 0 层和第 1 层之间渲染我的正常精灵。有点像这样:

DrawLayer(0, 0f);
foreach(var sprite in this.Sprites)
{
    sprite.Draw(spriteBatch, gameTime);
}
DrawLayer(1, 1f);

sprite.Draw 会:

var destRectangle = new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height);
spriteBatch.Draw(Texture, destRectangle, null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 0.2f);

DrawLayer 做到了:

var layer = this.TileMap.Layers[idx];
_tiledMapRenderer.Draw(layer, this.Camera.GetViewMatrix(), depth: depth);

但我的常规精灵仍然是最重要的。

地形在第 0 层,树在第 1 层(显然)。

我认为提供 layerDepth 应该确保正确的绘制顺序,但显然不能。

Any pointers on how to fix this?

或者,或者,

how can I add my sprites to a layer? 

我听说这是一个选项,但我不知道怎么做。

【问题讨论】:

  • 树的顶部应始终绘制在实体/玩家层之上的层中。在这个例子中,确实应该有第 3 层,树的底部树干应该是第 1 层。而玩家/实体是第 2 层。

标签: c# monogame tiled monogame-extended


【解决方案1】:

正如预期/希望的那样,它必须是简单的,因为我不敢相信每个人都会使用 Tiled,如果它实际上不能产生可行的结果。

所以有效的方法是将其添加到 .Begin():

_spriteBatch.Begin(sortMode: SpriteSortMode.ImmediatetransformMatrix: this.Camera.GetViewMatrix(), );

这让我明白了:

【讨论】:

    【解决方案2】:

    那是行不通的,因为你不知道相对于你的人物精灵应该为那棵树分配什么层。具体来说,如果这个人在树的南边,你希望它画在树的顶部,而当它在树的北边时,你希望它在树下。

    您必须对精灵进行排序,以便从屏幕底部向上绘制。

    【讨论】:

    • 排序?您可以使用.OrderBy并按Y坐标排序。
    • 我想的远不止这些 :-) 我的意思是绘制逻辑。很高兴看到一段正常运行的代码。
    • 主要是分层绘制结构。如果只能使用地形图层,Tiled 就没有多大用处了。
    • 当然,但是您要绘制的在同一层上。
    • 我不明白你的意思,地形是第0层,树是分开的,在下一层(所以1)。