我想知道当他们的父Actors
被修改时,是否有办法影响Group
个孩子?就像他们附上一样。通过修改我的意思是做一些传统的操作,如翻译,旋转,缩放......
我知道父alpha可以通过draw()
方法影响孩子的alpha,但其他属性呢?
例如,如果我向TranslationAction
添加Group
,我希望它也会影响孩子。
所以我在 Scene2d API中错过了类似的内容,或者我真的需要自己编写代码(不是很难,但只是想尽可能避免)?
如果使用实际API无法实现,那么使用Group
的目的是什么?
答案 0 :(得分:4)
你的问题的答案是肯定的,不是。这是因为Scene2d API是围绕使用SpriteBatch设计的,link to source在父级和子级actor之间设置各种转换信息。
如果您正在使用SpriteBatch(即绘制纹理等),那么应用于父级的yes操作也会影响子项。如果我没记错的话,对于一些演员有一些例外,但我认为这只与Color等事情有关。
如果您不使用SpriteBatch(即直接使用OpenGL绘制几何图形,或者在Scene2d API提供的内部之外自定义绘图操作(如网格)),则不可能执行任何操作影响孩子。您必须编写自己的代码才能通过继承Scene2d或为自己创建简单的东西来完成此操作。我知道这不是最好的事情,但是'Libgdx不会成为“终极所有,全部是”解决方案“。
变换工作方式的“魔力”位于组({{3}})中。组类使用一个名为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的足够信息和一些解释。