Определение двух SpriteSortModes? - PullRequest
0 голосов
/ 01 октября 2009

В DirectX можно установить параметры D3DXSPRITE для комбинации обоих:

D3DXSPRITE_SORT_DEPTH_BACKTOFRONT

и

D3DXSPRITE_SORT_TEXTURE

Это означает, что спрайты сортируются сначала по глубине слоя, а затем по текстуре, на которой они находятся. Я пытаюсь сделать то же самое в XNA, и у меня есть некоторые проблемы. Я пробовал:

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

Но это не работает, и, кажется, делает это в упорядочении текстур, игнорируя глубину слоя текстур. Я делаю что-то неправильно!? Или это даже невозможно?

Ответы [ 2 ]

1 голос
/ 01 октября 2009

Возможное решение:

Определить новый объект, представляющий спрайт для рисования

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.
    }
}

Затем добавьте список "sprites to draw", который вы:

  1. Сортировка по приоритету рисования, в обратном порядке, поэтому приоритет == 1 является первым
  2. Сортировка по текстуре, когда a.Priority == b.Priority (это сложная часть, но не слишком сложная)

Так, например, в вашем основном классе вы будете иметь:

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

И каждый тик, вы:

  1. Добавить спрайты для рисования
  2. У логики сортировки
  3. Вызовите свой SpriteBatch.Begin, используя SpriteSortMode.Immediate
  4. Создайте в своем списке foreach для вызова каждого метода Draw в Sprite
  5. важно: очистить список спрайтов ToDrawThisTick
1 голос
/ 01 октября 2009

SpriteSortMode является перечислением и должно быть объединено с помощью | Оператор:

SpriteSortMode.BackToFront | SpriteSortMode.Texture

Обновление: как В этой статье упоминается, что ваш сценарий невозможен в XNA:

сортировка по глубине и сортировка по текстуры являются взаимоисключающими

...