0

DirectX では、D3DXSPRITE パラメータを両方の組み合わせに設定できます。

D3DXSPRITE_SORT_DEPTH_BACKTOFRONT

D3DXSPRITE_SORT_TEXTURE

つまり、スプライトは最初にレイヤーの深さでソートされ、次にスプライトが存在するテクスチャでソートされます。XNAで同じことをしようとしていますが、いくつか問題があります。私はもう試した:

SpriteBtch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.BackToFront & SpriteSortMode.Texture, SaveStateMode.None);

しかし、それは機能せず、テクスチャのレイヤーの深さを無視して、テクスチャの順序でそれらを実行しているようです。私は何か間違ったことをしていますか!? それとも不可能ですか?

4

2 に答える 2

1

可能な解決策:

描画するスプライトを表す新しいオブジェクトを定義します

class Sprite
{
    public float Priority { get; set; }      // [0..1]
    public String TextureName { get; set; }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(TextureName, ..., Priority); // here Priority is useless because of the sort mode.
    }
}

次に、「描画するスプライト」リストを追加します。

  1. 描画優先度で並べ替え、逆順なので優先度 == 1 が最初
  2. a.Priority == b.Priority の場合はテクスチャでソート (これは難しい部分ですが、それほど難しいことではありません)

たとえば、 Main クラスでは、次のようになります。

private List<Sprite> spritesToDrawThisTick = new List<Sprite>();

そしてすべてのティック、あなた:

  1. スプライトを追加して描画する
  2. 並べ替えロジックを実行する
  3. SpriteSortMode.Immediate を使用して SpriteBatch.Begin を呼び出します
  4. リストで foreach を実行して、すべてのスプライトの Draw メソッドを呼び出します
  5. 重要: spritesToDrawThisTick リストを空にする
于 2009-10-01T16:36:30.090 に答える
1

SpriteSortModeは列挙型であり、| を使用して組み合わせる必要があります。オペレーター:

SpriteSortMode.BackToFront | SpriteSortMode.Texture

更新:この記事に記載されているように、シナリオは XNA では不可能です:

深さによるソートとテクスチャによるソートは相互に排他的です

于 2009-10-01T12:23:13.430 に答える