你的问题的答案是肯定的和否定的。这是因为 Scene2d API 是围绕使用SpriteBatch设计的,它设置了父子角色之间的各种转换信息。
如果您正在使用 SpriteBatch(即绘制纹理等),那么应用于父级的操作也会影响子级。如果我没记错的话,有些演员有几个例外,但我认为这与颜色等有关。
如果您不使用 SpriteBatch(即直接使用 OpenGL 绘制几何图形,或者在 Scene2d API 提供的功能之外的自定义绘制动作(例如网格)),那么任何动作都不会影响子级。您必须编写自己的代码来通过继承 Scene2d 或为自己创建一些简单的东西来做到这一点。我知道这不是有史以来最好的事情,但'Libgdx 试图不是“结束一切,成为一切”的解决方案'。
转换工作方式的“魔力”位于 Group 中(链接到源代码)。group 类使用一个名为 drawChildren() 的方法来迭代子元素并根据转换后的 SpriteBatch 绘制它们。转换发生在 Group 类的 draw() 方法中。
如果没有一些示例代码,这不是一个真正的答案,我假设您知道如何设置皮肤。下面程序的最终结果是 Group 按钮位于 50,100,Hello 按钮位于 100,50。请注意,我没有对“组”按钮进行任何直接更改,而是将其放在一个组中并翻译了整个组。
public class Groups implements ApplicationListener {
private Stage stage;
private Skin uiSkin;
@Override public void create() {
this.stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
Gdx.input.setInputProcessor(this.stage);
this.uiSkin = new Skin(Gdx.files.internal("skin/uiskin.json"));
final TextButton plainTextButton = new TextButton("Hello", this.uiSkin);
this.stage.addActor(plainTextButton);
final Group group = new Group();
final TextButton groupTextButton = new TextButton("Group", this.uiSkin);
group.addActor(groupTextButton);
this.stage.addActor(group);
plainTextButton.addAction(Actions.moveBy(100, 50));
group.addAction(Actions.moveBy(50, 100));
Gdx.gl20.glClearColor(0f, 0f, 0f, 1);
Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
}
@Override public void render() {
this.stage.act();
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
this.stage.draw();
}
@Override public void dispose() {}
@Override public void resize(final int width, final int height) {}
@Override public void pause() {}
@Override public void resume() {}
}
希望这可以为您提供有关 Scene2d 的足够信息和一些解释。