在PC上Xbox上的Letterboxing和缩放

有没有一种方法可以基本上以1080p(或720p)为基础开发我的XNA游戏作为我的默认分辨率,然后根据设置的分辨率将游戏中的所有内容缩放到合适的大小,而不必在每个Sprite中设置缩放因子Draw()方法?

我的想法是,我可以根据1080p的分辨率开发所有graphics,configuration坐标等,但是对于XBOX,只需将res设置为720p并缩小(以便XBOX将所有内容都视为720,从而处理开发人员文档中提到的所有分辨率)和PC上的分辨率或宽高比,自动对非16:9分辨率的视图进行分组。

我已经有了我的游戏设置,所以spritebatch.begin()和end()在所有其他Draw调用的最高级别被调用,所以我可以在技术上传递缩放matrix,但是每当我这样做会做一些奇怪的事情,比如让视图偏离中心,或者只占用屏幕的四分之一。

有没有实现这一目标的最佳实践方法?

如果你在SpriteBatch.Begin设置了一个缩放矩阵,那么它将使用该SpriteBatch.Begin缩放你绘制的每个精灵的大小和位置 ,直到你调用End

SpriteBatch使用客户端空间,其中零是Viewport左上角,并且该空间中的一个单元相当于视口中的一个像素。

当你给SpriteBatch一个转换时,你绘制的精灵会在你绘制之前将这个转换应用到它们上面。 所以你可以(也应该)使用这种相同的技术来翻译你的场景(例如把它集中在你的播放器上)。

例如:

你的游戏是在720p开发的,你使用的是SpriteBatch而不需要转换。 你有一个精灵集中在右下角。 假设它的纹理是(32,32)像素,精灵的origin是(16,16)(原点在纹理空间中指定,所以这是精灵的中心)。 精灵的position是(1280,720)。 精灵的scale是1,这使得它的结果大小(32,32)。 您将在屏幕的右下角看到精灵的左上角四分之一。

现在移动到1080p的屏幕(比720p大1.5倍)。 如果SpriteBatch添加缩放矩阵,则可以看到整个精灵的三分之二的屏幕向右和向下。

但是你想扩大你的整个场景,所以在1080p,它看起来就像在720p。 所以你添加矩阵Matrix.CreateScale(1.5f, 1.5f, 1f) (注意对Z轴使用1,因为这是2D而不是3D)到你的SpriteBatch.BeginSpriteBatch.Begin 别无其他

现在你的精灵场景将会缩放1.5倍。 在不调整实际Draw调用的情况下,你的精灵将被绘制在位置(1920,1080)(屏幕的右下角),它的大小将是(48,48)(1.5倍大),它的原点仍然是中心。 你将在屏幕的右下角看到精灵的左上象限,就像你在720p时所做的那样,并且尺寸相同。