2016-02-28 71 views
3

在我目前正在開發的LibGDX遊戲中,我遇到了有關視口的問題。我試圖創建兩個視口 - 一個持有整個屏幕,包括控件,另一個持有第一個視圖中的遊戲視覺。 This is what I mean.LibGDX如何使用多個視口/攝像機?

但是,我遇到了使用這些視口的問題。首先,平鋪地圖和在FitViewportapply內呈現的玩家沒有看到(未呈現或不在可見屏幕空間之外),但是我的Rayhandler的光線被看到(並且傳播超過其分配的1:1比)。 Proof

private OrthographicCamera camera;  
Viewport v1; 
Viewport v2; 
//... 
RayHandler devRay; 
//... 
TiledMap map; 
OrthogonalTiledMapRenderer tmr; 
Player player; 

@Override 
public void show() {  
    camera = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT); 
    camera.setToOrtho(false,Gdx.graphics.getWidth(),Gdx.graphics.getHeight()); 
    //... 
    v1 = new ScreenViewport(); 
    v2 = new FitViewport(160, 160, camera); 
    //... 
    tmr = new OrthogonalTiledMapRenderer(map); 
    tmr.setView(camera); 
    RayHandler.useDiffuseLight(true); 
    devRay = new RayHandler(world); 
} 
public void render(float delta) { 

    Gdx.gl.glClearColor(1,1,1,1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    v1.apply(); 
    //Draw Controls 

    v2.apply(); 
    //Draw Visuals 
    tmr.render(); //Tiled Map Renderer 
    player.render(); 
    devRay.updateAndRender(); 
    //... 
} 

我猜測我完全錯過了視口的觀點。我想知道是否有任何方法將我的項目中的可播放區域和控制區域分開,以便例如我可以移動FitViewport的相機,而遊戲視圖不會超過1:1的比例。感謝您的幫助!

回答

1

我通常做的事情是用單臺相機來渲染世界,並通過最後繪製舞臺最後stage.draw()覆蓋hud。舞臺非常棒。顯然,這掩蓋了一些遊戲世界,通常應該可以在沒有hud的情況下看到,所以如果你真的想要多個「視口」,那麼你必須使用Viewports

視口很容易實現併爲您處理所有事情if you pick the correct one。之後,你有安裝攝像頭,你可以創建視這樣的:

camera = new OrthographicCamera(1920/2, 1080); 
    //1920, 1080 for sake of example. This could be anything and it is often 
    // better to not think in pixels but in world units. 

    viewport = new FitViewport(camera.viewportWidth, camera.viewportHeight, camera); 
    viewport.setScreenBounds(0, 0, Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()); 

這將通過使用setScreenBounds(...)創建屏幕的左半視口。由於我們只在屏幕的一半處繪製相機上的東西,所以我們必須匹配縱橫比,否則它會顯得拉長。

爲了澄清,因爲這是有時有點混亂:

float worldWidth, worldHeight; // How much of the world to display 
viewport = new FitViewport(worldWidth, worldHeight, camera); 

int screenPosX, screenPosY, screenWidth, screenHeight; 
// The position of the viewport where 0, 0 is bottom left and 
// Gdx.graphcis.getWidth, Gdx.graphics.getHeight is top right 
viewport.setScreenBounds(screenPosX, screenPosY, screenWidth, screenHeight); 

你其實並不需要指定相機的寬度和高度,因爲正被重寫反正一旦你打vp.apply()與相機連接到副總裁。

update()方法中,在該特定視口上繪製任何內容之前,必須首先應用視口viewport.apply()