为了组织的缘故,我为我的游戏使用了多个场景,而不是让每个场景都有一个接收视口的构造函数(我的游戏是可扩展的),我想将每个阶段的视口设置为与构造函数分开,然后在视口设置,添加演员。在主要课程中,它会发生如下:
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();
}
然而,所有这些都让我看起来是黑屏...我尝试更新相机和视口,但没有用(注意演员正在调用他们的渲染方法)。
为什么我会看到这个黑屏,我该如何解决?如果不可能,我将恢复使用构造函数。
答案 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。我设置了这样的位置,而不是居中,因为我的一些阶段会比屏幕大。