2013-05-09 8 views
35

上の複数のモニタ用libGDX/LWJGLゲームフルスクリーン間違ったサイズは、私がlibGDX(LWJGLの上にライブラリー)ゲームプロジェクトに取り組んで、いくつかの異なるワークステーションからのIntelliJ IDEA IDEを使用しています:JavaとUbuntuの

  • 2台のディスプレイ(1920x1080および1600x1200)、nVidia GT540Mを搭載したWindows 7 x64ラップトップ。
  • Ubuntu 12.04 LTSは、1つのディスプレイ(1366x768)、Intel内蔵グラフィックスを搭載したノートパソコンに搭載されています。
  • Ubuntuの二つのディスプレイ(1920×1080と1280×1024)と、デスクトップ上の12.04 LTS、nVidiaのGTS 450

私はUbuntuのボックス上でJava 6のためのOpenJDKを使用して、上のSun/OracleのJava 6のよWindowsのボックス(私はJava 6がAndroidの互換性のために使用するものと聞いた)。

フルスクリーンで実行されている:

  • Windows 7のノートパソコン:正常に動作します。
  • Ubuntuノートパソコン:正常に動作します。
  • Ubuntuデスクトップ:背景画像が拡大表示され、一部のみが画面に収まります。 +

さらにこれを見ると、私は、Gdx.graphics.getHeight()とGdx.graphics.getWidthへの呼び出しは()私の場合3200x1080で、両方のディスプレイをカバーするのに必要な矩形のサイズを返すことがわかりゲームを全画面で実行すると、ディスプレイのうちの1つしか使用されないため、カメラは1920x1080に設定されますが、カメラの動きとタイルマップのパンは、3200x1080で動作し、使用できない(キャラクターはスクリーンから右に離れるので)。

awt.ToolkitのgetScreenSize()呼び出しで返されるサイズから実際に問題が発生していると推測していますが、実際に使用する画面のサイズを取得するために、より深く問い合わせる方法はわかりません私はフルスクリーンに行きます。

私DesktopStarterは、次のようにフルスクリーン画面サイズとセットを取得します。

LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration(); 
    Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); 
    cfg.width = screenDimension.width; 
    cfg.height = screenDimension.height; 
    cfg.fullscreen = true; 
    new LwjglApplication(new Game1(), cfg); 

は、回避策「フルスクリーン」は、実際に起動することだけでディスプレイの高さ/幅を得るためにはありますか?

私が見ている問題は、game.jarファイルを実行してゲームを終了し、もう一度繰り返し実行すると、Gdx.graphics.getDisplayModesによって返されるモードのリストに表示される異なる表示モードになることです() - PT以下に指摘するが、これはLWJGLのDisplay.getAvailableDisplayModes()を囲む薄いラッパーである。なぜこうなった? Ubuntuでの後続実行時に表示されるモードが異なるのはなぜですか?

編集:per p。の提案では、表示モードのリストを提供しているLWJGLのように思われるので、問題のLWJGL参照を入れてください。

ありがとうございます!

+1

'Gdx.graphics.getDisplayModes()'はより一貫して有用な結果を返しますか?あなたがこれを問い合わせる前にlibgdxを初期化しなければならないので、チキンと卵のビットです。 –

+0

@ P.T。ありがとう!これは直接サポートされていませんが、サポートされているすべての表示モードのリストを返します。おそらくJREのハードウェアとのインターフェースによって報告されます。私はそのヒントを使用し、最高解像度(最高1920x1200)を選択し、その解像度で最高のリフレッシュレートを持つものを選択するために、Game.Create()のループをセットアップしてすべてのモードを回転させました。これは、2つ(またはそれ以上)の非常に低解像度のモニターを使用しない限り(その幅が1920またはそれ以下になるように)、再生可能なデフォルトを選択します。それを答えとして加えて、それをマークします。 ;) – Shad

+0

実際これをもう少し試してみると、私のUbuntuワークステーションで 'Gdx.graphics.getDisplayModes()'が盛んです。非常に頻繁に、それが報告する43モードのうち、1920x1080は全くリストされていません。しかし時には、それはいくつかの異なるリフレッシュレートで記載されていますか?挫折。 – Shad

答えて

0

この問題を回避するにはjavafx.stage.screenを使用できますが、Java 6を使用する場合はJavaFXを追加するか、Java 7 SDKにはJava 7にアップグレードする必要があります。ドキュメントから)

「は、 モニターなどのグラフィックスデスティネーションの特性を記述する デスクトップ領域は、複数の物理画面デバイスにまたがる可能性がある仮想デバイスのマルチスクリーン環境では、。スクリーンオブジェクトの境界 がScreen.primaryに対するものである。例えば

たRectangle2D primaryScreenBounds = Screen.getPrimary()。getVisualBounds();

//ステージ境界をメイン画面の表示境界に設定します。 stage.setX(primaryScreenBounds.getMinX()); stage.setY(primaryScreenBounds.getMinY()); stage.setWidth(primaryScreenBounds.getWidth()); stage.setHeight(primaryScreenBounds.getHeight());

stage.show();」

は(などgetBounds(), getDpi(), getScreens()、)他の様々な方法があるにも可能性があなたのために非常に有用であろう

+1

Harvath II - お返事ありがとうございます。私はlibGDXゲームの文脈の中でその仕事をすることができるかどうかを見ていきます - 主な問題はAndroidのサポートにあるかもしれません...私は可能な限りプラットフォームの依存関係を避けたいと思います。私はそれを試して、私は仕事をすることができます参照してください。 – Shad

1
GraphicsDevice monitors[]=GraphicsEnvironment.getScreenDevices(); 

Dimension screen_resolution[monitors.length]; 

for (int monitorID = 0; monitorID < monitors.length; monitorID++) 
{ 
    screen_resolution[monitorID] = new Dimension(monitors[monitorID].getDisplyMode().getWidth(),monitors[monitorID].getDisplyMode().getHeight()); 
} 
1

私は控えるだろう。 Toolkit.getDefaultToolkit()を使用して、lwjgl.util.Display.getAvailableDisplayModes()またはlibgdxで説明されている方法を使用します。

フルスクリーンウィンドウを設定したら、そのサイズを取得します(設定方法それを既に知っていない)、そこからのこの情報のみを使用する。

Display.getAvailableDisplayModes()が別々の実行でソート順を変更した場合は、それらを再ソートして最大のものを使用するか、標準のものを使用して標準のものを使用してゲーム内の設定を変更します。

0

あなたが現在使用しているモニターの寸法を取得する場合があります。異なるサイズのモニターでは、寸法を取得するだけです。さまざまなサイズのモニターでは、処理が異なる場合があります。

他の画面ではまだ動作していると考えられるため、背景画像が拡大されている可能性があります。私は完全にLWJGL使用を控えるだろう

0

をGLない場合

ホープこれは、役立ちます。表面上は十分にシンプルに見えるかもしれませんが、より高度な機能を追加しようとすると、OpenGL上のラッパーはその機能を提供しないか、プログラムを3倍遅くすることに気付くでしょう。私はC++とOpenGLに移行することをお勧めします(これがオプションの場合)。あなたはそのシンプルさに驚かれるでしょう。 それ以外の場合は、クロスプラットフォームのライブラリには一般的にこの種の不具合があります。あなたの問題を解決するには、ビューポートの解像度を決定するためにライブラリに頼るのを止める必要があります。代わりに、すべての可能な表示モードを列挙し、あなたに応じて最良のものを選んでください。これははるかに定義された動作をもたらし、魔法のように見えるデフォルトの設定を利用するよりもデバッグが容易になります。一般的に、使用しているデータがわかっていることを常に確認する必要があります。さらに悪いことに、私はあなたがラッパーを使ってラッパーを使用していることに気づいただけです。これは複雑すぎてレンダリングの速度がはるかに遅くなります(平均20倍)。ここで

+1

はい、ラッパーのすべてのラッパーは、常に平均20回すべての速度を低下させます。ラッパーを使用するだけで、それは3倍になります。それはまっすぐな事実です。また、ラッパーはラップされているものと同じ機能を提供することはできません。 C++だけが唯一の真の言語であり、3歳の子供がそれを使ってゲームを作ることができるほどシンプルです。 -1 – noone

+1

C++は自動的にJavaよりも優れていて高速です!インターネットはそれだと言ったので、明らかに私はそれを信じなければならない!クリスチャン、あなたはあなたの激しく不正確な質問を確認するための情報源を持っていない限り、OPを混乱させて、彼に無益な嘘を与えてはいけません。 -1 –

+0

私はすべてのラッパーがひどいと言っているわけではありませんが、この特定の例では、libGDXはひどく悪いです。例として、この比較を見てみましょう: –

-1

私はToolkit.getDefaultToolkit()の使用を控え、lwjgl.util.Display.getAvailableDisplayModes()またはlibgdxで記述されたメソッドのみを使用します。

フルスクリーンウィンドウを設定したら、そのサイズを取得し(設定方法ではそれがわからない場合)、このサイズの情報のみを使用します。

異なる実行でDisplay.getAvailableDisplayModes()がソート順を変更した場合、それらを再ソートして最大のものを使用するか、標準のものを使用して標準のものを使用してゲーム内の設定を変更します。

+1

答えをコピーする場合は、少なくとも書式を保持してください。 – cfstras

0

私は確信していませんが、それは私のために働いた。次のコードのように、ゲームを開始した後でサイズを設定してください:

public static void main(String[] args) { 
    LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration(); 
    cfg.title = "Palmeiras!!"; 
    cfg.vSyncEnabled = false; 
    cfg.forceExit = true; 
    cfg.allowSoftwareMode = true; 
    new LwjglApplication(new Palmeiras(null), cfg); 

    Gdx.graphics.setDisplayMode(Gdx.graphics.getDesktopDisplayMode().width, 
      Gdx.graphics.getDesktopDisplayMode().height, true); 
} 

私がうまくいけば教えてください。

関連する問題