Как работать с различными соотношениями сторон в libGDX?

Я реализовал некоторые экраны с использованием libGDX, которые, очевидно, будут использоватьScreen класс, предоставляемый каркасом libGDX. Однако реализация для этих экранов работает только с предопределенными размерами экрана. Например, если спрайт предназначался для экрана размером 640 x 480 (соотношение сторон 4: 3), он не будет работать должным образом на экранах других размеров, потому что спрайты соответствуют границам экрана и не масштабируются до размера экрана. вообще. Более того, если бы 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);
        }
    }
}

ОБНОВИТЬ: Недавно я узнал, что libGDX обладает некоторыми собственными функциональными возможностями для поддержания соотношений сторон, которые я хотел бы обсудить здесь. При поиске проблемы соотношения сторон в Интернете я наткнулся на несколько форумов / разработчиков, у которых возникла проблема «Как сохранить соотношение сторон на экранах разных размеров?» Одно из решений, которое действительно сработало для меня, было размещено выше.

Позже, когда я приступил к осуществлениюtouchDown() методы для экрана, я обнаружил, что из-за масштабирования на изменение размера, координаты, на которых я реализовалtouchDown() будет меняться на большую сумму. После работы с некоторым кодом для перевода координат в соответствии с изменением размера экрана, я значительно уменьшил эту сумму, но мне не удалось сохранить их с высокой точностью. Например, если бы я реализовалtouchDown() на текстуре изменение размера экрана приведет к смещению сенсорного прослушивателя в области текстуры на несколько пикселей вправо или влево, в зависимости от изменения размера, что явно нежелательно.

Позже я узнал, что у сценического класса есть собственная встроенная функциональность для поддержания соотношения сторон (boolean stretch = false). Теперь, когда я реализовал свой экран с помощью сценического класса, соотношение сторон хорошо поддерживается им. Однако при изменении размера или при разных размерах экрана генерируемая черная область всегда появляется в правой части экрана; то есть экран не отцентрирован, что делает его довольно уродливым, если черная область существенно велика.

Может ли какой-нибудь член сообщества помочь мне решить эту проблему?

Ответы на вопрос(7)

Ваш ответ на вопрос