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

时间:2015-08-30 22:07:18

标签: c# scale fullscreen screen-resolution monogame

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

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

我不打算支持分辨率更改选项,而是将精灵调整为当前分辨率。

2 个答案:

答案 0 :(得分:2)

听起来你在谈论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

如果想要实现letterboxing或邮箱,它会变得更复杂。如果您想知道它是如何工作的,请查看MonoGame.Extended中的视口适配器。

答案 1 :(得分:1)

根据比例(W, H),您有一个大小为(X, Y)的纹理,位于(sW, sH)的位置。最初,比例为(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)缩放来计算的,不要忘记这一点!