将宽高比保持在 libGDX
Keep the aspect ratio in libGDX
我正在使用 libgdx 为 android 制作游戏,我希望游戏在不同的智能手机屏幕上看起来不错(比例相同),但不是成就。在一个设备上图片看起来很正常,另一个非常小。
我使用了视口和 OrthographicCamera,但没有看到好的结果。也许我做错了什么。
目前我有这段代码(摘录):
public class PlayScreen extends BaseScreen {
private Stage stage;
private FaceActor faceActor64;
private Texture faceTexture64;
private int sw;
private int sh;
public PlayScreen(MainGame game) {
super(game);
faceTexture64 = new Texture("images/all64.png");
}
@Override
public void show() {
sw = Gdx.app.getGraphics().getWidth();
sh = Gdx.app.getGraphics().getHeight();
stage = new Stage(new FitViewport(sw, sh));
faceActor64 = new FaceActor(faceTexture64);
faceActor64.setBounds(150, 150, 64, 64);
stage.addActor(faceActor64);
Gdx.input.setInputProcessor(stage);
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0,0,0,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act(delta);
stage.draw();
}
@Override
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
}
@Override
public void hide() {
stage.dispose();
}
@Override
public void dispose() {
faceTexture64.dispose();
}
}
我使用的是 64px 的图像。
Result in a smartphone of 480x800.
Result in a smartphone of 1080x1920.
知道如何解决吗?
你在那里做的是这个:
对于 720x1280
设备,您将游戏世界的视图设置为 720x1280
,对于 1080x1920
设备,您将其设置为 1080x1920
。您的资产很可能不会改变大小,因此设备拥有的像素越多,它就越能展示您的游戏世界。我总是告诉人们忘记像素,除非他们想要一个像素完美的游戏,如果你不调整你的资产大小,这就是你正在创造的,一个像素完美的游戏世界。
如果您考虑一下,您的游戏甚至不需要了解设备。它只需要知道在 FitViewport
中要渲染多少游戏世界。假设我有一个方块游戏,我的方块大小为 1x1
单位 。如果我想垂直显示 16 个图块,水平显示 9 个图块,我会将 FitViewport
设置为 new FitViewport(9, 16)
。这将填满大多数设备的屏幕,因为它们的纵横比通常为 16:9
.
简短的解释是,只将常量传递给 Viewport 构造函数,而不是实际的屏幕尺寸。选择您要使用的尺寸,视口将拉伸它们以适合实际屏幕。
此外,如果您不想要黑条 ("letterboxing / pillarboxing"),请使用 ExtendViewport 而不是 FitViewport。
我正在使用 libgdx 为 android 制作游戏,我希望游戏在不同的智能手机屏幕上看起来不错(比例相同),但不是成就。在一个设备上图片看起来很正常,另一个非常小。
我使用了视口和 OrthographicCamera,但没有看到好的结果。也许我做错了什么。
目前我有这段代码(摘录):
public class PlayScreen extends BaseScreen {
private Stage stage;
private FaceActor faceActor64;
private Texture faceTexture64;
private int sw;
private int sh;
public PlayScreen(MainGame game) {
super(game);
faceTexture64 = new Texture("images/all64.png");
}
@Override
public void show() {
sw = Gdx.app.getGraphics().getWidth();
sh = Gdx.app.getGraphics().getHeight();
stage = new Stage(new FitViewport(sw, sh));
faceActor64 = new FaceActor(faceTexture64);
faceActor64.setBounds(150, 150, 64, 64);
stage.addActor(faceActor64);
Gdx.input.setInputProcessor(stage);
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0,0,0,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act(delta);
stage.draw();
}
@Override
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
}
@Override
public void hide() {
stage.dispose();
}
@Override
public void dispose() {
faceTexture64.dispose();
}
}
我使用的是 64px 的图像。
Result in a smartphone of 480x800.
Result in a smartphone of 1080x1920.
知道如何解决吗?
你在那里做的是这个:
对于 720x1280
设备,您将游戏世界的视图设置为 720x1280
,对于 1080x1920
设备,您将其设置为 1080x1920
。您的资产很可能不会改变大小,因此设备拥有的像素越多,它就越能展示您的游戏世界。我总是告诉人们忘记像素,除非他们想要一个像素完美的游戏,如果你不调整你的资产大小,这就是你正在创造的,一个像素完美的游戏世界。
如果您考虑一下,您的游戏甚至不需要了解设备。它只需要知道在 FitViewport
中要渲染多少游戏世界。假设我有一个方块游戏,我的方块大小为 1x1
单位 。如果我想垂直显示 16 个图块,水平显示 9 个图块,我会将 FitViewport
设置为 new FitViewport(9, 16)
。这将填满大多数设备的屏幕,因为它们的纵横比通常为 16:9
.
简短的解释是,只将常量传递给 Viewport 构造函数,而不是实际的屏幕尺寸。选择您要使用的尺寸,视口将拉伸它们以适合实际屏幕。
此外,如果您不想要黑条 ("letterboxing / pillarboxing"),请使用 ExtendViewport 而不是 FitViewport。