Глубина сортировки объектов в изометрической игре
У меня есть игровой движок с изометрической плиткой (стиль алмазной карты), и мне нужно сортировать объекты, которые я рисую. Мои объекты 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);
}
}