LibGDX FitViewport не подходит для построения, но подходит для изменения размера.

Я ломаю голову, пытаясь понять, что здесь происходит... Я использую FitViewport, который отлично работает всякий раз, когда я изменяю размер экрана, но когда он впервые создается во время конструктора, он не вписывается в экран. как это должно быть (и как это происходит, когда я изменяю размер).

Вот код моего конструктора и метода resize():

public class UpgradesScreen implements Screen {

    private ScreenHandler sh;

    private OrthographicCamera cam;
    private Viewport viewport;

    public UpgradesScreen(ScreenHandler sh) {

        Gdx.app.log("UpgradesScreen", "Attached");

        this.sh = sh;

        cam = new OrthographicCamera();
        cam.setToOrtho(true, sh.V_WIDTH, sh.V_HEIGHT);

        viewport = new FitViewport(sh.V_WIDTH, sh.V_HEIGHT, cam);
        viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

    }

    @Override
    public void resize(int width, int height) {
        Gdx.app.log("UpgradesScreen", "resizing");
        viewport.update((int) width, (int) height);
    }

Я проверил, чтобы убедиться, что Gdx.graphics.getWidth() дает ту же цифру, что и аргумент «ширина», который метод resize() получает при изменении размера экрана (аналогично со значениями «высоты»).

Насколько я могу судить, область просмотра должна вести себя точно так же во время конструктора, как и при изменении размера. Так почему он упрямится и не обновляется, чтобы соответствовать?

Вот как это выглядит после изменения размера:

FitViewport после изменения размера

... и вот как это выглядит, когда экран создается впервые, до того, как размер окна будет изменен вручную:

введите здесь описание изображения


person 1337ingDisorder    schedule 21.06.2015    source источник
comment
Примечание. Я попытался добавить viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); строку в методе show() на всякий случай... Не имеет значения.   -  person 1337ingDisorder    schedule 21.06.2015
comment
Можете ли вы показать свой код рисования?   -  person yigiter    schedule 21.06.2015
comment
Это довольно обширно и на самом деле не связано. Он просто использует стандартные координаты в пределах виртуальной ширины и высоты 960 и 600, и когда размер окна изменяется, FitViewport все это прекрасно отображает. Проблема только в том, что FitViewport не обновляется и не применяется при первом создании, поэтому мне нужно выяснить, почему и как это сделать.   -  person 1337ingDisorder    schedule 22.06.2015


Ответы (1)


Вы создаете новый объект Viewport, который при запуске вообще не используется.

Вызов

viewport.apply();

Перед тем, как ваш розыгрыш вызовов.


Кроме того, метод resize вызывается при запуске по умолчанию. Используйте его для инициализации игровых объектов вместо конструктора.


Изменить:
Посмотрите Жизненный цикл LibGDX< /а>.

resize всегда вызывается перед render. Не должно быть разного поведения при запуске и после него. Это ваша коренная проблема. Попробуйте сначала исправить.

person Tanmay Patil    schedule 22.06.2015
comment
Хм, куда мне это положить? Я изменил строку .replace() сразу после инициализации на .apply(), и она все еще делает то же самое. - person 1337ingDisorder; 22.06.2015
comment
Вызовите метод apply непосредственно перед вызовами отрисовки. - person Tanmay Patil; 22.06.2015
comment
Хм, хорошо. Похоже, что добавление .apply() в метод render() вызывает много избыточных накладных расходов, учитывая, что .apply() нужно выполнить только в самом первом цикле. Тем временем я обернул его в логическое значение, которое переключается при запуске, поэтому вместо выполнения .apply() 60 раз в секунду он просто выполняет логическую проверку, хотя я чувствую, что должен быть более элегантный способ обеспечение .apply() on происходит при первом запуске. - person 1337ingDisorder; 22.06.2015
comment
В любом случае спасибо за это предложение. Наличие .apply() в цикле render() действительно решает проблему :) - person 1337ingDisorder; 22.06.2015
comment
resize всегда вызывается перед рендерингом. Не должно быть разного поведения при запуске и после него. Это ваша коренная проблема. Попробуйте сначала исправить. -- точно, так что же помешает вызову resize() без ручного изменения размера окна? - person 1337ingDisorder; 23.06.2015
comment
Невозможно спекулировать, не глядя на какой-либо код. Я предлагаю вам запустить свой код в режиме отладчика, поставить точки останова и посмотреть, в каком порядке следуют вызовы методов. Если после этого вы столкнетесь с какой-либо трудностью, я считаю, что это может привести к очень хорошему новому вопросу. Желаю вам удачи. - person Tanmay Patil; 24.06.2015