camera - 视口在 libgdx 中如何工作以及如何正确设置它?
问题描述
我正在学习 libgdx 的使用,我对视口以及对象在屏幕上的排列方式感到困惑。假设我的 2D 世界是 2x2 单位宽和高。现在我创建一个视口为 1x1 的相机。所以我应该看到我世界的 25%。通常显示器不是方形的。所以我希望 libgdx 能够挤压和拉伸这个正方形以适应显示器。
对于横向滚动条,您可以将视口高度设置为与世界高度相同,并根据纵横比调整视口宽度。与显示器的纵横比无关,您始终可以看到整个世界的高度,但在 x 轴上有不同的扩展。显示器宽于高的人可以在 x 轴上比方形显示器的人看得更远。但是比例会保持不变,不会失真。到目前为止,我认为我掌握了视口逻辑的工作原理。
我正在使用“Learning LibGDX Game Development”一书,您可以在其中开发游戏“canyon bunny”。源代码可以在这里找到:
在 WorldRenderer 类中,您可以找到相机的初始化:
private void init() {
batch = new SpriteBatch();
camera = new OrthographicCamera(Constants.VIEWPORT_WIDTH, Constants.VIEWPORT_HEIGHT);
camera.position.set(0, 0, 0);
camera.update();
}
视口常量保存在单独的常量类中:
public class Constants {
// Visible game world is 5 meters wide
public static final float VIEWPORT_WIDTH = 5.0f;
// Visible game world is 5 meters tall
public static final float VIEWPORT_HEIGHT = 5.0f;
}
如您所见,视口为 5x5。但是游戏对象在我的手机上具有正确的比例(16:9),即使在桌面上,当您更改窗口大小时,游戏也会保持正确的比例。我不明白为什么。我预计游戏会尝试将世界的方形切口绘制到矩形显示器上,这会导致失真。为什么不是这样?为什么你不需要调整视口的宽度或高度来适应纵横比?
解决方案
该行:
cameraGUI.setToOrtho(true);
覆盖您在调用时提供的值:
cameraGUI = new OrthographicCamera(Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT);
这是 LibGDX 代码,它显示了您设置的视口大小被忽略的原因/方式:
/** Sets this camera to an orthographic projection using a viewport fitting the screen resolution, centered at
* (Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2), with the y-axis pointing up or down.
* @param yDown whether y should be pointing down */
public void setToOrtho (boolean yDown) {
setToOrtho(yDown, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
}
/** Sets this camera to an orthographic projection, centered at (viewportWidth/2, viewportHeight/2), with the y-axis pointing up
* or down.
* @param yDown whether y should be pointing down.
* @param viewportWidth
* @param viewportHeight */
public void setToOrtho (boolean yDown, float viewportWidth, float viewportHeight) {
if (yDown) {
up.set(0, -1, 0);
direction.set(0, 0, 1);
} else {
up.set(0, 1, 0);
direction.set(0, 0, -1);
}
position.set(zoom * viewportWidth / 2.0f, zoom * viewportHeight / 2.0f, 0);
this.viewportWidth = viewportWidth;
this.viewportHeight = viewportHeight;
update();
}
所以你需要这样做:
cameraGUI.setToOrtho(true, Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT);
也不要忘记update()
在您更改相机的位置或视口尺寸(或其他属性)之后立即调用