【问题标题】:Letterboxing AND Scaling in XNA on PCPC 上 XNA 中的信箱和缩放
【发布时间】:2010-08-16 16:23:08
【问题描述】:

有没有一种方法可以让我基本上以 1080p(或 720p)作为我的默认分辨率开发我的 XNA 游戏,然后根据设置的分辨率将游戏中的所有内容缩放到适当的大小,而无需设置缩放因子在每个 Sprite Draw() 方法中?

我的想法是,我可以根据 1080p 的分辨率开发所有图形、配置坐标等,但是对于 XBOX,只需将分辨率设置为 720p 并按比例缩小(这样 XBOX 将所有内容都视为 720因此可以处理开发人员文档中提到的所有分辨率),并通过自动对非 16:9 分辨率的视图进行信箱处理,在 PC 上缩放到任何所需的分辨率或纵横比。

我已经完成了我的游戏设置,所以 spritebatch.begin() 和 end() 在最高级别调用,围绕所有其他 Draw 调用,所以我可以在技术上只是传递缩放矩阵,但每当我这样做会做一些奇怪的事情,比如使视图偏离中心,或者只占据屏幕的四分之一。

是否有实现这一目标的最佳实践方法?

【问题讨论】:

    标签: c# windows xna


    【解决方案1】:

    如果您在SpriteBatch.Begin 中设置缩放矩阵,那么它将缩放您绘制的每个精灵的大小和位置,使用SpriteBatch,直到您调用End

    SpriteBatch 使用客户端空间,其中零是Viewport 的左上角,该空间中的一个单位相当于视口中的一个像素。

    当您给SpriteBatch 一个变换时,您绘制的精灵将在绘制之前为您应用该变换。因此,您可以(并且应该)使用相同的技术翻译您的场景(例如,将其集中在您的播放器上)。

    例如:

    您的游戏是在 720p 下开发的,并且您使用的是 SpriteBatch 而不进行转换。您有一个位于右下角居中的精灵。假设它的纹理是 (32, 32) 像素,精灵的 origin 是 (16, 16)(原点在纹理空间中指定,所以这是精灵的中心)。精灵的position 是 (1280, 720)。 sprite 的 scale 为 1,这使得它的结果大小为 (32, 32)。您将在屏幕的右下角看到精灵的左上角四分之一。

    现在您移动到 ​​1080p(比 720p 大 1.5 倍)的屏幕。如果您将缩放矩阵添加到SpriteBatch,您可以看到整个精灵,它位于屏幕的三分之二处,向右和向下。

    但是您想放大整个场景,以便在 1080p 下看起来就像在 720p 下一样。因此,您将矩阵 Matrix.CreateScale(1.5f, 1.5f, 1f)(注意使用 1 作为 Z 轴,因为这是 2D 而不是 3D)添加到您的 SpriteBatch.Begin,然后什么都不做

    现在您的精灵场景将放大 1.5 倍。在不对实际的Draw 调用进行任何更改的情况下,您的精灵将被绘制在位置 (1920, 1080)(屏幕的右下角),其大小将为 (48, 48)(大 1.5 倍),并且它的原点仍将是中心。您将在屏幕右下角看到精灵的左上象限,就像您在 720p 下所做的那样,并且相对大小相同。

    【讨论】:

    • 所以,我最终做了这件事。它在一个非常简单的游戏中工作,只有一个代码文件。但是一旦我添加了基于 DrawableGameComponent 的子类,缩放就崩溃了。它会将所有内容缩放得太小,除了在主类中绘制的那些。我也只在最高级别调用了 Begin(),所以我不确定出了什么问题。致力于获取一些简化的示例代码。
    • @Adam:这很奇怪。您也许应该创建一个小示例程序,并且(如果练习本身没有说明问题)将其发布在此处。我通常避免自己使用 DrawableGameComponent,你可以直接控制更多的事情。另外:您如何将 SpriteBatch 放入 DGC?
    • 我的所有内容都基于 GameStateManagement 示例,因此我可以拥有菜单,并且“ScreenManager”是一个 DGC,在它的 Draw 方法中,它调用了其他所有内容。 Spritebatch 在其中创建并传递。我猜这与我的问题有关?
    • 你完全正确......我只是显然很愚蠢。我没有意识到我的大部分坐标计算仍然基于 GraphicsDevice.Viewport,所以它完全按照我的指示进行。一旦我为“预期”分辨率提供了变量并使用了这些变量,它就会正确缩放。
    猜你喜欢
    • 2011-03-29
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2013-05-06
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多