Лодка проезжает под мостом в 2D плитке на базе РТС

10

Я пишу 2D-плитку на основе RTS. И я хочу добавить к нему функцию «псевдо 3D» - мосты через реки.

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

Есть ли общий подход к решению такой проблемы? Или мне нужно реализовать 3D мир, чтобы сделать это?

aleguna
источник
хорошо, если вы делаете систему на основе плиток, вы можете добавлять что-то вроде метода isOccupied для каждого раза. Просто сделайте проверку моста ниже себя и выше.
Бенджамин Дэнджер Джонсон
2
если наземные единицы не взаимодействуют с водными единицами, вы можете обрабатывать отдельные столкновения для обоих наборов единиц. И, возможно, рассмотрим, что лодка в гавани - это наземная единица, позволяющая взаимодействовать, как игрок / NPC, входящий в лодку.
GameAlchemist

Ответы:

7

В основном вам придется создать третье измерение, хотя в простейшем случае оно может состоять из двух значений: «на земле / на мосту» и «на воде / под мостом».

Вдохновение можно найти в том, как это выполняет Advanced Strategic Command : подразделения занимают определенный уровень высоты, могут перемещаться только на уровнях высоты, соответствующих их типу, если только нет особых функций, позволяющих им делать иначе (например, ВПП для самолетов) и изменение их обычно стоит очков движения, со штрафами на некоторых уровнях высоты или других. Плитка может быть занята любым количеством юнитов, если каждый находится на разном уровне высоты.

В случае ASC уровни:

  • пространство
  • большая высота (бомбардировка)
  • средняя высота (перехватчики)
  • наземная атака
  • земля (большинство наземных юнитов и судов на воздушной подушке, даже над водой)
  • вода
  • частично погруженный (подводные лодки)
  • подводные («скрытые» подводные лодки)
Мартин Сойка
источник
9

Вы можете добавить простой атрибут к каждой плитке, который определяет ее уровень.

Так, например:

tileA.layer = 0 // Will be at the bottom
tileB.layer = 1 // Will be above level 0, on top of it. 

// Add tiles to layered list
List<List<Tile>> tiles = new List<List<Tile>>();
tiles[0].add(tileA);
tiles[1].add(tileB);

// Draw 'em in the right order!
void Draw(List<List<Tile>> tiles) {
    foreach( var listOfTiles in tiles ) {
        foreach( var tile in listOfTiles ) {
            tile.draw();
        }
}

Теперь вы можете сортировать плитки в зависимости от их значений слоя и рисовать их снизу -> вверху! Это создаст впечатление, что у вас есть определенная глубина в вашей игре. Большинство движков тайлов поддерживают это. Еще одна интересная вещь, которую вы можете добавить, это прозрачность ваших текстур, чтобы вы могли видеть до нижнего слоя.

Это можно сделать, например, с водой - представьте себе воду на уровне 1, а затем дно океана на уровне 0. Если текстура воды несколько прозрачна, вы сможете увидеть дно океана сверху.

Zolomon
источник
@aleguna Не беспокойся! Это просто весело, чтобы помочь. :)
Zolomon