サイトのトップへ戻る

libGDX ドキュメント 日本語訳

サイト内検索

グラフィック関連 (モニター, ディスプレイモード, 垂直同期)の照会と設定



設定と照会

libGDX には、モニターとディスプレイを照会できてさらに垂直同期(vsync)の切り替えができる高機能なAPIが実装されています。 このAPIはアプリケーションの設定時か実行時に使用できます。注意: ディスプレイモードの変更は、 Android と iOSではサポートされていません。



設定時に、モニターとディスプレイモードの照会と設定を行う

設定時にモニターとディスプレイモードの照会を行う方法は、プラットフォームごとに異なります。 以降の項目では、モニターとディスプレイモードに関して、各プラットフォームごとに何ができるのかを説明します。



LWJGL バックエンド

既定の LWJGL 2 バックエンドを使用している場合は、以下のようにしてプライマリモニターで使用できるディスプレイモードを取得することができます。:

DisplayMode[] modes = LwjglApplicationConfiguration.getDisplayModes();

以下のようにしてプライマリモニター に現在設定されているディスプレイモード(デスクトップモードとも呼ばれます)を取得できます:

DisplayMode desktopMode = LwjglApplicationConfiguration.getDesktopDisplayMode();

DisplayModeを取得したら、それを LwjglApplicationConfigurationに設定できます:

DisplayMode displayMode = LwjglApplicationConfiguration.getDesktopDisplayMode();
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.setFromDisplayMode(displayMode);
new LwjglApplication(new MyAppListener(), config);

DisplayModeオブジェクト内にある解像度を使用することで、アプリはフルスクリーンモードで起動します。

アプリをウィンドウモードで起動するには、ウィンドウの幅と高さを指定するだけです:

LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.width = 800;
config.height = 600;
new LwjglApplication(new MyAppListener(), config);

現在のディスプレイモードのモニター上でのウィンドウの左隅位置を指定することで、プライマリモニター上でのウィンドウの位置を設定することもできます:

config.x = 100;
config.y = 100;

ウィンドウが画面中央に配置するには、座標に -1 を使用します(既定ではこの値が設定されています)。

最後に、垂直同期を有効にしてアプリを起動するかどうかを設定することもできます:

config.vSyncEnabled = true;


LWJGL 3 バックエンド

LWJGL 3 バックエンドは、モニターとディスプレイモードに関してはより多くの設定ができます。LWJGL 2 バックエンドと違い、マルチモニター設定をサポートしています。

設定時に使用可能な全てのモニターを照会するには、以下のようにします:

Monitor[] monitors = Lwjgl3ApplicationConfiguration.getMonitors();

プライマリモニターを取得するには、以下を呼び出します:

Monitor primary = Lwjgl3ApplicationConfiguration.getPrimaryMonitor();

モニターでサポートされている全てのディスプレイモードを取得するには、以下を呼び出します:

DisplayMode[] displayModes = Lwjgl3ApplicationConfiguration.getDisplayModes(monitor);

モニターに現在設定されているディスプレイモードを取得するには、以下を呼び出します:

DisplayMode desktopMode = Lwjgl3ApplicationConfiguration.getDisplayMode(monitor);

同様に、プライマリモニターのディスプレイモードを取得するための簡単なやり方もあります:

DisplayMode[] primaryDisplayModes = Lwjgl3ApplicationConfiguration.getDisplayModes();
DisplayMode primaryDesktopMode = Lwjgl3ApplicationConfiguration.getDisplayMode();

ディスプレイモードを取得したら、それをLwjgl3ApplicationConfigurationに設定できます:

DisplayMode primaryMode = LWjgl3ApplicationConfiguration.getDisplayMode();
Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setFullscreenMode(primaryMode);
new Lwjgl3ApplicationConfiguration(new MyAppListener(), config);

上記ではモニターに現在の解像度を使って、プライマリモニター上でアプリをフルスクリーンモードで起動しています。 別のモニターのディスプレイモードを引数として渡した場合は、アプリはそのモニター上でフルスクリーンモードで起動します。 注意: 常に、モニターに現在設定されているディスプレイモードを使用することを推奨します。他のディスプレイモードを使用するとエラーになる場合があります。

アプリをウィンドウモードで起動するには、設定時に以下のメソッドを呼び出します:

Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setWindowedMode(800, 600);

上記ではプライマリモニター上でアプリをウィンドウモードで起動します。ウィンドウの位置を設定するには以下を呼び出します:

config.setWindowPosition(100, 100);

上記では、接続された全てのモニターにまたがった仮想平面上でのウィンドウの左上隅を、100,100の位置に設定しています。 モニターの位置を確認するには、 virtualXメンバと virtualYメンバにアクセスするだけです。 これらの座標は、全てのモニターにまたがった仮想平面上での座標です。 この座標上でウィンドウの位置を設定することで、ウィンドウを特定のモニター上へ移動することができます。

ウィンドウのサイズを変更可能にするかどうか、装飾(ウィンドウタイトルバーやボーダー)を持たせるかどうかを設定することもできます:

config.setResizable(false);
config.setDecorated(false);

LWJGL 3 バックエンドでは、HDPIモニターをどのように扱うかを指定することができます。 OSは、描写する面のサイズやマウスイベントに関する情報を、ピクセルベースの座標ではなく論理サイズや論理座標で通知します。 例えば、 Mac OS Xが動作しているレティーナディスプレイのMacbook Pro環境では、基礎となるピクセル面の幅や高さを半分のみ通知します。 The LWJGL 3 backend can report drawing surface sizes as returned by Gdx.graphics.getWidth()/getHeight() and mouse coordinates either in those logical coordinates, or in pixel coordinates. この動作を設定するには、 HDPI モードの設定を行います:

config.setHdpiMode(HdpiMode.Logical);

上記の設定では、マウス座標と描写面のサイズを論理座標で通知します。 これはLWJGL 3 バックエンドの既定設定でもあります。 直のピクセル上で動作させたい場合は、HdpiMode.Pixelsを使用してください。 論理座標を使用する場合は、glScissor, glViewport , glReadPixelsのようなOpenGL機能のために、これらをピクセル座標に変換する必要があるので注意してください。 これらの機能を使用しているlibGDXクラスは全て、あなたが設定したHdpiModeを考慮に入れて動作します。 あなたが自分でこれらの機能を呼び出す場合には、 HdpiUtilsを使用してください。



実行時にモニターとディスプレイモードの照会と設定を行う

libGDX では、実行にモニターやディスプレイモードやその他アスペクト関連の情報を照会できるGraphicsインタフェースを使ったAPIが用意されています。 例えばフルスクリーンモードへの切り替えや垂直同期の切り替えなど、使用可能な設定を分かればそれらを設定できます。



ディスプレイモードの変更がサポートされているかどうかを確認する

ディスプレイモードの変更は一部のプラットフォームでのみサポートされています。 とりわけ、Android と iOS では任意のフルスクリーンディスプレイモードへの切り替えをサポートしていません。 ですから、あなたのアプリケーションが現在動作しているプラットフォームがディスプレイモードの変更をサポートしているかどうか確認することをお勧めします:

if(Gdx.graphics.supportsDisplayModeChange()) {
   // change display mode if necessary
}

Graphics機能関連の全てのディスプレイモードは、ディスプレイモードの変更をサポートしていないプラットフォーム上では何も動作しないだけなので覚えておいて下さい。



モニターを照会する

接続されている全てのモニターを照会するには、以下のメソッドを使用します:

Monitor[] monitors = Gdx.graphics.getMonitors();

Android, iOS, GWT バックエンド, LWJGL 2 バックエンドといった環境では、プライマリモニターの情報のみが通知されます。 LWJGL 3 バックエンドでは、接続されている全てのモニターの情報が通知されます。

プライマリモニターの情報を照会するには、以下を使用します:

Monitor primary = Gdx.graphics.getPrimaryMonitor();

ウィンドウが現在動作しているのモニターの情報を照会するには、以下を使用します:

Monitor currMonitor = Gdx.graphics.getMonitor();

フルスクリーンに切り替える場合は、所謂プライマリモニターではなく、現在ウィンドウが動作しているモニターをフルスクリーンに切り替えることをお勧めします。 こうすることで、ユーザーはアプリケーションウィンドウを別のモニターに移動して、そこでフルスクリーンモードを有効にすることができるようになります。



ディスプレイモードを照会する

Monitor インスタンスを取得したら、そのモニターがサポートしているディスプレイモードを照会できます:

DisplayMode[] modes = Gdx.graphics.getDisplayModes(monitor);

現在設定されているディスプレイモードを取得するには、以下のメソッドを使用します:

DisplayMode currMode = Gdx.graphics.getDisplayMode(monitor);


フルスクリーンモードへ切り替える

特定のMonitorDisplayMode を使用することで、以下のようにしてフルスクリーンモードで切り替えることができます:

Monitor currMonitor = Gdx.graphics.getMonitor();
DisplayMode displayMode = Gdx.graphics.getDisplayMode(monitor);
if(!Gdx.graphics.setFullscreenMode(displayMode)) {
   // switching to full-screen mode failed
}

フルスクリーンモードへの切り替えが失敗した場合、バックエンドは直近に設定されていたウィンドウモードへの復元を行います。



ウィンドウモードへ切り替える

ウィンドウのサイズを変更したりフルスクリーンモードからウィンドウモードへ切り替えたりするには、以下のメソッドを使用します:

Gdx.graphics.setWindowedMode(800, 600);

上記ではウィンドウをウィンドウモードに設定します。このメソッドが呼ばれる前に、ウィンドウは自身が表示されるモニターの中央位置に配置されます。



LWJGL 3 バックエンドのデスクトップAPIとマルチウィンドウAPI

エディターやその他デスクトップツールなど一部のアプリケーションでは、マルチウィンドウを設定すると便利です。 LWJGL 3 バックエンドでは、マルチウィンドウを作成するためのクロスプラットフォーム対応ではないAPIが用意されています。

全てのアプリケーションは、設定時に設定された一つのウィンドウで起動します:

Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setWindowedMode(800, 600);
new Lwjgl3ApplicationConfiguration(new MyMainWindowListener(), config);

上記の例では、標準のApplicationListenerであるMyMainWindowListenerを使ってウィンドウを起動しています。 libGDXでは、ウィンドウのアイコン化やフォーカスのロストといったイベントは直接通知しません。 このためLWJGL 3バックエンドには、Lwjgl3WindowListenerという名前のデスクトップ固有のインタフェースが実装されています。 このインタフェースを実装することで、そうしたイベントを受信し、対応した処理を行うことができます:

config.setWindowListener(new Lwjgl3WindowListener() {
   @Override
   public void iconified() {
      // the window is not visible anymore, potentially stop background
      // work, mute audio, etc.
   }

   @Override
   public void deiconified() {
      // the window is visible again, start-up background work, unmute
      // audio, etc.
   }

   @Override
   public void focusLost() {
      // the window lost focus, pause the game
   }

   @Override
   public void focusGained() {
      // the window received input focus, unpause the game
   }

   @Override
   public boolean windowIsClosing() {
      // if there's unsaved stuff, we may not want to close 
      // the window, but ask the user to save her work
      if(isStuffUnsaved) {
         // tell our app listener to show a save dialog
         return false;
      } else {
         // OK, the window may close
         return true;
      }
});

ウィンドウがフォーカスを失う場合、 LWJGL 3バックエンドはpauseイベントやresumeイベントを通知しません。 アプリがアイコン化/アイコン化解除される場合やアプリが終了される場合にのみ、pause イベントやresume イベントは通知されます。

追加のウィンドウを生成するには、Gdx.appLwjgl3Applicationへキャストするコードが必要です。 これは、あなたのプロジェクトが LWJGL 3 バックエンドのみを使用している場合に可能です。 このコードを他のプラットフォームで使用することはできません。 Lwjgl3Applicationを取得したら、以下のようにして新規にウィンドウを作成できます:

Lwjgl3Application lwjgl3App = (Lwjgl3Application)Gdx.app;
Lwjgl3WindowConfiguration windowConfig = new Lwjgl3WindowConfiguration();
windowConfig.setWindowListener(new MyWindowListener());
windowConfig.setTitle("My other window");
Lwjgl3Window window = Lwjgl3App.newWindow(new MyOtherWindowAppListener(), windowConfig);

全てのウィンドウは専用の ApplicationListenerを持つことを推奨します。 アプリケーションのウィンドウは全て、同一スレッド上で順々に更新されます。 LWJGL 3バックエンドはstaticな Gdx.graphicsGdx.inputを、現在更新されているウィンドウ向けに設定します。 つまり、ApplicationListenerは現在更新されているウィンドウ以外については一切考慮せず、 and pretend it's the only listener in town.

これには一つ例外があります。Gdx.app.postRunnable()を使用している場合、 LWJGL 3 バックエンドはRunnableがpostされたのはどちらのウィンドウなのかを判別することができません。 例えば、ワーカースレッドからメソッドが呼び出されて Runnableがpostされるまでに、別のウィンドウの更新が行われる可能性があります。 これを改善するには、ウィンドウ専用のRunnableインスタンスをそのウィンドウへ直接postすることを推奨します:

// e.g. in a worker thread
window.postRunnable(new MyRunnable());

上記にようにすることで、sataicなGdx.graphicsGdx.inputRunnable が実行された時に特定のウィンドウ向けに設定されるようになります。

Lwjgl3Window クラスにはさらに、ウィンドウのプロパティを変更できるメソッドがあります。 ApplicationListenerのカレントウィンドウを取得し、そして取得したウィンドウの編集が行えます:

// in ApplicationListener#render()
Lwjgl3Window window = ((Lwjgl3Graphics)Gdx.graphics).getWindow();
window.setVisible(false); // hide the window
window.iconifyWindow(); // iconify the window
window.deiconifyWindow(); // deiconify window
window.closeWindow(); // close the window, also disposes the ApplicationListener