Libgdx 舞台视口不工作
Libgdx Viewport with stage not working
2 个月前,我偶然发现了我正在开发的游戏无法在其他设备上扩展的问题。
所以我决定实施视口,因为人们说这是最好的方法,也是一种简单的方法。
但自从我开始以来已经过去了大约 2 个月,但仍然没有一个有效的例子。我已经阅读了我能找到的每一页,多次阅读 wiki 并询问了几个人,但从来没有得到帮助我让它工作的答案。
所以问题是我需要做 3 件事,首先我有一个舞台,这是我要放置我所有演员的地方(按钮和其他东西),然后我需要我的摄像头,在这种情况下是 OrthographicCamera,然后我需要一个视口来缩放所有内容。
这是我的最新测试:http://pastebin.com/ZvZmeHLs
我的创作
@Override
public void create () {
cam = new OrthographicCamera(800, 600);
viewport = new FillViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), cam);
viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
stage = new Stage(viewport);
atlas = new TextureAtlas("LoadingScreen.pack");
Logo = new Image(atlas.findRegion("VeslaLogo"));
stage.addActor(Logo);
}
和我的调整大小
@Override
public void resize(int Width, int Height) {
viewport.update(Width, Height, true);
Logo.setSize(700, 500);
Logo.setX(Width / 2 - Logo.getWidth() / 2);
Logo.setY(Height / 2 - Logo.getHeight() / 2);
Logo.setOrigin(Logo.getWidth() / 2, Logo.getHeight() / 2);
}
我最初认为它可以正常工作,在 nexus one 上它看起来不错,屏幕上显示了所有内容,但是当我在 s4 mini 上测试它时它太大了。现在我不知道这是因为我不了解视口还是我想的太复杂了。我唯一知道的是我完全迷路了,不知道我还能尝试什么。因此,如果有人可以将我推向正确的方向,或者可以向我解释为什么这不起作用,那就太好了。
ps:我也用固定尺寸测试了它,但由于某种原因这没有任何区别
固定尺寸一的样本:http://pastebin.com/mpjkP9ru
private int VIRTUAL_WIDTH = 600;
private int VIRTUAL_HEIGHT = 900;
@Override
public void create () {
stage = new Stage(new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
}
和我的调整大小
@Override
public void resize(int Width, int Height) {
Width = VIRTUAL_WIDTH;
Height = VIRTUAL_HEIGHT;
stage.getViewport().update(Width, Height, true);
}
如果需要更多示例或任何内容,请告诉我,我正处于一种状态,我会尽一切努力让它工作
编辑:在@donfuxx 的帮助下我设法让它工作。对于那些对代码感兴趣的人:http://pastebin.com/8v2PB2t9
我个人为 1920x1080 设计了我的应用程序,只是将所有内容缩小到较小的屏幕上。我的 spritebatch 相机:
camera = new OrthographicCamera(screen_width, screen_height);
batch.setProjectionMatrix(camera.combined);
确保在每个屏幕上,精灵都绘制在 -screen_width/2.0 和 screen_width/2.0 之间(高度相同)
使用默认舞台构造函数绘制 0 到 screen_width
之间的每个演员
stage = new Stage();
然后我将比例设置为:
float global_scale = 1920.0f/screen_height;
actor.setScale(global_scale);
显然还有其他方法可以做到这一点,比如使用视口。
在您发布的代码中,您似乎执行了错误的调整大小方法,因为您正在使用 constant (!) 值更新视口(因此您总是设置 width/height 到 600/900,毫不奇怪,您看不到针对不同屏幕尺寸的调整):
@Override
public void resize(int Width, int Height) {
Width = VIRTUAL_WIDTH;
Height = VIRTUAL_HEIGHT;
stage.getViewport().update(Width, Height, true);
}
您应该按照 viewports wiki 中的建议进行设置并设置正确的宽度/高度值:
@Override
public void resize(int width, int height) {
// use true here to center the camera
// that's what you probably want in case of a UI
stage.getViewport().update(width, height, false);
}
顺便说一句:还要去掉调整大小方法中的徽标大小代码!
更新:我还注意到您最好像这样初始化视口和相机(使用具有相机参数的视口构造函数):
cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
viewport = new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, cam); //notice cam param here!
stage = new Stage(viewport);
而不是:
stage = new Stage(new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
2 个月前,我偶然发现了我正在开发的游戏无法在其他设备上扩展的问题。 所以我决定实施视口,因为人们说这是最好的方法,也是一种简单的方法。 但自从我开始以来已经过去了大约 2 个月,但仍然没有一个有效的例子。我已经阅读了我能找到的每一页,多次阅读 wiki 并询问了几个人,但从来没有得到帮助我让它工作的答案。
所以问题是我需要做 3 件事,首先我有一个舞台,这是我要放置我所有演员的地方(按钮和其他东西),然后我需要我的摄像头,在这种情况下是 OrthographicCamera,然后我需要一个视口来缩放所有内容。
这是我的最新测试:http://pastebin.com/ZvZmeHLs
我的创作
@Override
public void create () {
cam = new OrthographicCamera(800, 600);
viewport = new FillViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), cam);
viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
stage = new Stage(viewport);
atlas = new TextureAtlas("LoadingScreen.pack");
Logo = new Image(atlas.findRegion("VeslaLogo"));
stage.addActor(Logo);
}
和我的调整大小
@Override
public void resize(int Width, int Height) {
viewport.update(Width, Height, true);
Logo.setSize(700, 500);
Logo.setX(Width / 2 - Logo.getWidth() / 2);
Logo.setY(Height / 2 - Logo.getHeight() / 2);
Logo.setOrigin(Logo.getWidth() / 2, Logo.getHeight() / 2);
}
我最初认为它可以正常工作,在 nexus one 上它看起来不错,屏幕上显示了所有内容,但是当我在 s4 mini 上测试它时它太大了。现在我不知道这是因为我不了解视口还是我想的太复杂了。我唯一知道的是我完全迷路了,不知道我还能尝试什么。因此,如果有人可以将我推向正确的方向,或者可以向我解释为什么这不起作用,那就太好了。
ps:我也用固定尺寸测试了它,但由于某种原因这没有任何区别
固定尺寸一的样本:http://pastebin.com/mpjkP9ru
private int VIRTUAL_WIDTH = 600;
private int VIRTUAL_HEIGHT = 900;
@Override
public void create () {
stage = new Stage(new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
}
和我的调整大小
@Override
public void resize(int Width, int Height) {
Width = VIRTUAL_WIDTH;
Height = VIRTUAL_HEIGHT;
stage.getViewport().update(Width, Height, true);
}
如果需要更多示例或任何内容,请告诉我,我正处于一种状态,我会尽一切努力让它工作
编辑:在@donfuxx 的帮助下我设法让它工作。对于那些对代码感兴趣的人:http://pastebin.com/8v2PB2t9
我个人为 1920x1080 设计了我的应用程序,只是将所有内容缩小到较小的屏幕上。我的 spritebatch 相机:
camera = new OrthographicCamera(screen_width, screen_height);
batch.setProjectionMatrix(camera.combined);
确保在每个屏幕上,精灵都绘制在 -screen_width/2.0 和 screen_width/2.0 之间(高度相同)
使用默认舞台构造函数绘制 0 到 screen_width
之间的每个演员stage = new Stage();
然后我将比例设置为:
float global_scale = 1920.0f/screen_height;
actor.setScale(global_scale);
显然还有其他方法可以做到这一点,比如使用视口。
在您发布的代码中,您似乎执行了错误的调整大小方法,因为您正在使用 constant (!) 值更新视口(因此您总是设置 width/height 到 600/900,毫不奇怪,您看不到针对不同屏幕尺寸的调整):
@Override
public void resize(int Width, int Height) {
Width = VIRTUAL_WIDTH;
Height = VIRTUAL_HEIGHT;
stage.getViewport().update(Width, Height, true);
}
您应该按照 viewports wiki 中的建议进行设置并设置正确的宽度/高度值:
@Override
public void resize(int width, int height) {
// use true here to center the camera
// that's what you probably want in case of a UI
stage.getViewport().update(width, height, false);
}
顺便说一句:还要去掉调整大小方法中的徽标大小代码!
更新:我还注意到您最好像这样初始化视口和相机(使用具有相机参数的视口构造函数):
cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
viewport = new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, cam); //notice cam param here!
stage = new Stage(viewport);
而不是:
stage = new Stage(new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);