【问题标题】:Depth buffers for different screens in XNAXNA 中不同屏幕的深度缓冲区
【发布时间】:2013-11-29 22:50:18
【问题描述】:

我不太明白如何为我的程序中的不同屏幕处理 ZBuffering。我有一个screenControllers 类,它为我的每个活动Screen 类调用一个Draw 方法。 spriteBatch.BeginspriteBatch.End 调用是在screenController 的抽奖中进行的。 Screen 的 Draw 对正在绘制的每个纹理只有一个 spriteBatch.Draw 语句。我知道我可以在调用

时指定深度
public void Draw (
     Texture2D texture,
     Rectangle destinationRectangle,
     Nullable<Rectangle> sourceRectangle,
     Color color,
     float rotation,
     Vector2 origin,
     SpriteEffects effects,
     float layerDepth
) 

spriteBatch 的方法。

但是假设我打开一个屏幕,其中包含某个给定深度的纹理。然后,我打开的第二个屏幕应该具有与前一个相同深度值的其他纹理,但在前一个屏幕的 TOP 上按顺序绘制。我怀疑我是否需要此功能,因为我打开的第二个屏幕可能是我的场景窗口顶部的选项屏幕,前面有所有内容,或者它可能是不在场景窗口顶部但对边。我只是想知道这种多屏幕的分层功能是否可以在 XNA 中实现?

【问题讨论】:

    标签: c# xna buffer depth


    【解决方案1】:

    如果您使用不同的SpriteBatch 来管理它们,我认为您不会遇到这种问题。

    如果您使用相同的SpriteBatch,您可以使用scaleFactoroffsetValue 来管理Draws 的layerDepth 值,以便为每个屏幕的screenDepth 参数创建不同的反演.

    我的意思是,如果你有 2 个屏幕,第一个纹理在 [0, 0.5) 间隔中绘制,第二个纹理在 [0.5, 1) 中绘制。如果您有 3 个,则间隔将是每 0.33 次,依此类推...

    scaleFactor 当然是1 / numberOfScreens

    【讨论】:

    • 管理不同的SpriteBatch是什么意思?对每个屏幕使用不同的开始/结束调用,而不是 screenController 中的全局调用或不同的绘制方法?另外,对于第一个选项,您的意思是我是否有 3 个深度为 (0.3,0.5,0.9) 的纹理一个屏幕和两个纹理 (0.4,0.7) 在第二个屏幕上,如果我在第一个屏幕之后绘制第二个屏幕一个所有的第二个屏幕纹理将按正确的顺序位于第一个屏幕的顶部?
    • 这两件事都适合我写的,我想。无论如何,我还没有尝试过这样的事情,但你明白我的意思。是真的吗?
    • 我不明白如何将 scaleFactor 和 offsetValue 用于同一个 spriteBatch。为什么纹理的比例会随着屏幕数量的增加而减小?但是,如果您认为使用不同的 sprite 开始/结束命令会将其分层,我会试一试。抱歉,我还是 xna 的新手...
    • 我的意思是你应该缩放layerDepth 值,而不是纹理,以便为每个screenController 创建不同的layerDepth 间隔。例如,如果您只有两个 screenController,则后面的屏幕应该在[0, 0.5) 间隔中定义每个绘制,而前面的屏幕应该有间隔[0.5, 1) 的 layerDepth。在这种情况下,scaleFactor 为 0.5(因为您有两个 screenController),offset 第一个为 0,第二个为 0.5。
    • 你可以用任何你喜欢的方式来管理它,我只是想告诉你我将如何实现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多