【问题标题】:Going fullscreen without stretching in an XNA game在 XNA 游戏中无需拉伸即可全屏显示
【发布时间】:2012-06-26 04:33:35
【问题描述】:

我正在开发一款 4:3 纵横比的 2D 游戏。当我在宽屏显示器上将其切换到全屏模式时,它会拉伸。我尝试使用两个视口为游戏不应伸展到的位置提供黑色背景,但这会使游戏的大小与以前相同。我无法让它填满本应容纳整个游戏的视口。

如何在不拉伸且无需修改游戏中的每个位置和绘制语句的情况下让它全屏显示?我用于视口的代码如下。

            // set the viewport to the whole screen
            GraphicsDevice.Viewport = new Viewport
            {
                X = 0,
                Y = 0,
                Width = GraphicsDevice.PresentationParameters.BackBufferWidth,
                Height = GraphicsDevice.PresentationParameters.BackBufferHeight,
                MinDepth = 0,
                MaxDepth = 1
            };

            // clear whole screen to black
            GraphicsDevice.Clear(Color.Black);

            // figure out the largest area that fits in this resolution at the desired aspect ratio
            int width = GraphicsDevice.PresentationParameters.BackBufferWidth;
            int height = (int)(width / targetAspectRatio + .5f);
            if (height > GraphicsDevice.PresentationParameters.BackBufferHeight)
            {
                height = GraphicsDevice.PresentationParameters.BackBufferHeight;
                width = (int)(height * targetAspectRatio + .5f);
            }
            //Console.WriteLine("Back:  Width: {0}, Height: {0}", GraphicsDevice.PresentationParameters.BackBufferWidth, GraphicsDevice.PresentationParameters.BackBufferHeight);
            //Console.WriteLine("Front: Width: {0}, Height: {1}", width, height);

            // set up the new viewport centered in the backbuffer
            GraphicsDevice.Viewport = new Viewport
            {
                X = GraphicsDevice.PresentationParameters.BackBufferWidth / 2 - width / 2,
                Y = GraphicsDevice.PresentationParameters.BackBufferHeight / 2 - height / 2,
                Width = width,
                Height = height,
                MinDepth = 0,
                MaxDepth = 1
            };

            GraphicsDevice.Clear(Color.CornflowerBlue);

下图显示了屏幕的样子。两侧的黑色是我想要的(并且来自第一个视口),第二个视口是游戏和矢车菊蓝色区域。我想要的是让游戏扩展以填充矢车菊蓝色区域。

【问题讨论】:

  • 您可能有兴趣知道实际上有一个 Game Development Stack Exchange 网站,您可能会在此获得更好的答案:gamedev.stackexchange.com

标签: c# xna


【解决方案1】:

【讨论】:

  • 正如我的问题中提到的,这就是我一直在尝试的。我无法让我的 2D 游戏填充视口。它只是位于左上角,而不是缩放以适应。
  • 好的。没想到您使用了 那个 视口。坐在左上角?您是否设置了视口的 .X 和 .Y 成员?您需要将屏幕的视口居中。意思是:您需要根据您的纵横比设置合理的高度/宽度。 (在这种情况下比屏幕窄)然后居中。
  • 对,我有一个视口,它只是在后面制作一个黑屏,然后是一个适合我的纵横比的居中视口。问题是实际的游戏屏幕无法缩放以适应居中的视口。我不能只移动相机,因为游戏完全是 2D 的,而且我什至从未初始化相机。
  • 我不确定你在说什么。你能提供一个截图。如果您翻译渲染(包括鼠标指针),它不应该是游戏的问题。只需在读取鼠标输入时进行反向翻译。 (如果将视口居中添加 30 个像素,则在读取鼠标位置时减去 30 个像素)
  • 我是如此接近!毕竟我使用了 spriteBatch.Begin() 的所有代码,但我应该做的是这个。 spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None, Matrix.CreateScale(scale));其中 scale 是我应该使用的当前比例。
【解决方案2】:

与商业游戏一样,您应该为用户提供一个选项,允许他们在 4:3 宽高比和 16:9 宽高比之间切换。您应该能够相应地修改相机的观看比例。

编辑:

据我所知,没有任何游戏可以“自动检测”合适的宽高比。

正如已经指出的那样,有一些方法可以很好地猜测正确的纵横比是多少。如果 XNA 允许您获取当前 Windows 用户的屏幕设置数据,您可以根据显示器分辨率确定宽高比。

一旦您确定了用户的显示器分辨率,您就可以最好地决定如何处理它。起初,最好的办法可能是在屏幕的左侧/右侧放置黑条,以允许以 16:9 的纵横比进行全屏,基本上仍然使用 4:3 的艺术作品。

最终您可以修改游戏,使其在纵横比为 16:9 时更改查看端口大小。这不需要更改任何艺术资产,只需更改它们的渲染方式即可。

【讨论】:

  • 您可以经常通过查看用户的桌面分辨率来猜测正确的宽高比。
  • 其实你们可能是对的;我认为他们先“猜测”比率,然后让您更改它。
  • 我们的时间还很短,没有资源来重做 16:9 纵横比的所有美术和关卡。检测比率不同很简单,我已经在这样做了。问题是我试图没有伸展。
【解决方案3】:

首先,我假设您在谈论 XNA 4.0,据我所知,XNA 3.x 和 XNA 4.0 之间存在重大变化。

我在 XNA 相对较新,但在我看来,您的资产不适合窗口的大小。假设您的游戏是 320x240 并且您的窗口更大,例如640x480。

因此,您可以指定 PreferredBuffer 以扩展您的应用程序。因此,通过设置以下值告诉 XNA 您将使用 320x240;

_graphics.PreferredBackBufferWidth = 320;
_graphics.PreferredBackBufferHeight = 240;

此外,您可以通过设置启动全屏模式:

_graphics.IsFullScreen = true;

此外,一旦窗口改变了它们的大小,您必须手动处理项目应该如何改变它们的大小。

查看我的样品。 https://github.com/hmadrigal/xnawp7/tree/master/XNASample02

(顺便说一句,你可以按F11在全屏和普通视图之间切换)

最好的问候, 赫伯

【讨论】:

  • 谢谢,但这就是我已经在做的事情,这导致了它在不同的纵横比上被拉伸的问题。
【解决方案4】:

我不确定您是否真的可以像这样缩放视口。我了解您要执行的操作,但要执行此操作,您必须执行以下操作。

  1. 将屏幕后缓冲区的宽度和高度设置为 16:9 分辨率。
  2. 在置换中编程,使对象不会在这些边界中绘制。

问题是,如今所有主要游戏,如果您在 16:9 显示器上玩它们并选择 4:3 分辨率,它们都会拉伸以适应屏幕。这不是你通常想要克服的。您要么在游戏中支持多种分辨率,要么当用户为其屏幕类型使用错误的分辨率时,您会感到捉襟见肘。

通常,人们会根据当前视口的相对尺寸或后备缓冲区的宽度和高度来设置他们的游戏和纹理。这样一来,无论输入的分辨率如何,游戏都会根据该宽/高比进行缩放。

这需要更多的工作,但最终会让您的游戏更加精致,并与各种系统兼容。

只有在应用程序在窗口中运行(不是全屏)时才可以这样做。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2013-03-31
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多