LibGDX 如何在调整大小后更新 Actor 位置 window?
LibGDX How do I update Actor positions after resizing window?
我试图将工具栏按钮固定在屏幕的右上角,但每当我调整 window 的大小时,按钮都会保持相同的绝对位置(相对于左下角)。
调整大小前:
调整大小后:
这是生成UI按钮的方法(目前只在Screen的构造函数中调用):
private void generateUiToolbar(){
// Toolbar Table
Table table = new Table();
table.setFillParent(true);
table.top();
table.right();
// Menu button
table.row();
Texture myTexture = new Texture(Gdx.files.internal("ui/stamp.png"));
TextureRegion myTextureRegion = new TextureRegion(myTexture);
TextureRegionDrawable myTexRegionDrawable = new TextureRegionDrawable(myTextureRegion);
ImageButton menuButton = new ImageButton(myTexRegionDrawable);
menuButton.addListener( new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
stage.clear();
generateUiMenu();
}
});
table.add(menuButton).size(60,60).padTop(10).padRight(10);
stage.addActor(table);
}
这是 resize() 方法:
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
stage.getCamera().viewportWidth = width;
stage.getCamera().viewportHeight = height;
stage.getCamera().position.set(stage.getCamera().viewportWidth / 2, stage.getCamera().viewportHeight / 2, 0);
stage.getCamera().update();
}
变量阶段在构造函数中启动 stage = new Stage();
出于某种原因 stage.getViewport().update(width, height, true);
没有做任何事情。当我在调整大小后打印 stage.getWidth()
时,它会 return 相同的数字。一般来说,更新按钮或 Actors 位置的好方法是什么?简单地清理舞台并再次生成 UI 对我来说不起作用,因为有时当您调整大小时,当前显示的是不同的演员。如果我遗漏了任何信息,请告诉我。
编辑 1:
如答案中所述添加了 table.setFillParent(true);
,但这也没有解决它。
编辑 2:
阅读答案和评论后,我删除了 stage.getCamera()
操作,但我仍然没有得到正确的结果。这是当我仅使用代码行 stage.getViewport().update(width, height, true);
调整大小时发生的情况:
视口对象是相机平截头体管理器。当您开始修改相机的参数(位置除外)时,您正在撤消通过调用 viewport.update()
.
所做的操作
如果您希望 table 自动填满屏幕以便右上角的内容在调整大小后保留在那里,请不要在 table 上设置宽度和高度。相反,调用 table.setFillParent(true)
以便它自动更新其大小以匹配视口大小。
我觉得你对Viewport的用法有误解。
在您的调整大小方法中,您执行:
stage.getViewport().update(width, height, true);
stage.getCamera().viewportWidth = width;
stage.getCamera().viewportHeight = height;
stage.getCamera().position.set(stage.getCamera().viewportWidth / 2, stage.getCamera().viewportHeight / 2, 0);
stage.getCamera().update();
但是 stage.getViewport().update(width, height, true);
已经做了你在接下来四行中做的事情。
viewport.update(width, height)
为相机设置新的宽度和高度并更新相机。所以:
viewport.update(width, height)
is equal to
camera.viewportWidth = width;
camera.viewportHeight = height;
camera.update();
唯一的区别是视口的外观比例取决于您使用的视口。
第三个参数:stage.getViewport().update(width, height, true);
是一个布尔值,表示相机是否应该居中。因此,如果第三个参数为真,则视口将执行:
camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
在调整大小的方法中,您覆盖了视口的工作,因为使用 viewport.update(width, height, true)
您已经完成了所有调整大小,不需要其他四行。
在调整大小方法中,这就足够了:
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
}
您可以阅读此内容以更好地了解视口:
我试图将工具栏按钮固定在屏幕的右上角,但每当我调整 window 的大小时,按钮都会保持相同的绝对位置(相对于左下角)。
调整大小前:
调整大小后:
这是生成UI按钮的方法(目前只在Screen的构造函数中调用):
private void generateUiToolbar(){
// Toolbar Table
Table table = new Table();
table.setFillParent(true);
table.top();
table.right();
// Menu button
table.row();
Texture myTexture = new Texture(Gdx.files.internal("ui/stamp.png"));
TextureRegion myTextureRegion = new TextureRegion(myTexture);
TextureRegionDrawable myTexRegionDrawable = new TextureRegionDrawable(myTextureRegion);
ImageButton menuButton = new ImageButton(myTexRegionDrawable);
menuButton.addListener( new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
stage.clear();
generateUiMenu();
}
});
table.add(menuButton).size(60,60).padTop(10).padRight(10);
stage.addActor(table);
}
这是 resize() 方法:
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
stage.getCamera().viewportWidth = width;
stage.getCamera().viewportHeight = height;
stage.getCamera().position.set(stage.getCamera().viewportWidth / 2, stage.getCamera().viewportHeight / 2, 0);
stage.getCamera().update();
}
变量阶段在构造函数中启动 stage = new Stage();
出于某种原因 stage.getViewport().update(width, height, true);
没有做任何事情。当我在调整大小后打印 stage.getWidth()
时,它会 return 相同的数字。一般来说,更新按钮或 Actors 位置的好方法是什么?简单地清理舞台并再次生成 UI 对我来说不起作用,因为有时当您调整大小时,当前显示的是不同的演员。如果我遗漏了任何信息,请告诉我。
编辑 1:
如答案中所述添加了 table.setFillParent(true);
,但这也没有解决它。
编辑 2:
阅读答案和评论后,我删除了 stage.getCamera()
操作,但我仍然没有得到正确的结果。这是当我仅使用代码行 stage.getViewport().update(width, height, true);
调整大小时发生的情况:
视口对象是相机平截头体管理器。当您开始修改相机的参数(位置除外)时,您正在撤消通过调用 viewport.update()
.
如果您希望 table 自动填满屏幕以便右上角的内容在调整大小后保留在那里,请不要在 table 上设置宽度和高度。相反,调用 table.setFillParent(true)
以便它自动更新其大小以匹配视口大小。
我觉得你对Viewport的用法有误解。 在您的调整大小方法中,您执行:
stage.getViewport().update(width, height, true);
stage.getCamera().viewportWidth = width;
stage.getCamera().viewportHeight = height;
stage.getCamera().position.set(stage.getCamera().viewportWidth / 2, stage.getCamera().viewportHeight / 2, 0);
stage.getCamera().update();
但是 stage.getViewport().update(width, height, true);
已经做了你在接下来四行中做的事情。
viewport.update(width, height)
为相机设置新的宽度和高度并更新相机。所以:
viewport.update(width, height)
is equal to
camera.viewportWidth = width;
camera.viewportHeight = height;
camera.update();
唯一的区别是视口的外观比例取决于您使用的视口。
第三个参数:stage.getViewport().update(width, height, true);
是一个布尔值,表示相机是否应该居中。因此,如果第三个参数为真,则视口将执行:
camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
在调整大小的方法中,您覆盖了视口的工作,因为使用 viewport.update(width, height, true)
您已经完成了所有调整大小,不需要其他四行。
在调整大小方法中,这就足够了:
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
}
您可以阅读此内容以更好地了解视口: