java-LibGDX-修改组会影响子级吗?

我想知道修改其父组时是否有一种方法可以影响Actor的孩子?就像他们依恋他一样.修改是指执行一些常规操作,例如平移,旋转,缩放…

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

例如,如果我将TranslationAction添加到我的组中,我希望它也影响子级.

那么我是否错过了Scene2d API中的类似内容,还是我真的必须自己编写代码(不是很难,但是如果可能的话,只是想避免)?

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

解决方法:

您问题的答案是是和不是.这是因为Scene2d API是围绕SpriteBatch设计的,它在父级和子级actor之间设置了各种转换信息.

如果您使用SpriteBatch(即绘制纹理等),则对父级应用yes操作也会影响子级.如果我没记错的话,有些演员会有一些例外,但是我认为这只与颜色等有关.

如果您不使用SpriteBatch(即直接使用OpenGL绘制几何图形,或者不在Scene2d API提供的自定义绘制动作(例如网格)上),则没有任何动作不会影响子级.为此,您必须编写自己的代码,方法是将Scene2d子类化或为自己创建一些简单的事情.我知道这不是最好的事情,但“ Libgdx尝试不成为“尽一切所能”解决方案”.

组(link to source)中介绍了如何进行转换的“魔术”.组类使用一种名为drawChildren()的方法来遍历子项,并根据转换后的SpriteBatch绘制子项.转换发生在Group类的draw()方法中.

没有一些示例代码,这不是一个真正的答案,我假设您知道如何设置皮肤.下面该程序的最终结果是“组”按钮为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的一些解释.

上一篇:程序员修神之路--有状态的服务其实可以做更多的事情


下一篇:并发编程模型小结