您在 libgdx
中得到了一个复杂的 Scene2D
图,其中包含多个 Group's
和 Actor's
。您希望用户选择一些 Actor
并在最后绘制它们,以便它们看起来集中在任何其他 Actor
之上。
我想遍历 Stage
两次。第一次绘制未选中的 Actor
,第二次绘制选中的 actors
。然而,我没有看到任何“好”的方式来强制执行此行为。
我更喜欢干净的选项。我不想为了这个小的添加而复制整个方法实现。
什么不起作用:
Actor 的
toFront
() 方法仅适用于它的 sibling 。- 在舞台中交换
Actor
的位置:这会修改Actor
的转换。
要考虑的场景:您有一个 Root
,其中有一个组 gA 和一个组 gB。 Group
gA 包含两个图像 iA1 和 iA2。 Group
gB 包含一个图像 iB。假定 Group
gA 首先添加到舞台,并且图像 iA1 与 iB 重叠;现在您要选择 iA1 并使其显示在 iB 上。我不想只调用 gA.toFront();这会将整个 Group
gA 放在前面,这意味着 iA2 也放在前面。将 iA2 放在前面会产生将部分图像隐藏在 Group
gB
最佳答案
有两种解决方案-
1 - 停止使用 [多个] 组。糟透了,但这可能是更简单的选择。如果您查看渲染/绘图的完成方式,您会从舞台的根组开始,获取其子级并渲染它们。对于这些子项中的每一个,如果它们是一个组,则渲染该组的子项。 ZIndex 只不过是组内子项的顺序。如果您查看 Actor 的 setZIndex
,您就会明白为什么 toFront
或 setZIndex
只影响 sibling 。
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 - 唯一的选择是更改所有 Actor 的绘制顺序。您必须扩展 Stage
并根据您选择的不同顺序将 draw
方法替换为 draw
。您可能需要合并 Group.drawChildren
方法中的许多功能。
TLDR; LibGDX 中的实现方式 - 一个组就是一个层。如果您不想要图层,则要么更改组的功能,要么停止使用组。
关于java - 覆盖绘图顺序 scene2D 的舞台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21839302/