如何使用Texture2D的很多层来管理深度

时间:2014-03-17 12:57:11

标签: c# xna xna-4.0

在我的游戏中,我必须管理很多对象。每个对象都有Depth值,在调用其绘制函数时将使用该值。

每个对象都是使用图层系统创建的:

Layer1: obj1 - obj2 - obj3 - obj4
Layer2: obj1 - obj2 - obj3 - obj4
Layer3: obj1 - obj2 - obj3 - obj4
Layer4: obj1 - obj2 - obj3 - obj4
ecc.

图层只是一个对象列表。

我的问题是如何管理每一层的每个深度。

从更高层次来看,Layer1位于Layer2,Layer3,Layer4之上; Layer2位于Layer1的底部,但位于Layer3,Layer4的顶部。因此,考虑到绘制调用中的深度值是介于0和1之间的值,我只是为每个级别分配了一个从0开始到1,步骤0.01的值。这样我将有最多100层。

现在我需要在图层中定义深度顺序,因此对于每个对象:Layer1.obj1位于obj2,obj3,obj4之上,但也位于Layer2.obj1,Layer2.obj2 ecc之上。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

enum LayerState : byte
{
    One,
    Two,
    Three,
    Four
}
void DrawLayer(LayerState state)
{
    switch (state)
    {
        case One:
          foreach (object obj in Layer1)
            SpriteBatch.Draw(obj);
        break;
        case Two:
          foreach (object obj in Layer2)
            SpriteBatch.Draw(obj);
        break;
        case Three:
          foreach (object obj in Layer3)
            SpriteBatch.Draw(obj);
        break;
        case Four:
          foreach (object obj in Layer4)
            SpriteBatch.Draw(obj);
        break;
     }
}

public override void Draw()
{
   SpriteBatch.Begin();
   DrawLayer(LayerState.Two) // play with states for result
   SpriteBatch.End();
   SpriteBatch.Begin();
   DrawLayer(LayerState.One) // play with states for result
   SpriteBatch.End();
   SpriteBatch.Begin();
   DrawLayer(LayerState.Three) // play with states for result
   SpriteBatch.End();
   SpriteBatch.Begin();
   DrawLayer(LayerState.Four) // play with states for result
   SpriteBatch.End();
}

如果它不起作用我很抱歉。只是建议。我认为void DrawLayer()将管理图层深度取决于LayerState和sprite批处理层的对象。

答案 1 :(得分:0)

您可以在深度上进一步细分0.01增量。

或者你可以简单地使用绘制顺序来决定在其他事物之上绘制什么?