Как работает окно просмотра в libgdx и как его правильно настроить? - PullRequest
0 голосов
/ 23 марта 2020

Я изучаю использование libgdx, и меня смутило окно просмотра и расположение объектов на экране. Давайте предположим, что мой 2D-мир имеет ширину 2x2 и высоту. Теперь я создаю камеру с размером окна 1x1. Так что я должен увидеть 25% моего мира. Обычно дисплеи не имеют квадратной формы. Так что я ожидаю, что libgdx будет squi sh и растянет этот квадрат, чтобы соответствовать дисплею.

Для бокового скроллера вы должны установить высоту области просмотра так же, как мировую высоту и настроить ширину области просмотра в соответствии с соотношением сторон. Независимо от соотношения сторон вашего дисплея вы всегда видите полную высоту мира, но различные расширения по оси X. Кто-то с дисплеем шире, чем высокий, может смотреть дальше по оси X, чем кто-то с дисплеем квадратной формы. Но пропорции будут сохранены и нет искажений. До сих пор я думал, что освоил, как работает viewport logi c.

Я работаю с книгой "Изучение разработки игр LibGDX", в которой вы разрабатываете игру "Каньонный кролик". Исходный код можно найти здесь:

Canyon Bunny - GitHub

В классе WorldRenderer вы найдете инициализацию камеры:

private void init() {
        batch = new SpriteBatch();
        camera = new OrthographicCamera(Constants.VIEWPORT_WIDTH, Constants.VIEWPORT_HEIGHT);
        camera.position.set(0, 0, 0);
        camera.update();
    }

Константы области просмотра сохраняются в отдельном классе констант:

    public class Constants {
        // Visible game world is 5 meters wide
        public static final float VIEWPORT_WIDTH = 5.0f;
        // Visible game world is 5 meters tall
        public static final float VIEWPORT_HEIGHT = 5.0f;
    }

Как видно, область просмотра имеет размер 5x5. Но игровые объекты имеют правильную пропорцию на моем телефоне (16: 9) и даже на рабочем столе, когда вы меняете размер windows, игра сохраняет правильные пропорции. Я не понимаю почему. Я ожидаю, что игра пытается нарисовать квадратный вырез мира на прямоугольной форме, что приведет к искажению. Почему это не так? И почему вам не нужна адаптация ширины или высоты области просмотра к соотношению сторон?

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Я нашел причину. Если вы посмотрите на класс worldRenderer, есть метод resize (). В этом методе область просмотра адаптируется к соотношению сторон. Мне просто интересно, потому что до сих пор я думал, что метод изменения размера вызывается только при изменении размера окна. Видимо, он также вызывается при запуске. Кто-нибудь может уточнить?

0 голосов
/ 23 марта 2020

Строка:

cameraGUI.setToOrtho(true);

Переопределяет значения, которые вы указали при вызове:

cameraGUI = new OrthographicCamera(Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT);

Вот код LibGDX, который показывает, почему / как установленные вами размеры области просмотра были проигнорированы:

/** Sets this camera to an orthographic projection using a viewport fitting the screen resolution, centered at
     * (Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2), with the y-axis pointing up or down.
     * @param yDown whether y should be pointing down */
    public void setToOrtho (boolean yDown) {
        setToOrtho(yDown, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    }

    /** Sets this camera to an orthographic projection, centered at (viewportWidth/2, viewportHeight/2), with the y-axis pointing up
     * or down.
     * @param yDown whether y should be pointing down.
     * @param viewportWidth
     * @param viewportHeight */
    public void setToOrtho (boolean yDown, float viewportWidth, float viewportHeight) {
        if (yDown) {
            up.set(0, -1, 0);
            direction.set(0, 0, 1);
        } else {
            up.set(0, 1, 0);
            direction.set(0, 0, -1);
        }
        position.set(zoom * viewportWidth / 2.0f, zoom * viewportHeight / 2.0f, 0);
        this.viewportWidth = viewportWidth;
        this.viewportHeight = viewportHeight;
        update();
    }

Так что вам нужно будет сделать это вместо этого:

cameraGUI.setToOrtho(true, Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT);

Также не забудьте позвонить update() сразу после того, как вы измените размеры камеры или размер окна просмотра вашей камеры. (Или другие свойства)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...