LibGDX - 修改组会影响孩子吗?

时间:2013-05-04 23:54:03

标签: java libgdx 2d actor

我想知道当他们的父Actors被修改时,是否有办法影响Group个孩子?就像他们附上一样。通过修改我的意思是做一些传统的操作,如翻译,旋转,缩放......

我知道父alpha可以通过draw()方法影响孩子的alpha,但其他属性呢?

例如,如果我向TranslationAction添加Group,我希望它也会影响孩子。

所以我在 Scene2d API中错过了类似的内容,或者我真的需要自己编写代码(不是很难,但只是想尽可能避免)?

如果使用实际API无法实现,那么使用Group的目的是什么?

1 个答案:

答案 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的足够信息和一些解释。