[android] 如何處理libGDX中的不同長寬比?



Answers

編輯: libGDX已演變。 現在最好的答案是用戶noone。 一定要檢查到here的鏈接here

正如SteveBlack發布了舞台課上報導的問題的鏈接,我去了那裡發現這個問題(這實際上不是我的問題)已在最近的夜晚得到解決。

在互聯網上對這個問題進行研究之後,我找不到任何解決方案,因此決定直接聯繫報告錯誤的人員。 之後,他在libgdx論壇上回复我,並感謝他幫助我。 鏈接在這裡

這是一行代碼,你需要做的是:

在resize()方法中:

stage.setViewport(640, 480, false);
stage.getCamera().position.set(640/2, 480/2, 0);

其中640 X 480是您的TextureRegion的分辨率,用於描述預期的寬高比。 如果您的TextureRegion大小為320 X 240,則應將這兩個參數更改為新的分辨率來執行此操作。

實際解決了我的問題的原始個人資料鏈接

Question

我已經使用libGDX實現了一些屏幕,顯然它使用libGDX框架提供的Screen類。 但是,這些屏幕的實現只適用於預定義的屏幕大小。 例如,如果精靈是用於640 x 480大小的屏幕(4:3長寬比),則其在其他屏幕大小上無法按預期工作,因為精靈會在屏幕邊界上縮放並且不會縮放到屏幕大小在所有。 此外,如果libGDX提供了簡單的縮放比例,那麼我所面臨的問題仍然會存在,因為這會導致遊戲畫面的高寬比發生變化。

經過在互聯網上的研究,我遇到了一個討論同樣問題的blog/forum 。 我已經實施它,到目前為止它工作正常。 但我想確認這是否是實現這一目標的最佳選擇,或者是否有更好的選擇。 以下是顯示我如何處理這個合法問題的代碼。

論壇鏈接: blog/forum : blog/forum 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);
        }
    }
}

更新:我最近才知道,libGDX有一些自己的功能來維持我想在這裡討論的寬高比。 在跨互聯網搜索縱橫比問題時,我遇到了幾個論壇/開發人員,他們遇到了“如何在不同屏幕尺寸上保持縱橫比?”的問題。 其中一個真正為我工作的解決方案已在上面發布。

後來,當我繼續為屏幕實現touchDown()方法時,我發現由於調整大小的縮放比例,我實現touchDown()的坐標會發生很大的變化。 在根據屏幕大小調整一些代碼來翻譯坐標之後,我在很大程度上減少了這個數量,但是我沒有成功地保持它們的精確度。 例如,如果我在紋理上實現了touchDown() ,調整屏幕大小會將紋理區域上的touchListener向右或向左移動一些像素,具體取決於調整大小,這顯然是不合需要的。

後來我才知道舞台類擁有自己的本地功能來保持寬高比( boolean stretch = false )。 現在我已經通過使用舞台類實現了我的屏幕,高寬比保持良好。 然而,在調整大小或不同屏幕尺寸時,生成的黑色區域總是出現在屏幕的右側; 那就是屏幕沒有居中,如果黑色區域相當大,這會使得它非常難看。

任何社區成員能幫助我解決這個問題嗎?




我從http://blog.acamara.es/2012/02/05/keep-screen-aspect-ratio-with-different-resolutions-using-libgdx/使用該方法

我做了這個功能,返回觸摸屏幕上的點,縮小到你想要的遊戲位置。

public Vector2 getScaledPos(float x, float y) {
    float yR = viewport.height / (y - viewport.y);
    y = CAMERA_HEIGHT / yR;

    float xR = viewport.width / (x - viewport.x);
    x = CAMERA_WIDTH / xR;

    return new Vector2(x, CAMERA_HEIGHT - y);
}

在觸地/向上/拖動中使用此功能,您可以檢查遊戲中的觸摸。









Related