PC上的XNA中的信箱

时间:2010-08-15 00:50:07

标签: c# windows xna

我知道在XNA中为Xbox开发时,你基本上只需将分辨率设置为1280x720,而Xbox只会处理事情,但在PC上,我在处理正确处理分辨率方面遇到了一些麻烦。

我希望它可以在其他分辨率下运行,但我真的很高兴让游戏总是宽屏,只需在4:3屏幕上进行letterbox。我已经可以处理缩放游戏及其组件,但我无法弄清楚如何将其设置为letterboxed。

显然,在窗口模式下这不是必需的,但是当全屏运行时,我只需要弄清楚如何让游戏仅在屏幕的一部分上绘制。

最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用GraphicsDevice.Viewport获取宽高比,您可以使用它来构建用于SpriteBatch的缩放矩阵,也可以使用仿射转换来定位精灵批量中心屏幕。< / p>

您可以每帧调用GraphicsDevice.Clear,但如果这对您来说有点浪费,那么只需绘制一个黑色矩形而不是清除新视口。

例如,假设你想要16:9的宽高比,你可以这样做(忍受我,我正在使用XNA 4,所以它可能会有所不同):

float aspect = 16.0f / 9.0f;

GraphicsDevice.Clear(Color.Black);
Matrix transform = Matrix.CreateScale(1, GraphicsDevice.Viewport.AspectRatio / aspect, 1) * Matrix.CreateTranslation(0, (GraphicsDevice.Viewport.Height - GraphicsDevice.Viewport.Height / aspect) / 4.0f, 0);
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, null, transform);

// do your drawing here

sBatch.End()

每次都无需重建transform,因此您可以将其存储为Game中的私有成员变量。

答案 1 :(得分:2)

您可以 设置 GraphicsDevice.Viewport到您要使用的视口。

The documentation有一个如何做到这一点的例子(它用于分屏,但是单个视图的信件是相同的概念)。

GPU将为您处理对此视口的裁剪。

此外,您的投影空间将覆盖该视口,因此您无需担心进行任何转换(SpriteBatch除外,其工作空间的像素大小为视口,而不是投影空间,因此如果视口大于或小于1280x720,则可能需要进行缩放;我将详细介绍this answer中涉及的各种空间。

要获得黑条,只需在视口设置为全屏的情况下执行GraphicsDevice.Clear(Color.Black)