我决定将我的游戏从窗口模式移动到全屏模式,这是我面临的第一个问题。我正在寻找一种根据屏幕分辨率调整所有精灵大小的方法。我的背景现在位于(0, 0)
坐标中,但是我需要使用它和所有精灵来缩放某种固定宽高比(首选16:9
)。并将它们调整为背景拉伸以填充屏幕的部分。而不是更多,而不是更少。
我已经查看了一些在线教程,但我真的无法理解他们使用的概念。你能解释一下你会怎么做吗?我使用RenderTarget2D
阅读并将其传递给spriteBatch.Begin()
来电,会产生某种影响,但必须有更多代码。
我不打算支持分辨率更改选项,而是将精灵调整为当前分辨率。
答案 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.X
和mouseState.Y
。
如果想要实现letterboxing或邮箱,它会变得更复杂。如果您想知道它是如何工作的,请查看MonoGame.Extended中的视口适配器。
答案 1 :(得分:1)
根据比例(W, H)
,您有一个大小为(X, Y)
的纹理,位于(sW, sH)
的位置。最初,比例为(1, 1)
,因此精灵将位于矩形(X, Y, W, H)
中。
现在,让我们说初始分辨率是800x600,但现在你需要1440x900的分辨率。如果800 -> sW = 1
,1440 -> 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)
缩放来计算的,不要忘记这一点!