LibGDX 游戏开发 之 视口 Viewports

原文链接: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”,它始终保持相同的大小。 它可能看起来像这样:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容