我正在为我的XNA项目编写一个相机模块,最近我遇到了一个问题。
我允许相机旋转到我的模块,我得到了一个神话般的错误 - 每次我在相同的位置绘制多个精灵,spriteBatch曾经在前面绘制一个,第二次在前面绘制第二个,甚至更有趣,有时甚至更有趣显示了两个精灵,具有不同的alphas。
我做了很少的实验:
SpriteBatch
模式设置为Deffered
时,一切正常 - 但我希望能够访问z-index。我必须补充一点,我自己做翻译 - 以获得双精度。以下是翻译方法:
public void DrawSprite(Sprite toDraw)
{
// TODO: Think about converting constructor
Vector2D drawingPostion;
Vector2 drawingPos;
drawingPostion = toDraw.Position - Position;
drawingPos.X = (float) drawingPostion.X * GraphicsManager.Instance.UnitToPixels;
drawingPos.Y = (float) drawingPostion.Y * GraphicsManager.Instance.UnitToPixels;
spriteBatch.Draw(toDraw.Texture, drawingPos, toDraw.Source, toDraw.Color,
toDraw.Rotation, toDraw.Origin, toDraw.Scale, toDraw.Effects, toDraw.LayerDepth);
}
我对这个问题的想法:
答案 0 :(得分:1)
正如 lukegravitt 建议的那样,您应该使用SpriteSortMode.FrontToBack
:
在绘制之前,精灵按照前后顺序按深度排序。 在绘制不同的不透明精灵时,建议使用此过程 深处。
参考MSDN。
因此,您可以使用SpriteBatch.Draw
的最后一个参数
float layerDepth
图层的深度。默认情况下,0表示前层和1 代表一个背层。如果你想要精灵,请使用SpriteSortMode 在绘图期间排序。
参考MSDN。
答案 1 :(得分:0)
我最终选择了选项C),以下是我的代码中的工作方式:
public void DrawSprite(Sprite toDraw)
{
// TODO: Think about converting constructor
Vector2D drawingPostion;
Vector2 drawingPos;
drawingPostion = toDraw.Position - Position;
drawingPos.X = (float) drawingPostion.X * GraphicsManager.Instance.UnitToPixels;
drawingPos.Y = (float) drawingPostion.Y * GraphicsManager.Instance.UnitToPixels;
// proceeding to new z-index
zsortingValue += 0.000001f;
spriteBatch.Draw(toDraw.Texture, drawingPos, toDraw.Source, toDraw.Color,
toDraw.Rotation, toDraw.Origin, toDraw.Scale, toDraw.Effects, toDraw.LayerDepth + zsortingValue);
}
每当帧开始时zsortingValue
归零。这样每个精灵都可以有自己的排序值,只有增强。