Answers:
首先要记住,从光栅上讲,技术上没有真正的分辨率独立性。放大倍数足够高时,单个纹理像素将开始变得可见。唯一的解决方案是编写矢量图形系统。
话虽如此,创建基于分辨率的独立于栅格的鲁棒系统有几个步骤:调整大小,协调坐标系和布局。
为了确定尺寸和位置,我们需要使用一些与实际应用分辨率保持一定比例的单位。在这种情况下,请使用英寸,因为我是美国人,您可以使用DPI(每英寸的点数)缩放元素。例如,假设您的应用程序以800x600运行。默认的Windows DPI为96,这意味着应用程序的分辨率为(800/96)x(600/96)英寸或8.33x6.25英寸。
由于您至少需要能够使用4:3和16:9的宽高比,因此如何处理屏幕坐标系会有些棘手。我建议您将(0,0)放在显示区域(以及窗口和控件)的中央。这样做之所以有效,是因为如果将(0,0)放在一个角上,则随着该角根据分辨率和纵横比移动,它将平移所有sprite,而屏幕的中心将始终是屏幕的中心。与设备无关。以800x600继续我们的示例,这将导致坐标系为(从左到右)-4.165in至4.165in和(从上到下)3.125in至-3.125in。
因此,目前您拥有独立于DPI的UI系统,其项目始终相对于屏幕中心位于同一位置-并非完全独立于分辨率。幸运的是,DPI独立性允许您执行的操作是通过基于某种启发式方法缩放DPI来缩放UI。例如,我们可以使用垂直分辨率作为启发式方法来缩放DPI。如果800x600是96 DPI,那么对于1024x768,我们将使用123 DPI;对于1280x720,我们将使用115 DPI。
最后,您将需要构建一个同时处理绝对定位和相对定位的布局系统。WPF和Web就是很好的例子。您可以指定控件/框填充父元素的某些百分比,同时将其与许多其他有用的自动布局选项一起停靠到边缘。所有这些都将导致一个UI系统能够在许多不同的分辨率和宽高比下看起来几乎相同。
总而言之,我强烈建议您学习WPF,因为它几乎可以完成所有这些工作,除了它在左上角的坐标系中保持原点并且不会根据垂直分辨率自动缩放DPI。
通常,您想做什么取决于游戏。
一种选择是,如果长宽比(比例)不同(可能是最简单的,仅渲染为纹理,然后渲染为屏幕,并适当调整大小),则使用黑色边框。
另一种选择是为不同的宽高比设置不同的渲染路径。您可能有一个用于宽屏,一个用于“正常”。
另一个选择是分别缩放事物,例如根据分辨率使UI消息框更大或更小。每当您需要确定要绘制到的位置时,而不是使用精确的像素,请执行0.2向下,0.8跨度,宽度0.1,高度0.3之类的操作。在这种情况下,您可能会拉伸一些东西,尽管这取决于您如何绘制可能会很好的东西(即拉伸UI背景,而不是文本)。
就3D而言,只要正确设置了视口,最终宽屏播放器将比非宽屏设置看到更多的内容。(或者绘制黑色边框/或拉伸视图)。