2015-05-18 36 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 –