LibGDX图形模块之视口

当处理不同的屏幕时,通常需要决定采取何种策略来处理不同屏幕尺寸和宽高比.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。 然后,该虚拟视口将始终被拉伸以适应屏幕。 没有黑色条,但缩放发生后,长宽比可能不一样。

LibGDX图形模块之视口_第1张图片
StretchViewport

FitViewport (source) 也支持虚拟屏幕尺寸。 与StretchViewport的区别在于,它将始终保持虚拟屏幕大小(虚拟视口)的宽高比,同时尽可能缩放它以适合屏幕。 这个策略的一个缺点是可能会出现黑条。

LibGDX图形模块之视口_第2张图片
FitViewport

FillViewport

FillViewport (source) 也保持虚拟屏幕大小的宽高比,但与FitViewport相反,它将始终填满整个屏幕,这可能导致视口部分无法全部显示。

ScreenViewport

ScreenViewport (source) 没有固定的虚拟屏幕大小; 它将始终匹配窗口大小,这意味着不会发生缩放,并且不显示黑条。 作为缺点,这意味着游戏可能会改变,因为屏幕较大的玩家可能会看到更多的游戏画面。

LibGDX图形模块之视口_第3张图片
ScreenViewport

ExtendViewport

ExtendViewport (source) 通过在一个方向上扩展世界来保持世界纵横比的无黑条。 世界首先被缩放以适应视口,然后将较短的尺寸延长以填充视口。

LibGDX图形模块之视口_第4张图片
ExtendViewport

可以向ExtendViewport提供最大尺寸的集合,在这种情况下,当宽高比落在支持的范围之外时,将添加黑条。

LibGDX图形模块之视口_第5张图片
Paste_Image.png

自定义视口可以继承Viewport并复写update(width,height)实现自定义的视口策略,另一种方法是使用通用的ScalingViewport并提供另外一个尚未被任何其他视口覆盖的缩放。 一个例子可能是提供Scaling.none,这将导致一个完全“StaticViewport”,它始终保持相同的大小。 它可能看起来像这样:


LibGDX图形模块之视口_第6张图片
Paste_Image.png

你可能感兴趣的:(LibGDX图形模块之视口)