2017-03-20 18 views
0

我的目标是创建一个总是以9:16(基本上是16:9,但是直立)的纵横比显示的游戏,使用FitViewport;它应该独立于目标设备的分辨率。为了测试这个设置,我创建了下面的最小工作示例。绿色的小正方形指示的坐标系的原点:libGDX:FitViewport中对象的大小变形

MyGame.java

public class MyGame extends ApplicationAdapter { 

    final int WORLD_WIDTH = 900; 
    final int WORLD_HEIGHT = 1600; 
    Stage stage; 
    Viewport vp;   

    public void create() { 
     stage = new Stage(); 
     vp = new FitViewport(WORLD_WIDTH, WORLD_HEIGHT, stage.getCamera()); 
     stage.setViewport(vp); 
     stage.addActor(new MySquare()); 
    } 

    public void render() { 
     stage.act(); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     stage.draw(); 
    } 

    public void resize(int width, int height) { 
     stage.getViewport().update(width, height, true); 
    } 

    // dispose... 
} 

public class MySquare extends Actor { 
    ShapeRenderer renderer = new ShapeRenderer(); 
    @Override 
    public void draw(Batch batch, float alpha){ 
     batch.end(); 
     renderer.begin(ShapeRenderer.ShapeType.Filled); 
     renderer.setColor(Color.GREEN); 
     renderer.rect(0, 0, 50, 50); 
     renderer.end(); 
     batch.begin(); 
    } 
} 

不幸的是,并不如预期MySquare.java结果:由于你可以看到,绿色的广场实际上不是一个正方形。此行为是为Windows和Android两个相同的(在横向模式下):

enter image description here

然而,通过LwjglApplicationConfigurationDesktopLauncher.java编程,并明确设置窗口的大小,以有效解决9:16时,绿色方块显示正确。为什么是这样,我怎么能避免这种解决方法(这对Android不起作用)?

回答

2

你的问题是你的形状渲染器忽略了相机。更新这样的:

public void draw(Batch batch, float alpha){ 
    batch.end(); 
    renderer.setProjectionMatrix(batch.getProjectionMatrix()); // <<<<< Add this 
    renderer.begin(ShapeRenderer.ShapeType.Filled); 
    renderer.setColor(Color.GREEN); 
    renderer.rect(0, 0, 50, 50); 
    renderer.end(); 
    batch.begin(); 
} 

如果计划最终使用精灵,而你只是想矩形占位符为你的角色,你不需要为这个定制的演员。您可以使用通用Actor并在其上调用setDebug(true),Stage将使用内部ShapeRenderer自动绘制轮廓。当然,你必须先在演员上设置一个大小和位置。

+0

谢谢。不幸的是,'Batch'似乎没有一个叫做getCamera的方法。另一方面''ViewPort'确实。猜猜我必须从外面传递它? – ceran

+1

哦,我的意思是getStage()。getCamera()。合并,甚至只是使用batch.getProjectionMatrix() – Tenfour04