Libgdx Box2d 屏幕分辨率
Libgdx Box2d screen resolution
我读过一些其他人如何处理不同的屏幕分辨率,但我仍然很困惑。
如果我有想要使用的高分辨率图像和精灵,我是否应该使用 1080x1920 之类的屏幕,而不是创建一些缩小分辨率屏幕的方法?或者我应该尝试将它压缩到一些中间地面分辨率并根据需要放大和缩小?
还有谁能给我一个很好的例子来说明如何针对不同的分辨率进行缩放?例如,我是否会看到我的播放器精灵和原始屏幕之间的比例(比如宽度和高度的 1/6)以及当分辨率发生变化时我只是尝试保持这个比例?或者有更好的方法吗?
还有一件事我也在使用 Box2d 来处理物理和其他事情,以防万一,因为我已经必须使用每米像素转换来介于两者之间。
您不必创建自己的机制,老实说,由于 Viewports 和 Scene2d Stages,您根本不必关心分辨率。
Viewport 是一种定义,当涉及到因分辨率变化而调整大小时如何处理屏幕 - 如果它应该拉伸?或者也许保持固定?视口有很多种(每一种都是另一种 class,因此您要选择一种视口来创建所选择的对象 class),并且每种视口都有自己的行为。
您可以在此处阅读有关视口的更多信息:
https://github.com/libgdx/libgdx/wiki/Viewports
舞台是一种抽象的呈现 - 让我们想想剧院的舞台和舞台上的演员。舞台只是一个对象 - 一种您在渲染部分绘制的处理程序。演员是你的图像、标签、按钮等
您可以在此处阅读有关 Stage 的更多信息:
您所要做的就是创建一个舞台,您将在其中添加您的演员(按钮、图像、标签...)并将其设置为您的自定义视口。
public GameScreen(Main game)
{
super(game);
viewport = new ExtendViewport(this.screenWidth, this.screenHeight); // viewport definition is ExtendViewport viewport; screenWidth and Height are defined width and height of your screen
stage = new MyStage(); //stage definition is Stage stage;
stage.setViewport(this.viewport);
}
@Override
protected void show()
{
...
stage.addActor( someLabel ); //someLabel definition is Label someLabel; and it is created somewhere before
...
}
@Override
public void render(float delta)
{
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
this.viewport.update(this.screenWidth, this.screenHeight);
this.stage.act();
this.stage.draw();
}
@Override
public void resize(int width, int height)
{
//you need this function to keep screen size updated
this.screenWidth = width;
this.screenHeight = height;
}
现在关于你的精灵的大小 - 如果它是移动应用程序,那么拥有非常非常大的资源并不是很好 - 大多数移动设备的分辨率都很小,所以在你的应用程序中保留大文件并不好 -记住它需要光盘 space.
我读过一些其他人如何处理不同的屏幕分辨率,但我仍然很困惑。
如果我有想要使用的高分辨率图像和精灵,我是否应该使用 1080x1920 之类的屏幕,而不是创建一些缩小分辨率屏幕的方法?或者我应该尝试将它压缩到一些中间地面分辨率并根据需要放大和缩小?
还有谁能给我一个很好的例子来说明如何针对不同的分辨率进行缩放?例如,我是否会看到我的播放器精灵和原始屏幕之间的比例(比如宽度和高度的 1/6)以及当分辨率发生变化时我只是尝试保持这个比例?或者有更好的方法吗?
还有一件事我也在使用 Box2d 来处理物理和其他事情,以防万一,因为我已经必须使用每米像素转换来介于两者之间。
您不必创建自己的机制,老实说,由于 Viewports 和 Scene2d Stages,您根本不必关心分辨率。
Viewport 是一种定义,当涉及到因分辨率变化而调整大小时如何处理屏幕 - 如果它应该拉伸?或者也许保持固定?视口有很多种(每一种都是另一种 class,因此您要选择一种视口来创建所选择的对象 class),并且每种视口都有自己的行为。
您可以在此处阅读有关视口的更多信息:
https://github.com/libgdx/libgdx/wiki/Viewports
舞台是一种抽象的呈现 - 让我们想想剧院的舞台和舞台上的演员。舞台只是一个对象 - 一种您在渲染部分绘制的处理程序。演员是你的图像、标签、按钮等
您可以在此处阅读有关 Stage 的更多信息:
您所要做的就是创建一个舞台,您将在其中添加您的演员(按钮、图像、标签...)并将其设置为您的自定义视口。
public GameScreen(Main game)
{
super(game);
viewport = new ExtendViewport(this.screenWidth, this.screenHeight); // viewport definition is ExtendViewport viewport; screenWidth and Height are defined width and height of your screen
stage = new MyStage(); //stage definition is Stage stage;
stage.setViewport(this.viewport);
}
@Override
protected void show()
{
...
stage.addActor( someLabel ); //someLabel definition is Label someLabel; and it is created somewhere before
...
}
@Override
public void render(float delta)
{
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
this.viewport.update(this.screenWidth, this.screenHeight);
this.stage.act();
this.stage.draw();
}
@Override
public void resize(int width, int height)
{
//you need this function to keep screen size updated
this.screenWidth = width;
this.screenHeight = height;
}
现在关于你的精灵的大小 - 如果它是移动应用程序,那么拥有非常非常大的资源并不是很好 - 大多数移动设备的分辨率都很小,所以在你的应用程序中保留大文件并不好 -记住它需要光盘 space.