【问题标题】:How to avoid shimmering with rotated spriteBatch?如何避免旋转 spriteBatch 闪烁?
【发布时间】:2013-11-25 23:22:20
【问题描述】:

我正在为我的 XNA 项目编写一个摄像头模块,但最近遇到了一个问题。

我允许相机旋转到我的模块,但我遇到了一个极好的错误 - 每次我在同一位置绘制多个精灵时,spriteBatch 一次在前面绘制一个,第二次在前面绘制第二个,有时甚至更有趣显示了两个精灵,具有不同的 alpha。

我做了一些实验:

  1. 当我将 SpriteBatch 模式设置为 Deffered 时,一切正常 - 但我想访问 z-index。
  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-index 排序,然后按绘图顺序。
  • 在可能发生重叠的地方应用一些 z-index(不喜欢这样)
  • 放弃 z-index(也不想要)

【问题讨论】:

  • 查看spriteBatch.Begin(SpriteSortMode.BackToFront);DrawableGameComponent 上的DrawOrder 属性
  • 我实际上并没有使用DrawableGameComponents,但无论如何我都可以使用LayerDepth。回到前面是我现在使用的,似乎当有两个相同LayerDepth 的精灵时,系统会因某些角度速率而损坏。它不关心我调用SpriteBatch.Draw() 方法的顺序。我担心的是,当我绘制所有加载的精灵时,它似乎工作正常:/

标签: c# xna


【解决方案1】:

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

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

参考MSDN

所以你可以用SpriteBatch.Draw的最后一个参数轻松设置z-index:

float layerDepth

层的深度。默认情况下,0代表前层,1 表示后层。如果您希望精灵成为,请使用 SpriteSortMode 在绘图期间排序。

参考MSDN

【讨论】:

  • 实际上,在我的情况下,我真的以 FrontToBack 结束(我使用 1 作为前面,使用 0 作为后面)。结合您的答案和我的答案,我终于可以找到解决方案。谢谢你:)
【解决方案2】:

我终于选择了选项 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 在帧开始时归零。这样每个精灵都可以有自己的排序值,这只是被增强了。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2013-05-02
    • 2016-06-30
    • 2023-03-22
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多