原文鏈接: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)像這樣: