8

とがいくつかある複雑なScene2Dグラフが与えられます。ユーザーにいくつかを選択して最後に描画してもらい、他の.libgdxGroup'sActor'sActorsActors

Stage2回繰り返したいと思います。最初に unselected を描画しActors、2 回目に selected を描画しactorsます。ただし、この動作を強制する「良い」方法はありません。

私はきれいなオプションを好むでしょう。この小さな追加のためだけに、メソッドの実装全体をコピーしたくありません。

機能しないもの:

  • () メソッドは、Actor's toFrontその兄弟に対してのみ機能します。
  • ステージ内の場所の交換Actor's: これにより、持っている変換が変更されActorsます。

考えるべきシナリオ:RootグループgAとグループgBを持つ があります。Group gAには 2 つのイメージiA1iA2が含まれています。Group gBには 1 つのイメージiBが含まれます。Group gAが最初にステージに追加され、そのイメージiA1がiBとオーバーラップするとします。ここで、 iA1を選択してiBの上に表示します。gA.toFront()だけを呼び出したくありません。これにより、gA全体が前面に配置されます。つまり、 iA2も前面に配置されます。iA2を入れるGroup in front には、イメージの一部をgB内に隠すという望ましくない効果があります。Group

ここに画像の説明を入力

4

2 に答える 2

1

2つの解決策があります-

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);
}

2 - 他の唯一のオプションは、すべてのアクターの描画順序を変更することです。選択した別の順序に基づいて、メソッドを拡張Stageして置き換える必要があります。おそらく、メソッドから多くの機能を組み込む必要があります。drawdrawGroup.drawChildren

TLDR; LibGDXでの実装方法- グループはレイヤーです。レイヤーが必要ない場合は、グループの機能を変更するか、グループの使用を停止してください。

于 2014-03-11T16:11:37.580 に答える