当处理不同的屏幕时,通常需要决定采取何种策略来处理不同屏幕尺寸和宽高比.Camera 和Stage 支持不同的视口策略
Camera.project(vec,viewportX,viewportY,viewportWidth,viewportHeight)
LibGDX提供了一种方便的处理这个问题的方法,Viewport (source).
用法
视口始终管理Camera的viewportWidth和viewportHeight。 因此需要向视口的构造函数提供Camera实例。
private Viewport viewport;
private Camera camera;
public void create() {
camera = new PerspectiveCamera();
viewport = new FitViewport(800, 480, camera);
}
每当调整大小事件发生时,视口需要被通知并进行更新.这将自动重新计算视口参数并更新相机:
public void resize(int width, int height) {
viewport.update(width, height);
}
此外,它将通过glViewport更改OpenGL视口,如果需要,可以添加黑色条,使其无法在黑条的区域中呈现。有关如何执行此操作的示例, 看这个测试.
如果需要选取视口,Viewport提供方便了project / unproject / getPickRay方法,你可以使用它们来相互转换屏幕和世界坐标。
当使用Stage时,调整大小事件发生时,Stage的视口需要更新。
private Stage stage;
public void create() {
stage = new Stage(new StretchViewport(width, height));
}
public void resize(int width, int height) {
// use true here to center the camera
// that's what you probably want in case of a UI
stage.getViewport().update(width, height, false);
}
多个视口
StretchViewport(拉伸)
StretchViewport (source) 支持使用虚拟屏幕大小。 这意味着可以假设屏幕总是大小为virtualWidth x virtualHeight。 然后,该虚拟视口将始终被拉伸以适应屏幕。 没有黑色条,但缩放发生后,长宽比可能不一样。
FitViewport (source) 也支持虚拟屏幕尺寸。 与StretchViewport的区别在于,它将始终保持虚拟屏幕大小(虚拟视口)的宽高比,同时尽可能缩放它以适合屏幕。 这个策略的一个缺点是可能会出现黑条。
FillViewport
FillViewport (source) 也保持虚拟屏幕大小的宽高比,但与FitViewport相反,它将始终填满整个屏幕,这可能导致视口部分无法全部显示。
ScreenViewport
ScreenViewport (source) 没有固定的虚拟屏幕大小; 它将始终匹配窗口大小,这意味着不会发生缩放,并且不显示黑条。 作为缺点,这意味着游戏可能会改变,因为屏幕较大的玩家可能会看到更多的游戏画面。
ExtendViewport
ExtendViewport (source) 通过在一个方向上扩展世界来保持世界纵横比的无黑条。 世界首先被缩放以适应视口,然后将较短的尺寸延长以填充视口。
可以向ExtendViewport提供最大尺寸的集合,在这种情况下,当宽高比落在支持的范围之外时,将添加黑条。
自定义视口可以继承Viewport并复写update(width,height)实现自定义的视口策略,另一种方法是使用通用的ScalingViewport并提供另外一个尚未被任何其他视口覆盖的缩放。 一个例子可能是提供Scaling.none,这将导致一个完全“StaticViewport”,它始终保持相同的大小。 它可能看起来像这样: