LibGDX - черный экран Stage.setViewport(new Viewport())

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

public void setStage(Stage s)
{
    if(currentStage != null)
        currentStage.dispose();
    currentStage = s;
    currentStage.setViewport(view);
}

Чтобы сделать это плавным, на каждом этапе есть метод инициализации, который вызывается в переопределенном setViewport:

@Override
public void setViewport(Viewport v)
{
    super.setViewport(v);
    init();
}

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

Почему у меня черный экран и как это исправить? Если это невозможно, я просто вернусь к использованию конструктора.


person StrongJoshua    schedule 15.06.2014    source источник


Ответы (2)


Если я правильно понял, вы хотите сделать это:

Stage stage1 = new Stage();
stage1.getViewport().update(width, height);

а не это:

Stage stage1 = new Stage (new StretchViewport(width, height)); // It doesn't have to be   StretchViewport

В первом случае (то, что вы пытаетесь сделать) ScalingViewport будет создан автоматически для вас с размерами Gdx.graphics и ортогональной камерой и действует как StretchViewport. Почему бы не использовать второй случай напрямую, когда вы передаете желаемое окно просмотра. Вы всегда можете изменить окно просмотра, когда захотите, вызвав stage1.getViewport().update(width, height);

или вызвав stage1.setViewport(width, height, false); в старых версиях Libgdx.

Viewport недавно изменился, поэтому, если вы можете расширить класс Viewport, чтобы переопределить метод обновления, возможно, вы сможете достичь того, чего хотите:

public class ViewportExtendClass extends StretchViewport{

public ViewportExtendClass(float worldWidth, float worldHeight) {
    super(worldWidth, worldHeight);
}

@Override
public void update (int screenWidth, int screenHeight, boolean centerCamera) {
    super.update(screenWidth, screenHeight, centerCamera);
    // DO YOUR INITIALIZATION HERE
}

}

Из вашего основного класса вы создаете новую сцену:

Stage stage1 = new Stage (new ViewportExtendClass (width, height));

и тогда вы звоните:

stage1.getViewport().update(width, height);

Таким образом, вы можете изменить окно просмотра сцены и повторно инициализировать свои активы.

person z3n105    schedule 17.06.2014
comment
Это более или менее то, что я сделал, за исключением того, что я переопределил метод setViewport в моей стадии (я сделал это один раз в классе, расширяющемся из стадии, а затем все мои состояния расширяют этот класс). Обновление нужно вызывать только один раз, если вы создаете собственное окно просмотра. - person StrongJoshua; 17.06.2014

    @Override
    public void setViewport(Viewport v)
    {
        super.setViewport(v);

        this.getViewport().update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);

        Camera c = this.getViewport().getCamera();
        c.position.set(c.viewportWidth/2, c.viewportHeight/2, 0);

        init();
    }

Это работает, но вы также должны иметь возможность обновлять Viewport в начале вашего приложения, если вы продолжаете использовать тот же самый. Я установил такое положение вместо центрирования, потому что некоторые из моих стадий будут больше экрана.

person StrongJoshua    schedule 15.06.2014