如何避免旋转spriteBatch闪烁?

时间:2013-11-25 23:22:20

标签: c# xna

我正在为我的XNA项目编写一个相机模块,最近我遇到了一个问题。

我允许相机旋转到我的模块,我得到了一个神话般的错误 - 每次我在相同的位置绘制多个精灵,spriteBatch曾经在前面绘制一个,第二次在前面绘制第二个,甚至更有趣,有时甚至更有趣显示了两个精灵,具有不同的alphas。

我做了很少的实验:

  1. 当我将SpriteBatch模式设置为Deffered时,一切正常 - 但我希望能够访问z-index。
  2. 当我绘制一个完整的500x500平铺阵列(所有精灵都已加载)时,一切正常,但是当我从阵列中获得50x50平方(包含整个所需的屏幕内容)时,它会被窃听。
  3. 最后,不同的状态总是以相同的角度发生。
  4. 我必须补充一点,我自己做翻译 - 以获得双精度。以下是翻译方法:

    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);
    }
    

    我对这个问题的想法:

    • 以某种方式修复错误(如果可能的话)
    • 强制XNA先按z-index排序,然后按绘制顺序排序。
    • 在任何地方应用一些z索引,可能会发生重叠(不喜欢这样)
    • 放弃z-index(不想要那个)

2 个答案:

答案 0 :(得分:1)

正如 lukegravitt 建议的那样,您应该使用SpriteSortMode.FrontToBack

  

在绘制之前,精灵按照前后顺序按深度排序。   在绘制不同的不透明精灵时,建议使用此过程   深处。

参考MSDN

因此,您可以使用SpriteBatch.Draw的最后一个参数

轻松设置z-index
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归零。这样每个精灵都可以有自己的排序值,只有增强。