首先,我在这里发布了这个问题而不是游戏开发,因为我刚开始我的项目,这个问题并不是关于XNA或Monogame库。
所以,我试图使我的游戏与每种屏幕类型兼容。 我需要注意两个方面 - 比例和像素大小。 在我为我的游戏创建任何图形之前,需要知道尺寸 我的游戏中的每一个对象(玩家,背景等),并获得与屏幕比例相匹配的正确尺寸,并随之改变。
我在网上搜索XNA / Monogame教程,展示如何做到这一点,我没有找到一个。我尝试了基本的全屏方法。但是如你所知,物体静止不动,它们不随窗户移动。正如我之前提到的,我需要它们移动并通过窗口改变大小,以使我的游戏与每种屏幕类型兼容。 (比率和像素(英寸/厘米))
答案 0 :(得分:1)
我认为您正在寻找的术语是解决方案独立性。我刚才写了一篇关于它的教程on my blog。
我们在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);
这就是基础知识。当然,你也可以通过我在博客上描述的信箱和柱式拳击方法变得更加复杂。