如何使我的Monogame windows游戏兼容每一种屏幕类型



首先,我在这里发布了这个问题,而不是在游戏开发中,因为我刚刚开始我的项目,这个问题实际上不是关于XNA或Monogame库的。

所以,我正在努力使我的游戏兼容每一种屏幕类型。我需要注意两个方面——比例和像素大小。在我为我的游戏创建任何图形之前,我需要知道尺寸在我的游戏中的每一个对象(玩家、背景等),并获得与屏幕比例匹配的正确尺寸,并随之改变。

我在网上搜索XNA/Monogame教程,寻找如何做到这一点,但我没有找到一个。我尝试了基本的全屏方法。但正如你所知,物体静止不动,它们不会随着窗户移动。正如我之前提到的,我需要它们随着窗口移动和改变大小,使我的游戏与每一种屏幕类型兼容。(比率和像素(英寸/厘米))

我认为您要寻找的术语是分辨率独立性。不久前,我在博客上写了一篇关于它的教程。

我们在MonoGame.Extended中的方法是使用传递到SpriteBatch.Begin方法中的转换矩阵缩放整个精灵批次。我们称之为视口适配器:

_spriteBatch.Begin(transformMatrix: _viewportAdapter.GetScaleMatrix());

这样做的目的是变换由指定比例矩阵渲染的所有内容。

它的工作方式是,你决定游戏的虚拟资源,并将所有内容与之相关。在绘图调用过程中,您可以缩放图形以匹配设备的实际分辨率。

例如,您可能决定虚拟分辨率为800x480,但实际屏幕大小为1024x768,因此比例大约为1.28 x 1.6。有道理吗?你可以计算一个简单的比例矩阵,如下所示:

var scaleX = (float)ActualWidth / VirtualWidth;
var scaleY = (float)ActualHeight / VirtualHeight;
var matrix = Matrix.CreateScale(scaleX, scaleY, 1.0f);
_spriteBatch.Begin(transformMatrix: matrix);

这将是一种基本方法。你真正需要知道的另一件事是,当你处理实际的屏幕坐标时,比如鼠标位置,你需要将缩放比例反转到你的虚拟分辨率:

var invertedMatrix = Matrix.Invert(matrix);
virtualMousePosition = Vector2.Transform(new Vector2(x, y), invertedMatrix);

这是最基本的。当然,你也可以像我在博客上描述的那样,通过字母拳击和支柱拳击的方法变得更加复杂。

最新更新