相机定义了有利位置以及屏幕上可以看到的世界范围。游戏中的所有内容都可以通过定义世界视图的摄像机看到。对于 2D 游戏,您使用 OrthographicCamera 来定义当前可见的世界矩形。 OpenGL 使用矩阵来计算所看到的内容,因此要使用相机,您需要对其进行更新并将其combined 矩阵传递到 SpriteBatch。
Viewport 在 LibGDX 中具有三种不同的含义:
OpenGL 视口,屏幕 OpenGL 的矩形区域当前设置为以像素尺寸绘制。无论 OrthographicCamera 的尺寸是多少,它定义的世界的可视矩形都会被拉伸以适应 OpenGL 视口,这意味着它看起来会变形/被压扁。
OrthographicCamera 的viewportWidth 和viewportHeight。这些术语是 LibGDX 婴儿期的不幸遗物,当时假设您总是使用大小等于 OpenGL 视口大小的相机。这些术语实际上描述了您可以看到的世界矩形的大小,但是这个可见矩形可以有任意尺寸,并且最终图像会被拉伸以适应 OpenGL 视口。
Viewport 类,这是一个同时管理 OrthographicCamera 和 OpenGL Viewport 的类,以实现某种策略来处理屏幕密度和纵横比的无限可能。
LibGDX 视口类通过提供世界宽度和世界高度来设置,它们定义了您希望在屏幕上可见的游戏世界的矩形。根据您使用的视口类型,此矩形将以某种方式用于定位多种尺寸的屏幕。
LibGDX 包含的视口的一些示例:
StretchViewport:它拉伸你的世界宽度/高度以适应屏幕,即使这会导致失真。这不应该用于已发布的游戏,因为玩家会讨厌它。仅适用于非常快速和肮脏的原型设计。
FitViewport:它会放大您的世界宽度/高度以适应屏幕,并在 OpenGL 视口中添加信箱以使图像不失真。这就像您在电视上看电影时看到的黑条。这是设计游戏的最快/最脏的方式,因为您知道您的世界的可视矩形在所有设备上都是完全相同的。但是您的玩家可能不喜欢浪费屏幕空间。如果你将它用于 iOS 游戏,Apple 会拒绝它。
ExtendViewport:它会放大你的世界宽度/高度以适应屏幕,然后放大你的世界宽度或高度以填充屏幕上的任何剩余空间,这样图像就不会失真。如果您不想要信箱,这是最好的选择,但这意味着您必须在设计游戏时牢记,您必须绘制足够的绘图以覆盖您计划的世界宽度/高度之外的可能额外区域,并尝试保持游戏玩法相当公平。
ScreenViewport:这是独一无二的,因为它没有世界宽度/高度的输入。它只是让世界的宽度和高度与屏幕大小(以像素为单位)相匹配。这不应该用于玩游戏,因为与小型 MD 设备相比,您在大型 XHD 设备上看到的矩形可能是 5 倍或更多倍。它对 UI 有其用途。您可以针对不同的屏幕密度设计多个 UI 资源,并使用 ScreenViewport 使文本和按钮在所有设备上看起来都非常清晰。
我个人总是使用 ExtendViewport 来玩游戏,这样不会浪费屏幕空间,而且游戏可以在 iOS 上发布。
对于 UI,我将 ExtendViewport 用于游戏 HUD(将小部件推到屏幕边缘),如果有覆盖游戏的暂停屏幕,我使用 FitViewport。对于这种用途,FitViewport 很好,因为您实际上不会看到黑条。如果您知道它适合的矩形始终相同,则管理复杂的暂停屏幕 UI 会更容易。
为了以最小的努力保持 UI 看起来相当清晰,我以大约 200-250dpi 手机屏幕上的像素到像素的大小生成它,并对其进行三线性过滤。