Se estes forem separados DrawableGameComponents, você deve definir a DrawOrderpropriedade de cada componente para que eles desenhem na ordem correta.
Para torná-lo mais gerenciável à medida que você adiciona mais componentes, DrawOrderdeve ser enum:
/* DisplayLayer.cs */
public enum DisplayLayer
{
Background, //back-layer
Particles,
Player,
MenuBack,
MenuFront //front-layer
}
public class MyComponent : DrawableGameComponent
{
public MyComponent(Game game) : base(game)
{
this.DrawOrder = (int)DisplayLayer.Background;
}
/* etc. */
}
Se tudo isso estiver sendo elaborado em um único DrawableGameComponent, você deve seguir os conselhos de @ Andrew e simplesmente desenhá-los na ordem correta. Se, por algum motivo, você não puder fazer isso, ainda poderá ter a clareza de enums ao usá-lo layerDepth, simplesmente normalizando o valor de enumentre 0 e 1:
/* DisplayLayer.cs */
public enum DisplayLayer
{
MenuFront, //front-layer
MenuBack,
Player,
Particles,
Background, //back-layer
MAX_LAYER //Do not use this as a layer
}
public void Draw()
{
spriteBatch.Begin(SpriteSortMode.BackToFront);
foreach(Thingy thingy in thingys)
spriteBatch.Draw(/* blah blah */, (float)thingy.DisplayLayer/(float)DisplayLayer.MAX_LAYER);
spriteBatch.End();
}
(A ordem do enumé revertida porque layerDepthusa números mais baixos para a camada frontal em vez da camada posterior)
layerDepth(tenho razoavelmente certeza) é de 0 a 1, portanto, você deve permanecer dentro desse intervalo. Além disso, todo o desenho precisará ser feito dentro do lote de um sprite (entreBegineEnd). Finalmente: vale ressaltar que esse método não oferece benefícios de desempenho em vez de simplesmente desenhar as coisas na ordem correta em primeiro lugar.