1. ホーム
  2. android

[解決済み] libGDXで異なるアスペクト比を扱うには?

2023-07-20 14:17:02

質問

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行で動作を変更でき、どれが自分のゲームに最も合うか、遊んでみることができます。

それについて知る必要があるすべてのことは、次のサイトで見つけることができます。 をご覧ください。 .