覆盖绘制顺序scene2D的阶段

Vje*_*tje 8 java scenegraph libgdx scene2d

你会得到一个带有几个和的复杂Scene2D图形.您希望用户选择一些并在最后绘制它们,以便它们看起来集中在任何其他顶部.libgdxGroup'sActor'sActorsActors

我想迭代Stage两次.第一次绘制未选中的Actors,第二次绘制选中的actors.但是,我没有看到任何"好"的方式来强制执行此行为.

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

什么行不通:

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

想一想的情景:你有Root一个团体gA和一个团体gB.Group gA包含两个图像iA1iA2.Group gB包含一个图像iB.鉴于Group gA首先被添加到阶段并且图像iA1iB重叠; 现在你想选择iA1并让它出现在iB上.我不想只调用gA.toFront() ; 这会将整个Group gA放在前面,这意味着iA2也被放到了前面.将iA2放在前面会产生不希望的影响,即将部分图像隐藏在Group gB中

在此输入图像描述

Cha*_*ase 1

有两种解决方案——

1 - 停止使用[多个]组。很糟糕,但这可能是更简单的选择。如果您查看渲染/绘制是如何完成的,您可以从舞台的根组开始,获取其子级并渲染它们。对于每个子项,如果它们是一个组,则渲染该组的子项。ZIndex只不过是组内子级的顺序。如果你看看演员,setZIndex你就能明白为什么toFront或者setZIndex只影响兄弟姐妹。

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);
}
Run Code Online (Sandbox Code Playgroud)

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

太长了;LibGDX中的实现方式- 组是一个层。如果您不需要图层,则可以更改组的功能或停止使用组。