2010-08-15 56 views
0

我知道,在XNA中开发Xbox时,基本上只需将分辨率设置为1280x720,而Xbox只会照顾一些事情,但在PC上,我无法正确处理分辨率。在PC上的XNA中的信箱

我希望它能够在其他分辨率下运行,但我实际上很乐意让游戏始终保持宽屏,并且仅在4:3屏幕上进行letterbox操作。我已经可以处理缩放游戏和它的组件,但我无法弄清楚如何得到它的信箱。

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

这样做的最好方法是什么?

回答

2

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

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

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

另外您投影空间将涵盖视,所以你不必担心做任何转换(除此之外,SpriteBatch作品在一个空间,是视域,而不是投影空间的像素大小,因此如果您的视口大于或小于1280x720,则可能必须进行缩放;我会详细介绍this answer中涉及的各种空间)。

要获得黑条,只需执行GraphicsDevice.Clear(Color.Black),将视口设置为全屏。

+1

工作完美。谢谢! – 2010-08-15 03:10:02

+0

好吧...几乎没有,我意识到它使缩放不能很好地工作.... – 2010-08-16 16:16:44

+0

@亚当:它应该工作正常。也许你在'Draw'调用中有一些屏幕相关的东西?我已经回答了你的后续问题。 – 2010-08-17 06:03:53

2

您可以使用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中。

+0

当然,这看起来似乎有点hacky ... – rfw 2010-08-15 02:01:35

+0

我试过了这样,并喜欢它的一般想法,它会扩大一切,但看不到它的工作......整个屏幕是倾斜的一切都偏离中心。 – 2010-08-16 16:17:25