C# 在XNA游戏中全屏无需伸展

C# 在XNA游戏中全屏无需伸展,c#,xna,C#,Xna,我有一个2D游戏,我正在做,它的纵横比是4:3。当我在宽屏显示器上将其切换到全屏模式时,它会拉伸。我尝试使用两个视口为游戏不应延伸到的位置提供黑色背景,但这使游戏的大小与以前相同。我无法让它填充本来应该容纳整个游戏的视口 我怎样才能让它在不拉伸的情况下全屏显示,而不需要修改游戏中的每个位置和平局?下面是我用于视口的代码 // set the viewport to the whole screen GraphicsDevice.Viewport =

我有一个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);
下图显示了屏幕的外观。侧面的黑色是我想要的(来自第一个视口),第二个视口是游戏和矢车菊蓝色区域。我想要的是让游戏的规模,以填补矢车菊蓝色区域


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

编辑:

就我所见,没有一款游戏能够“自动检测”合适的纵横比

正如已经指出的,有很多方法可以很好地猜测什么是合适的纵横比。如果XNA允许您获取当前Windows用户的屏幕设置数据,则可以根据监视器分辨率确定纵横比

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


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

使用视口

首先,我假设您谈论的是XNA 4.0,在XNA 3.x和XNA 4.0之间有突破性的更改

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

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

_graphics.PreferredBackBufferWidth = 320;
_graphics.PreferredBackBufferHeight = 240;
此外,您还可以通过以下设置启动全屏模式:

_graphics.IsFullScreen = true;
此外,您还必须手动处理在窗口更改其大小后项目应如何更改其大小

检查我的样品在。

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

致以最良好的祝愿,
赫伯

我不确定你是否真的可以这样缩放你的视图端口。我明白你想做什么,但要做到这一点,你必须做到以下几点

  • 将屏幕backbuffer宽度和高度设置为16:9分辨率
  • 在置换中编程,以便对象不会在这些边界中绘制
  • 问题是,现在所有的主要游戏,如果你在16:9的显示器上玩,并选择4:3的分辨率,都会拉伸到适合屏幕的程度。这不是你通常想要克服的事情。你要么在游戏中支持多种分辨率,要么当用户对其屏幕类型使用错误的分辨率时,你会感到紧张

    通常,用户会根据当前视口的相对尺寸或backbuffer宽度和高度设置游戏和纹理。这样,无论输入的分辨率如何,游戏都会按照该宽高比进行缩放

    这是一个多一点的工作,但最终,使您的游戏更加抛光和兼容广泛的系统


    只有当应用程序在窗口(非全屏)中运行时,才能执行此操作。

    您可能有兴趣知道,实际上有一个游戏开发堆栈交换站点,你可能会得到一个更好的答案:你经常可以通过查看用户的桌面分辨率来猜测正确的纵横比;我想他们会先“猜”出比例,然后再让你更改。我们的时间很短,没有资源重做16:9宽高比的所有艺术和关卡。检测比率不同很简单,我已经在做了。问题是我一直在尝试不伸展。正如我在问题中提到的,这就是我一直在尝试的。我无法让我的2D游戏填满视口。它只是位于左上角,而不是缩放以适应。我不认为你使用了那个视口。坐在左上方?是否设置了视口的.X和.Y成员?您需要将屏幕的视口居中。。意思:你需要设置一个合理的高宽比。(在本例中比屏幕窄)然后将其居中。对,我有一个视口,它只是在后面制作一个黑屏,然后是一个居中的视口,它符合我的纵横比。问题是,实际的游戏屏幕无法缩放以适应居中视口。我不能只移动一个摄像头,因为游戏完全是2D的,我甚至从来没有初始化过摄像头。我不知道你在说什么。你能提供一个截图吗。如果你翻译渲染(包括鼠标指针),游戏性应该不会有问题。只需在读取鼠标输入时进行反向翻译。(如果在视口的中心添加30个像素,然后在读取鼠标位置时减去30个像素)我太接近了!在所有这些代码之后,我使用了spriteBatch.Begin(),但我应该做的是这样。spriteBatch.Begin(SpriteBlendMode.AlphaBlend,SpriteSortMode.Immediate,SaveStateMode.None,Matrix.CreateScale(scale));Where scale是我应该使用的当前量表。谢谢,但这是我已经在做的,这导致了它在d上被拉伸的问题