LibGDX - Stage.setViewport(新的Viewport())黑屏

时间:2014-06-15 10:35:20

标签: java libgdx render viewport

为了组织的缘故,我为我的游戏使用了多个场景,而不是让每个场景都有一个接收视口的构造函数(我的游戏是可扩展的),我想将每个阶段的视口设置为与构造函数分开,然后在视口设置,添加演员。在主要课程中,它会发生如下:

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

为了使它流畅,每个阶段都有一个在覆盖setViewport中调用的init方法:

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

然而,所有这些都让我看起来是黑屏...我尝试更新相机和视口,但没有用(注意演员正在调用他们的渲染方法)。

为什么我会看到这个黑屏,我该如何解决?如果不可能,我将恢复使用构造函数。

2 个答案:

答案 0 :(得分:4)

如果我理解正确你想要这样做:

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);

来更改视口

或在旧的Libgdx版本中调用stage1.setViewport(width, height, false);

最近更改了视口,因此如果您可以将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);

像这样你可以改变舞台视口并重新初始化你的资产。

答案 1 :(得分:2)

    @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。我设置了这样的位置,而不是居中,因为我的一些阶段会比屏幕大。