视口

为了支持多种分辨率和宽高比,Libgdx 使用了所谓的 Viewports
有几种类型的 Viewports 使用不同的策略来处理多种分辨率和宽高比。
一个 Viewport 使用了引擎盖下的 Camera 并管理它的 viewportHeightviewportWidth。你可以选择在其构造函数中为 Viewport 提供 Camera,否则默认情况下将使用 OrthographicCamera

private Viewport viewport;
private Camera camera;

public void create() {
   camera = new PerspectiveCamera();
   viewport = new FitViewport(8f, 4.8f, camera);
}  

此外,你必须将 worldWidthworldHeight 指定给视口的构造函数。此空间将表示将用于指定要绘制的对象位置和大小的虚拟坐标系。例如,可以应用于 SpriteBatch 的视口转换将自动处理将逻辑坐标转换为实际屏幕坐标,其方式符合你正在使用的视口的实际类型。例如,当使用正投影(OrthographicCamera,这是默认设置)时:如果你的世界尺寸为 12.8 x 7.8 米且设备屏幕为 2560x1560 像素,那么你的世界将以每米 200 像素动态投影。

Viewports 尺寸发生变化时(例如,如果智能手机的屏幕方向正在改变),你需要通知 Viewport 该更改。然后它将自动更新 Cameras viewportHeightviewportWidth

public void resize(int width, int height) {
    viewport.update(width, height);
}

Viewports 还管理 OpenGL Viewport 并根据需要修改可绘制区域。

Viewports 还关注将屏幕坐标转换为游戏坐标,这对于拾取尤其需要:

private Vector2 worldPos = new Vector2();
public boolean touchDown (int x, int y, int pointer, int button) {
    worldPos.set(x, y);
    viewport.unproject(worldPos);
    processPicking(worldPos);
}