8

给你一个复杂的Scene2D图表,libgdx其中有几个Group'sActor's。您希望用户选择一些Actors并在最后绘制它们,以便它们看起来集中在任何其他Actors.

我想迭代Stage两次。第一次绘制未选中Actors的,第二次绘制选中的actors。但是,我看不到任何强制执行此行为的“好”方法。

我更喜欢干净的选项。我不想仅仅为了这个小小的添加而复制整个方法实现。

什么不起作用:

  • ( Actor's toFront) 方法只适用于它的兄弟姐妹。
  • 交换Actor's舞台中的位置:这会修改所Actors具有的变换。

需要考虑的场景:你有Root一个组gA和一个组gBGroup gA包含两个图像iA1iA2Group gB包含一个图像iB。假设首先将Group gA添加到阶段,并且图像iA1iB重叠;现在您要选择iA1并使其出现在iB上。我不想只打电话gA.toFront();这会将整个Group gA放在前面,这意味着iA2也放在前面。放iA2前面有将部分图像隐藏在Group gB内的不良影响

在此处输入图像描述

4

2 回答 2

1

有两种解决方案-

1 - 停止使用 [多个] 组。糟透了,但这可能是更容易的选择。如果您查看渲染/绘图是如何完成的,您将从舞台的根组开始,并获取其子级并渲染它们。对于这些孩子中的每一个,如果它们是一个组,则呈现该组的孩子。ZIndex 只不过是一个组内的孩子的顺序。如果您查看 Actor 的setZIndex,您可以了解原因toFrontsetZIndex仅影响兄弟姐妹。

public void setZIndex (int index) {
    if (index < 0) 
        throw new IllegalArgumentException("ZIndex cannot be < 0.");

    Group parent = this.parent;
    if (parent == null) 
        return;

    Array<Actor> children = parent.getChildren();
    if (children.size == 1) 
        return;

    if (!children.removeValue(this, true)) 
        return;

    if (index >= children.size)
        children.add(this);
    else
        children.insert(index, this);
}

2 - 唯一的其他选择是更改所有演员的绘制顺序。您必须根据您选择的不同顺序扩展Stage和替换该draw方法。draw您可能必须从该Group.drawChildren方法中合并很多功能。

TLDR;在LibGDX中实现事物的方式——一个组是一个层。如果您不想要图层,请更改组的功能或停止使用组。

于 2014-03-11T16:11:37.580 回答
0

draw您可以通过覆盖父级来解决此问题:

Group parent = new Group() {
    // Do not render the child as we will render it later
    @Override
    protected void drawChildren(Batch batch, float parentAlpha) {
        child.setVisible(false);
        super.drawChildren(batch, parentAlpha);
        child.setVisible(true);
    }

    // Render the child after the draw method so it's always on top
    @Override
    public void draw(Batch batch, float parentAlpha) {
        super.draw(batch, parentAlpha);
        child.draw(batch, parentAlpha);
    }
};

Group child = new Group();
parent.addActor(child);
于 2018-10-30T03:41:14.087 回答