Se estes forem separados DrawableGameComponents
, você deve definir a DrawOrder
propriedade de cada componente para que eles desenhem na ordem correta.
Para torná-lo mais gerenciável à medida que você adiciona mais componentes, DrawOrder
deve 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 enum
s ao usá-lo layerDepth
, simplesmente normalizando o valor de enum
entre 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 layerDepth
usa números mais baixos para a camada frontal em vez da camada posterior)
BlueRaja - Danny Pflughoeft
fonte
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 (entreBegin
eEnd
). 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.Vou dar a resposta simples e bastante óbvia, e isso é apenas desenhar tudo na ordem correta em primeiro lugar .
Para criar um exemplo do que quero dizer:
Existe uma razão específica e convincente para você não estar desenhando suas janelas dessa maneira?
fonte
SpriteBatch
não pode lote após uma alteração de textura - portanto, meu método é potencialmente mais lento que o método dele, se sua implementação for otimizada corretamente.SpriteBatch
agrupar todas as suas operações. Basta modificar os métodos de desenho para aceitarSpriteBatch
como parâmetro. Em seguida, no método "Draw" mais básico, primeiro chameSpriteBatch.Begin()
- depois chame "Draw" no Windows (passandoSpriteBatch
, que eles usarão e passará para cada filho) - depois do loop, no mais básico Método "Draw", ligueSpriteBatch.End()
. . . (My $ 0,02: Aposto que ele não está usando objetos e toda a coisa é provavelmente uma confusão processual grande em seu principalGame
. Class)