摄像机定义了有利位置以及在屏幕上看到的世界范围。通过定义世界视野的摄像机可以看到游戏中的所有内容。对于2D游戏,您可以使用OrthographicCamera来定义当前可见的世界的矩形。OpenGL与矩阵一起计算可见的物体,因此要使用相机,请对其进行更新,然后将其combined矩阵传递到SpriteBatch中。
视口在LibGDX中具有三种不同的含义:
OpenGL视口,即OpenGL屏幕的矩形区域,当前设置为以像素尺寸绘制。无论OrthographicCamera具有什么尺寸,它定义的世界的可视矩形都会拉伸以适合OpenGL视口,这意味着它看起来会变形/挤压。
正交相机的viewportWidth和viewportHeight。这些术语是LibGDX婴儿期的不幸遗迹,假设您一直使用的摄像头尺寸等于OpenGL视口的尺寸。这些术语实际上描述了您可以看到的世界的矩形的大小,但是此可见的矩形可以具有任意尺寸,并且最终图像被拉伸以适合OpenGL视口。
Viewport类是同时管理OrthographicCamera和OpenGL Viewport的类,以实现某种策略来处理屏幕密度和纵横比的无限可能。
LibGDX Viewport类是通过提供世界宽度和世界高度来设置的,它们定义了您希望在屏幕上可见的游戏世界的矩形。根据您使用的视口类型,将以某种方式使用此矩形来定位多种屏幕尺寸。
LibGDX包含的视口的一些示例:
StretchViewport:即使这会导致变形,它也会拉伸您的世界的宽度/高度以适合屏幕。永远不要将其用于发布的游戏,因为玩家会讨厌它。仅对非常脏的原型有用。
FitViewport:它会放大您的世界宽度/高度以适合屏幕,并在OpenGL视口中添加信箱,以使图像不失真。就像在电视上观看电影时看到的黑条。这是设计游戏的最快/最脏的方法,因为您知道世界的可见矩形在所有设备上都是完全相同的。但是您的播放器可能不喜欢浪费屏幕空间。如果您将其用于iOS游戏,Apple将拒绝它。
ExtendViewport:它会放大您的世界宽度/高度以适合屏幕,然后放大您的世界宽度或高度以填充屏幕上的任何剩余空间,因此图像不会失真。如果您不希望装箱,这是最好的选择,但是这意味着您必须在设计游戏时牢记,必须画足够多的东西以覆盖计划的世界宽度/高度以外的可能额外区域,并尝试保持游戏玩法相当公平。
ScreenViewport:这是唯一的,因为它没有输入世界的宽度/高度。它只是使世界的宽度和高度与屏幕尺寸匹配(以像素为单位)。切勿将其用于游戏,因为与大型MD设备相比,大型XHD设备上看到的矩形可能大五倍或更多倍。它具有用于UI的用途。您可以为各种屏幕密度设计多个UI资产,并使用ScreenViewport,这样文本和按钮在所有设备上看起来都非常清晰。
我个人始终将ExtendViewport用于游戏,因此不会浪费屏幕空间,并且可以在iOS上发布游戏。
对于UI,我将ExtendViewport用于游戏性HUD(将小部件推向屏幕边缘),并使用FitViewport(如果有暂停屏幕覆盖了游戏性)。对于此用途,FitViewport很好,因为您实际上不会看到黑条。如果您知道适合的矩形总是相同,则管理复杂的暂停屏幕UI会更容易。
为了以最小的努力使UI保持合理的清晰,我将其生成的尺寸在大约200-250dpi的手机屏幕上约为像素到像素,并对其进行三线性过滤。
小智 5
简单来说,相机就像现实生活中的相机。在LibGDX中,Camera是用来展示我们的游戏区域的。
例如:在拍电影时,导演会做很多准备工作,一切都将通过相机进行拍摄。与在 libgdx 中为我们的游戏玩法一样,我们创建了许多精灵、纹理等。所有这些都由相机捕获并渲染到屏幕上。以一种简单的方式,我们可以知道相机显示了游戏区域。
Viewport 主要用于使我们的游戏在视觉上兼容多种设备。
不同的设备有不同的纵横比。当游戏在不同设备上运行时,可能会出现一些图形问题(拉伸图像、角色超出屏幕等)。LibGDX 提供Viewport了解决这个问题的方法。
有以下三种主要类型(不限于)Viewport可用:
欲知更多详情,请查看以下链接: