根据分辨率缩放屏幕上的所有精灵

Scale all sprites on screen based on resolution

我决定将我的游戏从窗口模式转移到全屏模式,这是我面临的第一个问题。我正在寻找一种根据屏幕分辨率调整所有精灵大小的方法。我的背景现在位于 (0, 0) 坐标中,但我需要它和所有精灵以某种固定的纵横比进行缩放(首选 16:9)。并将它们调整为背景被拉伸以填满屏幕的那部分。不多也不少。

我查看了一些在线教程,但我真的无法理解他们使用的概念。你能解释一下你会怎么做吗?我阅读了使用 RenderTarget2D 并将其传递给 spriteBatch.Begin() 调用,具有某种效果,但必须有更多代码。

我不希望支持分辨率更改选项,而是让 sprite 适应当前分辨率。

您有一个大小为 (W, H) 的纹理,根据比例 (sW, sH) 放置在 (X, Y) 的位置。最初,比例为 (1, 1),因此精灵将位于矩形 (X, Y, W, H).

现在,假设初始分辨率为 800x600,但您现在需要 1440x900 的分辨率。如果800 -> sW = 11440 -> sW = 1440/800 = 1.8。类似的,我们新的sH是1.5.

这就是说:如果某些东西应该在初始分辨率的 X 坐标 500 上,它现在在新分辨率的 500*1.8 = 900 X 位置上。边缘很明显:如果之前在 X=800 上,现在在 800*1.8 = 1440 上,仍然在屏幕边缘!

总而言之,我们只需要乘以。回到第一段,我们可以说矩形 (X, Y, W, H) 可以按比例 (sW, sH) 重新缩放到 (X * sW, Y * sH, W * sW, H * sH).

这当然是假设原始分辨率缩放了(1, 1)计算出来的,别忘了!

听起来你在谈论 resolution independence

总体思路是让您的游戏使用 虚拟分辨率 并按比例放大或缩小以适应 实际分辨率屏幕.

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

_spriteBatch.Begin(transformMatrix: matrix);

例如,如果您的虚拟分辨率是 800x480,您只需渲染相对于该分辨率的所有精灵。然后在渲染精灵批次之前,创建一个转换矩阵以传递给 Begin 调用。

您应该知道的另一件事是您需要反向缩放鼠标/触摸输入坐标以在虚拟分辨率中处理它们。在 Update 方法中,您可以像这样反向缩放鼠标位置:

var mouseState = Mouse.GetState(); // you're probably already doing this
var mousePosition = new Vector2(mouseState.X, mouseState.Y);
var scaledMousePosition = Vector2.Transform(mousePosition, Matrix.Invert(matrix));

然后您可以在您当前使用的所有地方使用缩放值 mouseState.XmouseState.Y

如果要实现信箱或邮筒,它会变得更复杂。如果您想了解其工作原理,请查看 MonoGame.Extended 中的视口适配器。