[解決済み] libGDXで異なるアスペクト比を扱うには?
質問
libGDX を使っていくつかの画面を実装していますが、その画面では明らかに
Screen
クラスを使用することになります。しかし、これらの画面の実装は、あらかじめ定義された画面サイズでのみ動作します。たとえば、スプライトが 640 x 480 サイズの画面 (4:3 Aspect ratio) 用に意図されていた場合、他の画面サイズではスプライトが画面の境界を越えてしまい、画面サイズにまったく合わせてスケーリングされないため、意図したとおりに動作しません。さらに、もし libGDX によって単純なスケーリングが提供されていたなら、ゲーム画面のアスペクト比が変わってしまうので、私が直面している問題はまだ残っていたことでしょう。
インターネットで調査した結果、私は ブログ/フォーラム で同じ問題を議論しているのを見つけました。私はそれを実装し、今のところ正常に動作しています。しかし、私はこれがこれを達成するための最良の選択肢であるか、またはより良い代替手段があるかどうかを確認したいと思います。以下は、私がこの合法的な問題にどのように対処しているかを示すコードです。
フォーラム リンク。 http://www.java-gaming.org/index.php?topic=25685.new
public class SplashScreen implements Screen {
// Aspect Ratio maintenance
private static final int VIRTUAL_WIDTH = 640;
private static final int VIRTUAL_HEIGHT = 480;
private static final float ASPECT_RATIO = (float) VIRTUAL_WIDTH / (float) VIRTUAL_HEIGHT;
private Camera camera;
private Rectangle viewport;
// ------end------
MainGame TempMainGame;
public Texture splashScreen;
public TextureRegion splashScreenRegion;
public SpriteBatch splashScreenSprite;
public SplashScreen(MainGame maingame) {
TempMainGame = maingame;
}
@Override
public void dispose() {
splashScreenSprite.dispose();
splashScreen.dispose();
}
@Override
public void render(float arg0) {
//----Aspect Ratio maintenance
// update camera
camera.update();
camera.apply(Gdx.gl10);
// set viewport
Gdx.gl.glViewport((int) viewport.x, (int) viewport.y,
(int) viewport.width, (int) viewport.height);
// clear previous frame
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// DRAW EVERYTHING
//--maintenance end--
splashScreenSprite.begin();
splashScreenSprite.disableBlending();
splashScreenSprite.draw(splashScreenRegion, 0, 0);
splashScreenSprite.end();
}
@Override
public void resize(int width, int height) {
//--Aspect Ratio Maintenance--
// calculate new viewport
float aspectRatio = (float)width/(float)height;
float scale = 1f;
Vector2 crop = new Vector2(0f, 0f);
if(aspectRatio > ASPECT_RATIO) {
scale = (float) height / (float) VIRTUAL_HEIGHT;
crop.x = (width - VIRTUAL_WIDTH * scale) / 2f;
} else if(aspectRatio < ASPECT_RATIO) {
scale = (float) width / (float) VIRTUAL_WIDTH;
crop.y = (height - VIRTUAL_HEIGHT * scale) / 2f;
} else {
scale = (float) width / (float) VIRTUAL_WIDTH;
}
float w = (float) VIRTUAL_WIDTH * scale;
float h = (float) VIRTUAL_HEIGHT * scale;
viewport = new Rectangle(crop.x, crop.y, w, h);
//Maintenance ends here--
}
@Override
public void show() {
camera = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT); //Aspect Ratio Maintenance
splashScreen = new Texture(Gdx.files.internal("images/splashScreen.png"));
splashScreenRegion = new TextureRegion(splashScreen, 0, 0, 640, 480);
splashScreenSprite = new SpriteBatch();
if(Assets.load()) {
this.dispose();
TempMainGame.setScreen(TempMainGame.mainmenu);
}
}
}
UPDATEです。 最近、libGDXがアスペクト比を維持するための独自の機能を持っていることを知ったので、ここで説明したいと思います。インターネット上でアスペクト比の問題を検索している間、私はこの問題を持っていたいくつかのフォーラム/開発者に出くわしました "異なるスクリーン サイズでアスペクト比を維持する方法?
その後、私は
touchDown()
メソッドの実装を進めたところ、リサイズ時の拡大縮小のために
touchDown()
を実装した座標が大きく変化してしまうことがわかりました。画面サイズに合わせて座標を変換するコードを工夫したところ、この量はかなり減りましたが、ピンポイントで維持することには成功しませんでした。例えば
touchDown()
をテクスチャに実装していた場合、画面のサイズを変更すると、サイズに応じてテクスチャ領域の touchListener が右または左に数ピクセル移動し、これは明らかに望ましくありません。
その後、私はステージ クラスがアスペクト比を維持するための独自のネイティブ機能を持つことを知りました (
boolean stretch = false
). ステージクラスを使って画面を実装したところ、アスペクト比はうまく維持されるようになりました。しかし、リサイズ時や画面サイズが異なる場合、生成された黒い領域は常に画面の右側に表示されます。つまり、画面が中央に表示されないため、黒い領域が大きくなると非常に不格好になります。
この問題を解決するために、どなたかコミュニティのメンバーを助けていただけないでしょうか。
どのように解決するのですか?
今どきのやり方。
ここの libgdx で最も有名な質問の一つなので、ちょっとだけ 更新 :
LibGDX v1.0 を導入しました。
Viewport
を導入しました。これは、使いやすく、スケーリング戦略がプラグイン可能であるため、1行で動作を変更でき、どれが自分のゲームに最も合うか、遊んでみることができます。
それについて知る必要があるすべてのことは、次のサイトで見つけることができます。 をご覧ください。 .
関連
-
[解決済み] CSSでdivのアスペクト比を維持する
-
[解決済み] android: imageview の画像を画面に合わせて伸縮させる
-
[解決済み] アンドロイドフラグメント onRestoreInstanceState
-
[解決済み] AppCompat-v7 21でアクションバー/ツールバーにアイコンを表示する。
-
[解決済み] XMLで矩形を描画できますか?
-
[解決済み] DialogFragmentを正しく終了させるには?
-
[解決済み] Android端末がHDPI画面かMDPI画面かを確認する方法は?
-
[解決済み] AndroidでTextViewの下にアンダーラインを引くには
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] EditTextの右側のDrawableにonClickListenerを設定する [重複] [重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] Android Webview - キャッシュを完全に削除する
-
[解決済み] Android ConstraintLayout - あるビューを別のビューの上に配置する
-
[解決済み] Androidのadb logcatでTAG名で特定のメッセージを除外する方法は?
-
[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
-
[解決済み] APKが署名済みかデバッグビルドかを確認するには?
-
[解決済み] アンドロイドのdatepickerダイアログで最大の日付を設定するには?
-
[解決済み] Android: xml リソースからの整数値
-
[解決済み] Google Play ストア内部テストのロールアウトが開始できない