视口在libgdx中是如何工作的,以及如何正确设置它



我正在学习libgdx的使用,我被视口和对象在屏幕上的排列方式弄糊涂了。让我们假设我的2D世界是2x2个单位宽和高。现在我创建了一个视口为1x1的相机。所以我应该看到我的世界的25%。通常显示器不是正方形的。因此,我希望libgdx能够挤压并拉伸这个正方形以适应显示器。

对于侧滚动条,您可以将视口高度设置为与世界高度相同,并根据纵横比调整视口宽度。与显示器的纵横比无关,您总是可以看到世界的全高,但在x轴上有不同的展开。具有比高宽的显示器的人可以比具有正方形显示器的人在x轴上看得更远。但比例将保持不变,不会出现扭曲。到目前为止,我认为我已经掌握了视口逻辑的工作原理。

我正在写一本书"学习LibGDX游戏开发",在书中你开发了游戏"峡谷兔子"。源代码可以在这里找到:

Canyon Bunny-GitHub

在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()

我找到了原因。如果你看一下worldRenderer类,有一个方法resize((。在这种方法中,视口适用于纵横比。我只是想知道,因为直到现在我还认为调整大小方法只在调整窗口大小时调用。显然,它在启动时也被调用。有人能澄清吗?

最新更新