2015-05-18 32 views
3

2個月前我偶然發現我工作的遊戲沒有與其他設備進行縮放的問題。 所以我決定實現視口,因爲人們說這是最好的方式,也是一個簡單的方法。 但是從我開始到現在已經有2個月了,現在還沒有一個可行的例子。我已經閱讀了我能找到的每一個頁面,多次閱讀wiki並詢問幾個人,但從來沒有得到答案幫助我實現它。Libgdx Viewport舞臺不起作用

所以問題是,我需要做3件事情,首先我有一個舞臺,這是我將我所有的演員放在(按鈕和東西),然後我需要我的凸輪在這種情況下OrthographicCamera,和那麼我需要一個視口來擴展一切。

這是我最新的測試:http://pastebin.com/ZvZmeHLs

我創建

@Override 
    public void create() { 
      cam = new OrthographicCamera(800, 600); 
      viewport = new FillViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), cam); 
      viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true); 
      stage = new Stage(viewport); 

      atlas = new TextureAtlas("LoadingScreen.pack"); 
      Logo = new Image(atlas.findRegion("VeslaLogo")); 
      stage.addActor(Logo); 
    } 

和我的大小調整

@Override 
    public void resize(int Width, int Height) { 
      viewport.update(Width, Height, true); 

      Logo.setSize(700, 500); 
      Logo.setX(Width/2 - Logo.getWidth()/2); 
      Logo.setY(Height/2 - Logo.getHeight()/2); 
      Logo.setOrigin(Logo.getWidth()/2, Logo.getHeight()/2); 
    } 

我首先想到的是它的工作,在Nexus One的它看起來很不錯,在屏幕上顯示了所有內容,但是當我在s4 mini上測試它時,它確實很大。現在我不知道這是因爲我只是不理解視口,或者我想方式太複雜。我唯一知道的是我完全迷失了,不知道我還能嘗試什麼。所以如果有人能夠把我推向正確的方向,或者可以向我解釋爲什麼這種方法不起作用,那將會很棒。

PS:我也有固定的尺寸測試,但這次沒有任何區別出於某種原因,固定大小的一個

樣品:http://pastebin.com/mpjkP9ru

private int VIRTUAL_WIDTH = 600; 
private int VIRTUAL_HEIGHT = 900; 

@Override 
    public void create() { 
      stage = new Stage(new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT)); 
      cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT); 
    } 

和我的大小調整

@Override 
    public void resize(int Width, int Height) { 
      Width = VIRTUAL_WIDTH; 
      Height = VIRTUAL_HEIGHT; 

      stage.getViewport().update(Width, Height, true); 
    } 

如果需要更多的例子或任何東西,請讓我知道,我在一個州,我會嘗試任何事情來讓它工作

編輯:我設法讓它在@donfuxx的幫助下工作。對於那些對代碼感興趣的人:http://pastebin.com/8v2PB2t9

+0

請張貼你的代碼直接在你的問題而不是外部網站上。這也會鼓勵你只發布代碼的相關部分。 – noone

+0

對不起,你完全正確。將編輯它,謝謝 –

回答

4

在你貼的代碼,你似乎做調整大小的方法錯了,因爲你是一個不變(!)值(所以你總是設置寬度/高度600/900,沒有surprize你不更新視「看不到調整到不同的屏幕尺寸):

@Override 
public void resize(int Width, int Height) { 
     Width = VIRTUAL_WIDTH; 
     Height = VIRTUAL_HEIGHT; 

     stage.getViewport().update(Width, Height, true); 
} 

而應該做到像它在該viewports wiki建議,並設置適當的寬度/高度值:

@Override 
public void resize(int width, int height) { 
    // use true here to center the camera 
    // that's what you probably want in case of a UI 
    stage.getViewport().update(width, height, false); 
} 

BTW:還可以得到擺脫那個L ogo調整您的調整大小方法內的代碼!

更新:另外我注意到,你應該更好地初始化你的視口,相機這樣的(使用具有相機參數視構造函數):

cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT); 
viewport = new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, cam); //notice cam param here! 
stage = new Stage(viewport); 

相反的:

stage = new Stage(new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT)); 
cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT); 
+0

偉大的我得到它的工作,直到圖片將始終停留在同一個點上。現在我有一個問題,它看起來像寬度/ 2不是我的屏幕中間,這可能與我設置的虛擬寬度有關嗎? –

+1

關於在你的階段定位UI演員我建議使用[TableLayout](https://github.com/libgdx/libgdx/wiki/Table)。 – donfuxx

+0

謝謝你看看它看起來很有希望。順便說一句,你會介意看看我的代碼,因爲我不認爲它的權利,我的屏幕只佔我的總寬度的45%左右。它可能必須對我的V_Width或凸輪尺寸做些什麼?即使這在我看來似乎不合邏輯。 http://pastebin.com/pzF2YUZW –

0

我個人已經設計了我的應用程序爲1920x1080,只是在小屏幕上縮小一切。我對spritebatch相機:

camera = new OrthographicCamera(screen_width, screen_height); 
batch.setProjectionMatrix(camera.combined); 

確保了每個屏幕精靈被繪製-screen_width之間/ 2.0和SCREEN_WIDTH/2.0(對於相同高度)

使用默認階段構造平之間0每一個演員和SCREEN_WIDTH

stage = new Stage(); 

然後我將比例設置爲:

float global_scale = 1920.0f/screen_height; 
actor.setScale(global_scale); 

顯然還有其他方法可以做到這一點,比如使用視口。

+0

似乎有趣讓我給這個嘗試。有沒有理由你不使用視口?或者從來沒有理由使用它。 –

+0

我從來沒有理由,因爲這種方法適合我。 –

+0

我明白了,即使我能夠得到一份工作副本,我仍然會試試它:http://pastebin.com/3SrWKcEg –