2014-06-15 44 views
2

爲了組織的緣故,我爲我的遊戲使用了多個場景,而不是讓每個場景都有一個接收視口的構造函數(我的遊戲是可縮放的),我想將每個階段的視口分別設置爲構造函數,然後在設置視口後添加演員。在主類,它會發生這樣的:LibGDX - Stage.setViewport(new 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
@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(); 
    } 

這工作,但你也應該能夠在開始你的應用程序的更新視口一樣,如果你繼續使用相同的一個。我設置了這樣的位置,而不是居中,因爲我的一些階段會比屏幕大。

3

如果我理解正確,您想這樣做:

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

,而不是這樣的:

​​

在第一種情況下(你正在做什麼),一個ScalingViewport將自動costructed爲您提供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); 

像這樣你可以改變舞臺視口並重新初始化你的資產。

+0

這或多或少是我所做的,除了我在我的舞臺上覆蓋了setViewport方法(我曾在一個從舞臺延伸出來的類中做過一次,然後我所有的狀態都擴展了這個類)。如果您創建自己的視口,則只需要調用一次更新。 – StrongJoshua