我有一个我正在研究的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);
下图显示了屏幕的外观。两侧的黑色是我想要的(并且来自第一个视口),第二个视口是游戏和矢车菊蓝色区域。我想要的是让比赛扩大到填充矢车菊蓝色区域。
答案 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)
我不确定你是否可以像这样扩展你的视口。我明白你要做什么,但要做到这一点,你必须做到以下几点。
问题是,如今你所有的主要游戏,如果你在16:9的显示器上播放它们并选择4:3的分辨率,它将会拉伸以适应屏幕。这不是你通常想要克服的。您可以在游戏中支持多种分辨率,或者当用户对其屏幕类型使用错误的分辨率时,您将获得延伸。
通常,人们根据当前视口或后备缓冲区宽度和高度的相对尺寸设置游戏,并根据其纹理进行操作。这样,无论输入的分辨率如何,游戏都会按比例缩放以适应宽高比。
这是一项更多的工作,但最终,使您的游戏更加精致,并与各种系统兼容。
唯一可能无法完成的是应用程序在窗口中运行(非全屏)。