0

複数の画面サイズで縦横比を維持するために、サイズ変更メソッドで次のコードを使用しています。

@Override
public void resize(int width, int height)
{
    float aspectRatio = (float)width / (float)height;
    float scale = 1f;
    Vector2 crop = new Vector2(0, 0);

    if (aspectRatio > globals.ASPECT_RATIO)
    {
        scale = (float)height / (float)globals.VIRTUAL_HEIGHT;
        crop.x = (width - globals.VIRTUAL_WIDTH * scale) / 2f;
    }
    else if (aspectRatio < globals.ASPECT_RATIO)
    {
        scale = (float)width / (float)globals.VIRTUAL_WIDTH;
        crop.y = (height - globals.VIRTUAL_HEIGHT * scale) / 2f;
    }
    else
    {
        scale = (float)width / (float)globals.VIRTUAL_WIDTH;
    }

    float w = (float)globals.VIRTUAL_WIDTH * scale;
    float h = (float)globals.VIRTUAL_HEIGHT * scale;

    viewport = new Rectangle(crop.x, crop.y, w, h);
}

VIRTUAL_WIDTHVIRTUAL_HEIGHTおよびASPECT_RATIO次のように設定されます。

public final int VIRTUAL_WIDTH = 800;
public final int VIRTUAL_HEIGHT = 480;
public final float ASPECT_RATIO = (float)VIRTUAL_WIDTH / (float)VIRTUAL_HEIGHT;

これは、画面サイズが変更されたときに正しい比率を維持するという点で完全に機能します。ただし、camera.uproject(すべてのタッチ イベントの前に呼び出す) は正しく動作しません。サイズ変更コードによって画面サイズが 800x480 以外に変更されると、タッチ位置が正しくありません。

create() メソッドでカメラをセットアップする方法は次のとおりです。

camera = new OrthographicCamera(globals.VIRTUAL_WIDTH, globals.VIRTUAL_HEIGHT);
camera.setToOrtho(true, globals.VIRTUAL_WIDTH, globals.VIRTUAL_HEIGHT);

そして、これが私の render() メソッドの始まりです:

camera.update();
Gdx.graphics.getGL20().glViewport((int)viewport.x, (int)viewport.y, 
(int)viewport.width, (int)viewport.height);
Gdx.graphics.getGL20().glClearColor(0, 0, 0, 1);
Gdx.graphics.getGL20().glClear(GL20.GL_COLOR_BUFFER_BIT);

サイズ変更コードを無視してglViewportメソッド呼び出しをGdx.graphics.getWidth()and に設定するとGdx.graphics.getHeight()camera.unproject機能しますが、明らかに縦横比の維持が失われます。誰にもアイデアはありますか?

タッチイベントでアンプロジェクトを実行する方法は次のとおりです。

private Vector3 touchPos = new Vector3(0, 0, 0);

public boolean touchDown (int x, int y, int pointer, int newParam)
{
    touchPos.x = x;
    touchPos.y = y;
    touchPos.z = 0; 
    camera.unproject(touchPos);

    //touch event handling goes here...
}

アップデート

Stage オブジェクトを実装することで、これを少し進めましたが、まだ完全には機能していません。

create メソッドでステージとカメラをセットアップする方法は次のとおりです。

stage = new Stage();
camera = new OrthographicCamera(globals.VIRTUAL_WIDTH, globals.VIRTUAL_HEIGHT);
camera.setToOrtho(true, globals.VIRTUAL_WIDTH, globals.VIRTUAL_HEIGHT);
stage.setCamera(camera);

これが私のサイズ変更コードです:

public void resize(int width, int height)
{
    Vector2 size = Scaling.fit.apply(800, 480, width, height);
    int viewportX = (int)(width - size.x) / 2;
    int viewportY = (int)(height - size.y) / 2;
    int viewportWidth = (int)size.x;
    int viewportHeight = (int)size.y;
    Gdx.gl.glViewport(viewportX, viewportY, viewportWidth, viewportHeight);
    stage.setViewport(800, 480, true, viewportX, viewportY, viewportWidth, viewportHeight);
}

これが私のレンダリングコードの始まりです:

stage.getCamera().update();
Gdx.graphics.getGL20().glClearColor(0, 0, 0, 1);
Gdx.graphics.getGL20().glClear(GL20.GL_COLOR_BUFFER_BIT);
spriteBatch.setProjectionMatrix(stage.getCamera().combined);

そして、これが私がタッチイベントを処理する方法です:

private Vector3 touchPos = new Vector3(0, 0, 0);

public boolean touchDown (int x, int y, int pointer, int newParam)
{
    touchPos.x = x;
    touchPos.y = y;
    touchPos.z = 0;
    stage.getCamera().unproject(touchPos);

    //touch event handling goes here...
}

これは、画面がデフォルト サイズの場合と、画面が拡大された場合に機能するようになりました。ただし、画面サイズを縮小すると、画面が小さくなるほどタッチ ポイントが不正確になります。

4

2 に答える 2

2

これに対する答えを見つけることができました。Vector3、viewportX、viewportY、viewportWidth、viewportHeight パラメーターを受け取る camera.unproject メソッド呼び出しを使用するだけで済みました。必要なビューポート パラメータは、上記のサイズ変更コードによって計算されたものです。

于 2013-09-27T15:21:43.537 に答える
1

問題を解決するために、新しい Stage システム内に既に実装されたソリューションがあります。ウィキの scene2d #viewportをご覧ください。アスペクト比を固定するために、サイズを変更して手動で合わせる必要はありません。ウィキのブラックバーを使用した例を次に示します。

public void resize (int width, int height) {
        Vector2 size = Scaling.fit.apply(800, 480, width, height);
        int viewportX = (int)(width - size.x) / 2;
        int viewportY = (int)(height - size.y) / 2;
        int viewportWidth = (int)size.x;
        int viewportHeight = (int)size.y;
        Gdx.gl.glViewport(viewportX, viewportY, viewportWidth, viewportHeight);
        stage.setViewport(800, 480, true, viewportX, viewportY, viewportWidth, viewportHeight);
}
于 2013-09-19T08:19:56.407 に答える