我正在学习libgdx的用法,我对视图和对象在屏幕上的排列方式感到困惑。让我们假设我的2D世界是2x2单位宽和高。现在我创建了一个视口为1x1的相机。所以我应该能看到我世界的25%。显示器通常不是方形的。所以我预计libgdx会挤压和拉伸这个正方形以适应显示。
对于侧滚轴,您可以将视口高度设置为与世界高度相同,并根据纵横比调整视口宽度。与显示器的纵横比无关,您总是可以看到整个世界的高度,但在x轴上的扩展不同。显示器宽度大于高度的人可以比方形显示器的人在x轴上看得更远。但比例将保持不变,不会出现失真。到目前为止,我认为我已经掌握了视口逻辑的工作原理。
我正在写一本书“学习LibGDX游戏开发”,在这本书中,你开发了游戏“峡谷兔”。源代码可以在这里找到:
在WorldRenderer类中,您可以找到摄像机的初始化:
private void init() {
batch = new SpriteBatch();
camera = new OrthographicCamera(Constants.VIEWPORT_WIDTH, Constants.VIEWPORT_HEIGHT);
camera.position.set(0, 0, 0);
camera.update();
}视口常量保存在单独的constants -Class中:
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),即使在桌面上,当你改变窗口大小时,游戏也会保持正确的比例。我不明白为什么。我希望这个游戏尝试在一个长方形的显示器上绘制一个方形的世界,这会导致扭曲。为何不是这样呢?为什么不需要调整视口的宽度或高度以适应纵横比?
发布于 2020-03-23 23:31:40
这行代码:
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()。
发布于 2020-03-24 23:35:06
我找到原因了。如果您查看一下worldRenderer类,就会发现有一个resize()方法。在此方法中,视口根据纵横比进行调整。我只是想知道,因为到目前为止,我认为resize方法只在调整窗口大小时调用。显然,它在启动时也被称为。有谁能澄清一下吗?
https://stackoverflow.com/questions/60813275
复制相似问题