サイトのトップへ戻る

libGDX ドキュメント 日本語訳

Viewports

様々な画面上で動作する場合は、異なる画面サイズとアスペクト比をどのように制御するのかを考慮する必要があります。 例えば Camera.project(vec, viewportX, viewportY, viewportWidth, viewportHeight)を介してピッキングを行う場合などで、Camera とStage では異なるやり方をサポートしています。

LibGDX では、この問題に対処するためのより便利な方法: Viewport (ソース)が用意されています。



使用方法

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を変更しています。glViewportでは必要であれば画面に黒い塗りつぶし領域を追加し、その領域には描写をしないようにします。 In case black bars appear with a certain viewport strategy, the OpenGL viewport may be reset to it's standard size and the viewport can be queried for the size of the bars via Viewport.getLeftGutterWidth() etc. これを行う方法については このテストを参照してください。 This might look like the following (probably with a more appropriate border picture...)

ピッキングを行う必要がある場合には、Viewport には便利なproject/unproject/getPickRayメソッドが用意されています。 このメソッドは、現在のviewport を使って正しいピッキングを行います。 これを使って画面上の座標とゲーム世界内の座標を相互変換します。

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);
}


複数の viewport

異なる画面サイズを持つ複数の viewport を使用する場合 (もしくは他のコードを使用してglViewportを設定する場合)、 you will need to apply the viewport before drawing so the glViewport is set for that viewport.

viewport1.apply();
// draw
viewport2.apply();
// draw

複数の Stageを使用する場合:

stage1.getViewport().apply();
stage1.draw();
stage2.getViewport().apply();
stage2.draw();


実際のviewports の動作を見るには、次のテストを参照してください: ViewportTest1ViewportTest2ViewportTest3



StretchViewport

StretchViewport (ソース)は仮想画面サイズでの動作をサポートしています。つまり、画面は常にvirtualWidth x virtualHeightのサイズになるものと考えることができます。 この仮想 viewport は、常に画面に収まるように伸縮されます。黒塗り領域は発生しませんが、伸縮によってアスペクト比が変わります。



FitViewport

FitViewport (ソース) も仮想スクリーンサイズをサポートしています。 StretchViewportとの違いは、可能な限り画面に収まるように伸縮しながら仮想画面サイズ(仮想 viewport)のアスペクト比を常に維持する点です。 この手法の一つの欠点は、黒塗り領域が発生してしまうことです。



FillViewport

FillViewport (ソース) も仮想画面サイズのアスペクト比を維持しますが、 FitViewportとは対照的に常に画面全体を埋めるように描写するので、viewportの一部がカットされることがあります。



ScreenViewport

ScreenViewport (ソース) は一定の仮想画面サイズを持っていません;常にウィンドウにサイズを合わせるので、伸縮は発生せず黒塗り領域も表示されません。 デメリットとして、ユーザーのゲームプレイ環境に差が出る可能性があります。大きい画面でプレイするユーザーにはその分広い範囲が表示され、小さい画面でプレイするユーザーにはその分狭い範囲が表示されるからです。



ExtendViewport

ExtendViewport (source)では黒塗り領域を追加せず、ゲーム内世界の縦横どちらか一辺を広げることでゲーム内世界のアスペクト比を維持します。ゲーム内世界はまず最初に viewport内に収まるようにサイズが変更され、viewportの隙間を埋めるために縦横いずれか短いほうが長くされます。

ExtendViewportには長くできる幅の最大値を引数として設定することができます。設定すると、アスペクト比の値が最大値を超えた場合に黒塗り領域が追加されます。



カスタムViewport

Viewportを継承してカスタムViewportを作成し、update(width, height)を上書きして、他のViewportにはない挙動を実装することができます。 ScalingViewportを継承してカスタムViewportを作成し、他のViewportでは対応していないサイズ変更を実装する、など。 カスタムViewportの一例として、Scaling.noneを設定できるViewportなどがあります。Scaling.noneを設定すると完全な"StaticViewport"となり、常に同じサイズを維持し続けます。 以下のような見た目になるでしょう: