我知道,在XNA中开发Xbox时,基本上只需将分辨率设置为1280x720,而Xbox只会照顾一些事情,但在PC上,我无法正确处理分辨率。在PC上的XNA中的信箱
我希望它能够在其他分辨率下运行,但我实际上很乐意让游戏始终保持宽屏,并且仅在4:3屏幕上进行letterbox操作。我已经可以处理缩放游戏和它的组件,但我无法弄清楚如何得到它的信箱。
显然,这在窗口模式下不是必须的,但是当以全屏模式运行时,我只需要弄清楚如何让游戏只在屏幕的一部分上绘制。
这样做的最好方法是什么?
我知道,在XNA中开发Xbox时,基本上只需将分辨率设置为1280x720,而Xbox只会照顾一些事情,但在PC上,我无法正确处理分辨率。在PC上的XNA中的信箱
我希望它能够在其他分辨率下运行,但我实际上很乐意让游戏始终保持宽屏,并且仅在4:3屏幕上进行letterbox操作。我已经可以处理缩放游戏和它的组件,但我无法弄清楚如何得到它的信箱。
显然,这在窗口模式下不是必须的,但是当以全屏模式运行时,我只需要弄清楚如何让游戏只在屏幕的一部分上绘制。
这样做的最好方法是什么?
可以设置GraphicsDevice.Viewport
到您要使用的视口。
The documentation有一个如何做到这一点的例子(它用于分屏,但是信箱式单视图是相同的概念)。
GPU将为您处理对此视口的裁剪。
另外您投影空间将涵盖视,所以你不必担心做任何转换(除此之外,SpriteBatch
作品在一个空间,是视域,而不是投影空间的像素大小,因此如果您的视口大于或小于1280x720,则可能必须进行缩放;我会详细介绍this answer中涉及的各种空间)。
要获得黑条,只需执行GraphicsDevice.Clear(Color.Black)
,将视口设置为全屏。
您可以使用GraphicsDevice.Viewport
来获得纵横比,您可以使用它来构造缩放矩阵以与SpriteBatch
一起使用,也可以使用仿射转换来定位精灵批量中心屏幕。
您可以每帧调用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
中。
当然,这看起来似乎有点hacky ... – rfw 2010-08-15 02:01:35
我试过了这样,并喜欢它的一般想法,它会扩大一切,但看不到它的工作......整个屏幕是倾斜的一切都偏离中心。 – 2010-08-16 16:17:25
工作完美。谢谢! – 2010-08-15 03:10:02
好吧...几乎没有,我意识到它使缩放不能很好地工作.... – 2010-08-16 16:16:44
@亚当:它应该工作正常。也许你在'Draw'调用中有一些屏幕相关的东西?我已经回答了你的后续问题。 – 2010-08-17 06:03:53