是否可以为SpriteBatch.Begin组合多个SpriteSortMode?

时间:2010-12-04 05:54:21

标签: graphics windows-phone-7 xna drawing sprite

我想按图层深度(即SpriteSortMode.BackToFront)对精灵进行排序,但也要按SpriteSortMode.Immediate排序(我的理解是最后绘制的东西会被绘制在其他所有东西之上)。

我想要这种行为的原因是,如果我在相同的图层深度绘制两个精灵,那么我最后绘制的精灵就会被放在顶部。现在,它只是随机呈现在顶部,什么不呈现(我认为它类似于z战斗)。

我试过这个:

  SpriteBatch.Begin(SpriteSortMode.Immediate|SpriteSortMode.BackToFront, BlendState.AlphaBlend);

但它没有用......

2 个答案:

答案 0 :(得分:2)

不是你这样做的方式。 SpriteSortMode不是[Flags],因此您不应该将它们组合起来。

获得所需效果的一个简单想法是为您绘制的每个精灵添加一个不太重要的深度偏移。所以每次抽奖你都会写:

spriteBatch.Draw(..., 0.5f + depthOffset);
depthOffset += 0.0001f;

所以绘制的深度最终可能会像:

0.5f  ->  0.5f
0.5f  ->  0.5001f
0.8f  ->  0.8002f
0.8f  ->  0.8003f
0.6f  ->  0.6004f
0.5f  ->  0.5005f

当这个被排序时,你将得到一个稳定的排序(即:传入的相同值在输出时的顺序相同)。请注意,只有当最大增量(即最终精灵的最小值)小于所需深度值的最小差值时,这才有效。

答案 1 :(得分:1)

前一段时间我的游戏中遇到了类似的问题。我解决了类似安德鲁拉塞尔的回答。我认为我有更小的偏移(类似于0.0000001f)。我正在开发一个基于图块的游戏,我在y维度中为每个单元添加了一个偏移单元。这样就可以正确地绘制出应该被吸引的精灵。