【问题标题】:How to make my Monogame windows game compatible with every single screen type?如何让我的 Monogame windows 游戏兼容每一种屏幕类型?
【发布时间】:2025-02-10 05:50:01
【问题描述】:

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

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

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

【问题讨论】:

标签: c# visual-studio-2015 xna monogame


【解决方案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);

这就是基础知识。当然,您还可以使用我在博客中描述的信箱和柱箱方法变得更加复杂。

【讨论】:

  • 信箱(邮筒)是我的最爱,而不是拉伸屏幕,黑色间隙可以很容易地填充与游戏匹配的纹理。特别是如果你的游戏有一些统计数据(生命值、法力、分数)的边界,所以你只需扩展纹理以弥补差距。
最近更新 更多