原文链接:https://github.com/libgdx/libgdx/wiki/Viewports
译者:重庆好爸爸 game4kids@163.com
谢绝转载
术语对照
- Viewports - 视口
视口Viewports
当面对多种屏幕时,需要制定处理不同尺寸和长宽比屏幕的处理策略。Camera和Stage支持Viewport,比如通过Camera.project(vec, viewportX, viewportY, viewportWidth, viewportHeight)做picking.
LibDGX提供一个更方便的方法去处理这个问题:Viewport (source).
用法Usage
一个viewport总是管理着一个Camera的viewportWidth 和 viewportHeight. 因此在给viewport的构造函数提供一个camera参数
private Viewport viewport;
private Camera camera;
public void create() {
camera = new PerspectiveCamera();
viewport = new FitViewport(800, 480, camera);
}
每当resize事件发生的时候,viewport需要被通知和被更新。这样会自动重新计算viewport的参数和更新camera
public void resize(int width, int height) {
viewport.update(width, height);
}
更进一步,它会通过glViewport去改变OpenGL Viewport,这可能会增加黑边,在黑边的区域是不能进行渲染的。
如果在某种的viewport策略中出现黑边,则OpenGL viewport可能会重新设置为标准尺寸,并且可以通过Viewport.getLeftGutterWidth()查询条形图的大小等。
有关如何执行此操作的示例,请参阅本测试。 这可能看起来像以下(可能有更合适的边框图片...)
如果需要完成picking, Viewport提供了几种方法:project()/unproject()/getPickRay。这几种方法使用当前的viewport去做正确的picking. 这就是你如何转换屏幕坐标系和世界坐标系。
如果使用了Stage,那么当resize事件发生的时候,Stage的viewport需要被更新。
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);
}
多视口
当使用具有不同屏幕尺寸的多个viewports(或使用其他设置glViewport的代码)时,你需要在绘制之前应用viewport,以便为该视口设置glViewport
viewport1.apply();
// draw
viewport2.apply();
// draw
When using multiple Stages:
stage1.getViewport().apply();
stage1.draw();
stage2.getViewport().apply();
stage2.draw();
Examples
To see the viewports in action, 看看例子: ViewportTest1, ViewportTest2 and ViewportTest3.
拉伸视口 StretchViewport
The StretchViewport (source)
支持virtural screen size。这意味着可以假设屏幕的尺寸总是virtualWidth * virtualHeight。
这个虚拟的viewport总是会被拉伸以适应屏幕,不会有黑边,但是长宽比可能改变。
FitViewport
A FitViewport (source)
也支持虚拟屏幕尺寸。和StretchViewport不同的是,FitViewport在尝试适配屏幕的同时,总是保持virtual screen size(virtural viewport)的长宽比。FitViewport的一个不好的地方在于可能产生黑边。
FillViewport
A FillViewport (source) 也会保持virtual screen size的长宽比,但是和FitViewport相比,FillViewport总是会把屏幕填满,没有黑边,因此超出屏幕的部分会被裁剪掉.
ScreenViewport
The ScreenViewport (source)
没有固定的virtual screen size; ScreenViewport总是匹配窗口的尺寸,不会缩放,不会有黑边。它的缺点在于屏幕较大的玩家可能会比小屏幕尺寸玩家看到更多的游戏场景
ExtendViewport
The ExtendViewport (source)
通过在某个方向对世界进行延伸,从而保持了世界的长宽比而不产生黑边。世界将首先在viewport中被缩放,然后较短的方向将被加长以填满viewport.
可以设置ExtendViewport的最大dimensions, 在这种情况下,当宽高比落在支持范围之外时,将添加黑条。
CustomViewport
可以通过从Viewport继承CustomerViewport和重写update(width,height),以便实施不同的策略。
另一种方法是使用通用的ScalingViewport,并提供尚未被任何其他Viewport覆盖的另一个缩放。 一个例子就是提供Scaling.none 这将导致一个完全“StaticViewport”,它始终保持相同的大小。 它可能看起来像这样: