我的目标是使用FitViewport
创建一个总是以9:16(基本上是16:9,但直立)的宽高比显示的游戏;它应该与目标设备的分辨率无关。为了测试这个设置,我创建了以下最小的工作示例。一个小的绿色方块表示坐标系的原点:
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...
}
MySquare.java
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();
}
}
不幸的是,结果并不像预期的那样:正如您所看到的,绿色方块实际上不是正方形。对于Windows和Android,这种行为都是相同的(在横向模式下):
但,当通过LwjglApplicationConfiguration
中的DesktopLauncher.java
以编程方式明确设置窗口大小为有效的9:16分辨率时,绿色方块会正确显示。为什么这样,我怎么能避免这种解决方法(这对Android无效)?
答案 0 :(得分: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自动绘制其轮廓。当然,您必须先在Actor上设置大小和位置。