在没有拉伸XNA游戏的情况下全屏显示

时间:2011-01-24 22:14:41

标签: c# xna

我有一个我正在研究的2D游戏,它的宽高比为4:3。当我在宽屏显示器上将其切换到全屏模式时,它会拉伸。我尝试使用两个视口给游戏不应该延伸的黑色背景,但这使游戏保持与以前相同的大小。我无法让它填满本应举行整个游戏的视口。

如果没有拉伸而且我不需要修改游戏中的每个位置和绘制语句,我怎样才能让它全屏显示?我用于视口的代码如下。

            // 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);

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

Not correctly scaling

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

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

编辑:

就我所见,没有游戏可以“自动检测”正确的纵横比。

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

确定用户的显示器分辨率后,您可以最好地决定如何处理它。首先,最好的选择可能是在屏幕的左/右侧放置黑条,以允许全屏显示16:9宽高比,基本上仍然使用4:3艺术品。

最终,您可以修改游戏,以便在宽高比为16:9时更改观看端口大小。这不需要改变任何艺术资产,只需改变它们的呈现方式。

答案 2 :(得分:0)

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

我在XNA上比较新,但在我看来,你的资产不符合窗口的大小。假设你的游戏是320x240而且你的窗口更大,例如640×480。

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

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

此外,您可以通过设置:

启动全屏模式
_graphics.IsFullScreen = true;

此外,您必须手动处理窗口更改大小后项目应如何更改其大小。

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

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

祝你好运, 数量锐减

答案 3 :(得分:0)

我不确定你是否可以像这样扩展你的视口。我明白你要做什么,但要做到这一点,你必须做到以下几点。

  1. 将屏幕后缓冲区宽度和高度设置为16:9分辨率。
  2. 在位移中编程,以便对象不会在这些边界中绘制。
  3. 问题是,如今你所有的主要游戏,如果你在16:9的显示器上播放它们并选择4:3的分辨率,它将会拉伸以适应屏幕。这不是你通常想要克服的。您可以在游戏中支持多种分辨率,或者当用户对其屏幕类型使用错误的分辨率时,您将获得延伸。

    通常,人们根据当前视口或后备缓冲区宽度和高度的相对尺寸设置游戏,并根据其纹理进行操作。这样,无论输入的分辨率如何,游戏都会按比例缩放以适应宽高比。

    这是一项更多的工作,但最终,使您的游戏更加精致,并与各种系统兼容。

    唯一可能无法完成的是应用程序在窗口中运行(非全屏)。