【问题标题】:LibGDX - Does modifying a Group affects children?LibGDX - 修改组会影响孩子吗?
【发布时间】:2013-05-04 23:54:02
【问题描述】:

我想知道当他们的父母Group被修改时,是否有办法影响Actors孩子?就像他们依附他一样。通过修改我的意思是做一些传统的动作,比如平移、旋转、缩放......

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

例如,如果我将TranslationAction 添加到我的Group 中,我希望它也能影响儿童。

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

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

【问题讨论】:

  • 我想您需要为您的示例覆盖 addAction 方法。据我所知,没有将action 添加到所有group 的功能。也许这是一个很好的提及添加到系统?!

标签: java libgdx 2d actor


【解决方案1】:

您的问题的答案是肯定的和否定的。这是因为 Scene2d API 是围绕使用 SpriteBatch 设计的,它设置了父演员和子演员之间的各种转换信息。

如果您正在使用 SpriteBatch(即绘制纹理等),则应用到父级的操作也会影响子级。如果我没记错的话,有些演员有几个例外,但我认为这与颜色等有关。

如果您使用 SpriteBatch(即直接使用 OpenGL 绘制几何图形,或在 Scene2d API 提供的功能之外的自定义绘制动作(例如网格)),则不太可能没有动作去影响孩子。您必须编写自己的代码来通过继承 Scene2d 或为自己创建一些简单的东西来做到这一点。我知道这不是有史以来最好的事情,但 'Libgdx 试图不是“结束一切,成为一切”的解决方案'。

转换工作方式的“魔力”位于组 (link to source)。 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 的解释。

【讨论】:

  • 感谢您在适当的时候提供的答案,因为我刚刚在 Group 上测试了一些 Action 与只绘制精灵的演员,是的,翻译确实会影响所有孩子。除了像你说的Color 这样的属性,我想知道为什么。我在测试之前问了这个问题,因为我查看了源代码并且不明白 drawChildren() 方法为此使用了矩阵。
猜你喜欢
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多