Wenn diese jeweils separat sind DrawableGameComponents, sollten Sie die DrawOrderEigenschaften jeder Komponente so festlegen , dass sie in der richtigen Reihenfolge gezeichnet werden.
Um die Verwaltung beim Hinzufügen weiterer Komponenten zu vereinfachen, DrawOrdersollte Folgendes verwendet werden 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. */
}
Wenn dies alles in einem einzigen gezeichnet wird DrawableGameComponent, sollten Sie @ Andrews Rat befolgen und sie einfach in der richtigen Reihenfolge zeichnen. Wenn Sie dies aus irgendeinem Grund nicht tun können, können Sie bei der Verwendung immer noch die Klarheit von enums haben, layerDepthindem Sie einfach den Wert von enumzwischen 0 und 1 normalisieren :
/* 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();
}
(Die Reihenfolge der enumist umgekehrt, da layerDepthfür die vordere Schicht niedrigere Zahlen als für die hintere Schicht verwendet werden.)
layerDepth(da bin ich mir ziemlich sicher) liegt zwischen 0 und 1, sodass Sie innerhalb dieses Bereichs bleiben müssen. Zusätzlich muss das Zeichnen innerhalb eines Sprite-Stapels (zwischenBeginundEnd) erfolgen. Schließlich: Es ist darauf hinzuweisen, dass diese Methode keinen Leistungsvorteil bietet, wenn man die Dinge zunächst in der richtigen Reihenfolge zeichnet.