libGDXの解像度の独立性


22

libGDXゲームの解像度/密度を独立させるにはどうすればよいですか?基礎となる密度に関係なく、イメージサイズを「絶対」に指定する方法はありますか?

私は非常にシンプルな子供向けゲームを作っています。画面に表示されるスプライトの束と、メニューのテキスト(主にオプションメニュー)。私が知りたいのは、スプライト/フォントの解像度を独立させるにはどうすればいいですか?(物事を簡単にするために、自分のクラスでそれらをラップしました。)

単純な子供向けのゲームなので、ゲームの「プレイ可能な領域」について心配する必要はありません。できるだけ多くの画面スペースを使用したい。

私が今やっていることは、非常に間違っているようですが、単に大きな解像度に適した画像を作成し、画面サイズに合わせて縮小(またはめったに拡大)することです。これは(デスクトップバージョンでは)大丈夫なようです。テクスチャの線形マッピングでも、解像度が小さいと見苦しくなります。

また、これはAndroidの「デバイスに依存しないピクセル」(DP)に直面しているようです。それとも、私は何かを逃していて、libGDXはすでにこれを何らかの形で処理していますか?

これに取り組む最良の方法は何ですか?このリンクを見つけました。これは問題を解決する良い方法ですか?:http : //www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

画像の制御方法については言及していますが、密度に関係なくフォント/画像サイズを指定する方法については言及していません。



@thedaianはまったく違います。それは解像度についてです。私は密度と解像度の相互作用についてもっと心配しています。
-ashes999

回答:


12

libgdxでは実行時にデバイス密度を読み取ってフォントレンダリングできるため、このソリューションを使用して密度に依存しないフォントサイズを実現します。

float densityIndependentSize = origFontSize * Gdx.graphics.getDensity();
int fontSize = Math.round(densityIndependentSize );
BitmapFont font = generator.generateFont(fontSize );

私の議論は画像とフォントについてです。ただし、動的フォントレンダリングの場合は+1です(既にこれを行っています)。
ashes999

10

libgdxでこれを実現するには、「orthographicCamera」を使用して、使用するサイズを割り当てます。すべての解像度で、すべての画像がそのサイズにスケーリングされます(Androidの画面が大きいため800X480を使用します) )そしてそれはうまく動作します:)

public class GameStage extends Stage 
{ 
     public GameStage(float width, float height, boolean stretch) 
     { 
          this.camera = new OrthographicCamera(800, 480);
          this.camera.position.set(800/2, 480/2, 0f); 
     } 
}

コードサンプルを入手してください。
ashes999

これがコードです。Screenインターフェイスを実装するクラスを作成し、ステージを構築するコンストラクターで、renderメソッドでstage.draw()を配置します。Stagesを使用したくない場合は、CameraタイプのScreen実装クラスで変数を宣言し、Stageと同じことを行いますが、renderメソッドではカメラに更新を適用します。
Rudy_TM

これは実際にはかなりうまくいきます。
you786

4

Androidの「デバイスに依存しないピクセル」は、デバイスを分類するための単なる尺度であり、実際にはレンダリング可能なピクセルとしては使用できないと考えています。したがって、魔法のようなDPI解決インフラストラクチャを見逃すことはありません。ここで最新技術を理解している限り、すべてのオプションを発見しました。さまざまなデバイスを扱うための2つの基本的なアプローチがあります。

  1. 既存の画像をスケーリングして、実際のデバイスDPIに一致させます。
  2. DPIに基づいて、実行時にさまざまな事前にスケーリングされた画像から選択します。

もちろん、2つを組み合わせて(おおよそ正確な画像を選んでスケーリングする)、またはUIのさまざまな要素に対して異なるアプローチを使用できます(たとえば、フォント/テキストの既存の画像、ゲームプレイの動的スケーリングスプライト)。

あなたの特定のゲームがやろうとしていることは、どちらのアプローチがより理にかなっているのかを実際に変えることができます。たとえば、画面上のメニューがある場合、ボタンが指先のサイズの合理的な倍数であることを確認する必要があります(したがって、ボタンは常に簡単にヒットしますが、必要以上に大きくありませんタブレットなどの大きなデバイス)。また、パズル全体を一度に確認できるようにするパズルゲームを構築しようとしている場合は、画面に収まるように要素を拡大縮小する必要があります(たとえば、三目並べなど)ゲームでは、おそらく各要素に画面の約1/3を使用させます)。

フォントのように細かい部分が非常に多い場合、事前にレンダリングされたさまざまな画像とテキストを用意して、最適なものを選択する必要があります。そのため、ボタンはデバイスごとに相対的な形状/サイズを変更する場合がありますが、通常は常に見栄えがよくなります。

問題と解決策についての議論については、Mario ZerchnerのBeginning Android Gamesをご覧ください。マリオはlibGDXの作者であることに注意してください。したがって、本のアプローチはlibGDXを反映しています(それらは1対1ではないことに注意してください。


DPIに基づいて事前に作成された画像コレクションから選択しても、「このスプライトは64x64として表示されなければならない」ことを保証する方法がわかりません。
-ashes999

1
OpenGLカメラを物理ディスプレイに一致するように設定すると仮定していたため、1つのOpenGLピクセルが1つのディスプレイピクセルにマッピングされます。その時点で、64x64イメージは画面に64x64として表示されます。Rudy_TMが指摘しているように、カメラマッピングをいじって画面全体のスケーリングを取得できます。
PT

さて、これは私が求めていた「秘密のソース」のように見えます。チェックしてお知らせします、ありがとう。
-ashes999

0

それを行う1つの方法は、ゲームの最小アスペクト比と最大アスペクト比を定義することです。これらは、サポートする比率になります。次に、libGdxで現在提供されているビューポートを使用する必要があります。ビューポートは、指定した設定に従ってワールドをスケーリングします。

ビューポートにはいくつかのタイプがあり、ゲームに最適なビューポートを選択する必要があります。

たとえば、ExtendViewportを使用して、高さまたは幅のいずれかを固定し、もう一方を計算できます。次に、すべてのグラフィックスが最小アスペクト比で表示されることを確認する必要があります。拡張ビューポートは、グラフィックを歪めることなく、グラフィックを正しいアスペクト比にスケーリングします。ただし、ExtendViewportはワールドに追加のスペースを追加することで機能するため、たとえば、カバーされたアスペクト比の全体をカバーする背景用のグラフィックも提供する必要があります。示される。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.