我知道在XNA中为Xbox开发时,你基本上只需将分辨率设置为1280x720,而Xbox只会处理事情,但在PC上,我在处理正确处理分辨率方面遇到了一些麻烦。
我希望它可以在其他分辨率下运行,但我真的很高兴让游戏总是宽屏,只需在4:3屏幕上进行letterbox。我已经可以处理缩放游戏及其组件,但我无法弄清楚如何将其设置为letterboxed。
显然,在窗口模式下这不是必需的,但是当全屏运行时,我只需要弄清楚如何让游戏仅在屏幕的一部分上绘制。
最好的方法是什么?
答案 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)
。