Nếu mỗi cái này là riêng biệt DrawableGameComponents
, bạn nên đặt thuộc DrawOrder
tí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, DrawOrder
nê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 enum
s khi sử dụng bằng layerDepth
cách đơn giản hóa giá trị của giá trị enum
nằ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ì layerDepth
sử 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ữaBegin
và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.