Глубина сортировки объектов в изометрической игре

У меня есть игровой движок с изометрической плиткой (стиль алмазной карты), и мне нужно сортировать объекты, которые я рисую. Мои объекты 1x1, 2x1, 4x2. Как я могу сделать это на основе этого кода?

for (int osaY = 0; osaY < mapSize; osaY++)
        {
            for (int osaX = 0; osaX < mapSize; osaX++)
            {
                int x = osaX * 32;
                int y = osaY * 32;

                PlaceObject(thisObject, CartToIso(new Vector2(x, y)), new Vector2(osaX, osaY));
            }
        }

1 ответ

Как я решаю сортировки:
1. Создание интерфейса IDisplay и добавление его в каждый класс, который обрабатывает отображение Draw(SpriteBatch batch)
2. Создание DisplayManager у которого есть Add,Remove,Draw методы и столько layers(Список объектов IDisplay), как вы хотите. Лично средний слой - это слой, где я сортирую свои вещи. Таким образом, я могу поместить вещи позади отсортированных объектов и перед отсортированными объектами.
3. В Main класс, который обрабатывает рисунок, вызвать DisplayManager's Draw функция, которая будет проходить через layers(Списки) и IDisplay предметы и назвать Draw функция на каждом предмете.

spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);
DisplayManager.Draw(spriteBatch);
spriteBatch.End();

А затем в DisplayManager:

public static void Draw(SpriteBatch batch){
   for (i = 0; i < bottom.Count; i++)
   {
       bottom[i].Draw(batch);
   }
   //Gets the model from the IDisplay item, and then it's Y position, and orders
   //the sort layer(list) by that.
   sort = sort.OrderBy(o => o.getModel.Position.Y).ToList();
   for (i = 0; i < sort.Count; i++)
   {
       sort[i].Draw(batch);
   }
   for (i = 0; i < top.Count; i++)
   {
       top[i].Draw(batch);
   }
}
Другие вопросы по тегам