これらがそれぞれ別個のDrawableGameComponents
場合はDrawOrder
、各コンポーネントのプロパティを設定して、正しい順序で描画されるようにする必要があります。
コンポーネントを追加するときに管理しやすくするにDrawOrder
は、をにする必要があり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. */
}
これがすべて1つの内に描画されているDrawableGameComponent
場合は、@ Andrewのアドバイスに従って、単に正しい順序で描画する必要があります。なんらかの理由でそれができない場合でもenum
、使用layerDepth
するときにの値をenum
0〜1に正規化するだけでsを明確にすることができます。
/* 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();
}
(バックレイヤーではなくフロントレイヤーに低い数値を使用するenum
ため、の順序は逆になりlayerDepth
ます)
layerDepth
私はかなり確信している)の有効範囲は0〜1なので、その範囲内に留まる必要があります。さらに、すべての描画は(間に1つのスプライトバッチ内で行われる必要がありますBegin
とEnd
)。最後に、この方法では、最初から正しい順序で単純に描画するよりもパフォーマンス上の利点がないことに注意してください。