如何避免旋转spriteBatch闪烁



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

我允许相机旋转到我的模块,我得到了一个惊人的错误-每次我在同一位置绘制多个精灵时,spriteBatch都会在前面绘制一个,第二次是在前面绘制第二个,更有趣的是,有时会显示两个精灵,使用不同的字母。

我做了几个实验:

  1. 当我将SpriteBatch模式设置为Deffered时,一切都可以,但我希望能够访问z索引
  2. 当我绘制一个完整的500x500瓷砖阵列(加载的所有精灵)时,一切都很好,但当我从阵列中得到50x50正方形(包含整个所需的屏幕内容)时,它会出错
  3. 最后,不同的状态总是发生在同一个角度

我必须补充一点,我自己做翻译——为了获得双倍的精度。以下是翻译方法:

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索引排序,然后按绘图顺序排序
  • 在任何可能发生重叠的地方应用一些z索引(不喜欢这样)
  • 放弃z索引(也不希望这样)

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

精灵在绘制之前按深度从前到后的顺序进行排序。当绘制不同颜色的不透明精灵时,建议使用此过程深度。

参考MSDN。

因此,您可以使用SpriteBatch.Draw:的最后一个参数轻松设置z索引

float layerDepth

层的深度。默认情况下,0表示前一层,1表示背面层。如果希望精灵为在绘图过程中排序。

参考MSDN。

我终于选择了选项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);
        }

其中每当帧开始时CCD_ 5被置零。通过这种方式,每个精灵都可以有自己的排序值,这只是在增强。

最新更新