LibGDX 游戲開(kāi)發(fā) 之 視口 Viewports

原文鏈接:https://github.com/libgdx/libgdx/wiki/Viewports
譯者:重慶好爸爸 game4kids@163.com
謝絕轉(zhuǎn)載

術(shù)語(yǔ)對(duì)照

  • Viewports - 視口

視口Viewports

當(dāng)面對(duì)多種屏幕時(shí),需要制定處理不同尺寸和長(zhǎng)寬比屏幕的處理策略。Camera和Stage支持Viewport,比如通過(guò)Camera.project(vec, viewportX, viewportY, viewportWidth, viewportHeight)做picking.
LibDGX提供一個(gè)更方便的方法去處理這個(gè)問(wèn)題:Viewport (source).

用法Usage

一個(gè)viewport總是管理著一個(gè)Camera的viewportWidth 和 viewportHeight. 因此在給viewport的構(gòu)造函數(shù)提供一個(gè)camera參數(shù)

    private Viewport viewport;
    private Camera camera;

    public void create() {
        camera = new PerspectiveCamera();
        viewport = new FitViewport(800, 480, camera);
    }

每當(dāng)resize事件發(fā)生的時(shí)候,viewport需要被通知和被更新。這樣會(huì)自動(dòng)重新計(jì)算viewport的參數(shù)和更新camera

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

更進(jìn)一步,它會(huì)通過(guò)glViewport去改變OpenGL Viewport,這可能會(huì)增加黑邊,在黑邊的區(qū)域是不能進(jìn)行渲染的。
如果在某種的viewport策略中出現(xiàn)黑邊,則OpenGL viewport可能會(huì)重新設(shè)置為標(biāo)準(zhǔn)尺寸,并且可以通過(guò)Viewport.getLeftGutterWidth()查詢條形圖的大小等。
有關(guān)如何執(zhí)行此操作的示例,請(qǐng)參閱本測(cè)試。 這可能看起來(lái)像以下(可能有更合適的邊框圖片...)

如果需要完成picking, Viewport提供了幾種方法:project()/unproject()/getPickRay。這幾種方法使用當(dāng)前的viewport去做正確的picking. 這就是你如何轉(zhuǎn)換屏幕坐標(biāo)系和世界坐標(biāo)系。
如果使用了Stage,那么當(dāng)resize事件發(fā)生的時(shí)候,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);
    }

多視口

當(dāng)使用具有不同屏幕尺寸的多個(gè)viewports(或使用其他設(shè)置glViewport的代碼)時(shí),你需要在繪制之前應(yīng)用viewport,以便為該視口設(shè)置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。這意味著可以假設(shè)屏幕的尺寸總是virtualWidth * virtualHeight。
這個(gè)虛擬的viewport總是會(huì)被拉伸以適應(yīng)屏幕,不會(huì)有黑邊,但是長(zhǎng)寬比可能改變。

FitViewport

A FitViewport (source)
也支持虛擬屏幕尺寸。和StretchViewport不同的是,F(xiàn)itViewport在嘗試適配屏幕的同時(shí),總是保持virtual screen size(virtural viewport)的長(zhǎng)寬比。FitViewport的一個(gè)不好的地方在于可能產(chǎn)生黑邊。

FillViewport

A FillViewport (source) 也會(huì)保持virtual screen size的長(zhǎng)寬比,但是和FitViewport相比,F(xiàn)illViewport總是會(huì)把屏幕填滿,沒(méi)有黑邊,因此超出屏幕的部分會(huì)被裁剪掉.

ScreenViewport

The ScreenViewport (source)
沒(méi)有固定的virtual screen size; ScreenViewport總是匹配窗口的尺寸,不會(huì)縮放,不會(huì)有黑邊。它的缺點(diǎn)在于屏幕較大的玩家可能會(huì)比小屏幕尺寸玩家看到更多的游戲場(chǎng)景

ExtendViewport

The ExtendViewport (source)
通過(guò)在某個(gè)方向?qū)κ澜邕M(jìn)行延伸,從而保持了世界的長(zhǎng)寬比而不產(chǎn)生黑邊。世界將首先在viewport中被縮放,然后較短的方向?qū)⒈患娱L(zhǎng)以填滿viewport.


可以設(shè)置ExtendViewport的最大dimensions, 在這種情況下,當(dāng)寬高比落在支持范圍之外時(shí),將添加黑條。

CustomViewport

可以通過(guò)從Viewport繼承CustomerViewport和重寫update(width,height),以便實(shí)施不同的策略。
另一種方法是使用通用的ScalingViewport,并提供尚未被任何其他Viewport覆蓋的另一個(gè)縮放。 一個(gè)例子就是提供Scaling.none 這將導(dǎo)致一個(gè)完全“StaticViewport”,它始終保持相同的大小。 它可能看起來(lái)像這樣:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容