Nếu mỗi cái này là riêng biệt DrawableGameComponents, bạn nên đặt thuộc DrawOrdertính của từng thành phần để chúng vẽ theo đúng thứ tự.
Để làm cho nó dễ quản lý hơn khi bạn thêm nhiều thành phần, DrawOrdernên là 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. */
}
Nếu tất cả điều này được rút ra trong một lần duy nhất DrawableGameComponent, thì bạn nên nghe lời khuyên của @ Andrew và chỉ cần vẽ chúng theo đúng thứ tự. Nếu vì lý do nào đó bạn không thể làm điều đó, bạn vẫn có thể có sự rõ ràng của enums khi sử dụng bằng layerDepthcách đơn giản hóa giá trị của giá trị enumnằm trong khoảng từ 0 đến 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();
}
(Thứ tự của enumđảo ngược vì layerDepthsử dụng số thấp hơn cho lớp trước thay vì lớp sau)
layerDepth(tôi khá chắc chắn) là 0 đến 1, vì vậy bạn phải ở trong phạm vi đó. Ngoài ra, tất cả các bản vẽ sẽ cần phải được thực hiện trong một đợt sprite (giữaBeginvàEnd). Cuối cùng: điều đáng nói là phương pháp này không mang lại lợi ích hiệu suất nào hơn là chỉ đơn giản là vẽ mọi thứ theo đúng thứ tự ngay từ đầu.