java - 覆盖绘图顺序 scene2D 的舞台

标签 java libgdx scene2d scenegraph

您在 libgdx 中得到了一个复杂的 Scene2D 图,其中包含多个 Group'sActor's。您希望用户选择一些 Actor 并在最后绘制它们,以便它们看起来集中在任何其他 Actor 之上。

我想遍历 Stage 两次。第一次绘制未选中的 Actor,第二次绘制选中的 actors。然而,我没有看到任何“好”的方式来强制执行此行为。

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

什么不起作用:

  • Actor 的 toFront() 方法仅适用于它的 sibling 。
  • 在舞台中交换Actor 的位置:这会修改Actor 的转换。

要考虑的场景:您有一个 Root,其中有一个组 gA 和一个组 gBGroup gA 包含两个图像 iA1iA2Group gB 包含一个图像 iB。假定 Group gA 首先添加到舞台,并且图像 iA1iB 重叠;现在您要选择 iA1 并使其显示在 iB 上。我不想只调用 gA.toFront();这会将整个 Group gA 放在前面,这意味着 iA2 也放在前面。将 iA2 放在前面会产生将部分图像隐藏在 Group gB

中的不良效果

enter image description here

最佳答案

有两种解决方案-

1 - 停止使用 [多个] 组。糟透了,但这可能是更简单的选择。如果您查看渲染/绘图的完成方式,您会从舞台的根组开始,获取其子级并渲染它们。对于这些子项中的每一个,如果它们是一个组,则渲染该组的子项。 ZIndex 只不过是组内子项的顺序。如果您查看 Actor 的 setZIndex,您就会明白为什么 toFrontsetZIndex 只影响 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/

相关文章:

java - 使用java从临时tomcat文件夹复制文件

java - Runtime.getRuntime().availableProcessors()

java - 自新更新以来从 libgdx 加载场景重叠 2d

java - libgdx 的模型纹理错误

java - libGDX 对 SpriteBatch 中的默认顶点着色器抛出错误

java - 让它漂亮 : processing an array concurrently

java - Maven 没有运行集成测试方法

java - 默认皮肤 LibGDX?

java - 使用 Click Listener : no response? 检测对 actor 的点击

java - LibGDX 初始化 Drawable