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.)
BlueRaja - Danny Pflughoeft
quelle
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.Ich werde die einfache und ziemlich offensichtliche Antwort geben, und das heißt, ich zeichne zunächst alles in der richtigen Reihenfolge .
Um ein Beispiel für das zu verspotten, was ich meine:
Gibt es einen bestimmten, zwingenden Grund, warum Sie Ihre Fenster nicht bereits auf diese Weise zeichnen?
quelle
SpriteBatch
kann nicht Batch an einer Textur ändern - so meine Methode ist möglicherweise langsamer als seine Methode , wenn seine Umsetzung ordnungsgemäß optimiert wird .SpriteBatch
Vorgänge zusammenzufassen. Ändern Sie einfach die Zeichenmethoden, um dasSpriteBatch
als Parameter zu akzeptieren . Rufen SieSpriteBatch.Begin()
dann in der Basis-Methode "Zeichnen" zuerst auf - rufen Sie dann "Zeichnen" unter Windows auf (ÜbergabeSpriteBatch
, die sie verwenden und an jedes untergeordnete Element übergeben) - und dann nach der Schleife in der Basis- Methode "Draw" -Methode aufrufenSpriteBatch.End()
. . . (Meine $ 0,02: Ich wette, er benutzt keine Objekte und das Ganze ist wahrscheinlich ein großes prozedurales Durcheinander in seiner HauptklasseGame
.)