Wenn diese jeweils separat sind DrawableGameComponents
, sollten Sie die DrawOrder
Eigenschaften jeder Komponente so festlegen , dass sie in der richtigen Reihenfolge gezeichnet werden.
Um die Verwaltung beim Hinzufügen weiterer Komponenten zu vereinfachen, DrawOrder
sollte 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 enum
s haben, layerDepth
indem Sie einfach den Wert von enum
zwischen 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 enum
ist umgekehrt, da layerDepth
fü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 (zwischenBegin
undEnd
) erfolgen. Schließlich: Es ist darauf hinzuweisen, dass diese Methode keinen Leistungsvorteil bietet, wenn man die Dinge zunächst in der richtigen Reihenfolge zeichnet.