вернуться на beanet.ru вернуться к списку проектов вернуться на главную страницу сборника

Тема: Переход с одной карты на другую (и обратно)


Ключевые слова: переход между уровнями картами transition landmark changelevel

См. также:
Список используемых понятий, сокращений и обозначений

перейти к общему списку

Состыковка двух карт выполняется достаточно просто, однако даже на developer.valvesoftware.com соответствующая тема мало освещена. Приводимый далее метод учитывает все известные тонкости построения переходов между картами.



Для лучшего понимания метода определим роли энтити, необходимых для построения перехода:
  • trigger_transition - область, которая переносит на другую карту все энтити, оказавшиеся внутри нее на момент перехода
  • info_landmark - точка, относительно которой вычисляется положение игрока и всех энтити внутри trigger_transition на каждой из двух карт (условное начало координат)
  • trigger_changelevel - триггер, при касании которого игроком начинается переход на другую карту (загрузка)
Сначала необходимо нарисовать схему перехода, в которую входят: начало условной системы координат (энтити info_landmark), направление движения игрока для перехода с <карты 1> на <карту 2>, места расположения энтити trigger_changelevel для обеих карт, а также область, все энтити внутри которой перейдут в новую карту.
Схема перехода представляет собой общий участок геометрии для двух карт (общие браши), на который нанесены ключевые для перехода детали этих карт.


Пример
Фрагмент местности взят исключительно для наглядности. На деле рекомендуется скрывать (маскировать) от игрока геометрический конец карты (границу уровня). В противном случае будет видно, что до перехода игрок упирался в "стенку", которая исчезла после загрузки.

Схема перехода
здесь: 1 - путь игрока, переходящего из <карты 1> в <карту 2>
2 - начало условной системы координат (info_landmark)
3 - энтити trigger_changelevel, которая расположена на <карте 2> (вызывает загрузку <карты 1>)
4 - энтити trigger_changelevel, которая расположена на <карте 1> (вызывает загрузку <карты 2>)
5 - область, внутри которой все энтити переносятся на другую карту вместе с игроком (должна охватывать пространство, видимое игроком, чтобы энтити, которые видит игрок, не пропадали при переходе)

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

Рисуется схема перехода в том же порядке, в котором расставлены красные цифры.
Сначала на рисунок местности наносится путь игрока (1), который ведет из <карты 1> в <карту 2> (примерно посередине этого пути кончается одна карта и начинается другая). Затем в пределах видимости игрока располагается энтити info_landmark (2). Далее рисуются энтити trigger_changelevel (брашевые) по принципу "ближе к началу пути энтити из <карты 2>, ближе к концу пути энтити из <карты 1>" (3, 4). Последней определяется область, которая видна игроку, и обрисовывается в виде прямоугольника - брашевой энтити trigger_transition (5).

Теперь разбиваем схему перехода на две части, причем все элементы, кроме энтити trigger_changelevel, дублируются.


Пример (продолжение предыдущего)
Красные стрелки показывают движение игрока, переходящего с одной карты на другую (отсутствуют на реальной карте).
Синим цветом показано, где располагались соответствующие энтити trigger_changelevel на схеме перехода (отсутствуют на реальной карте).
Для ясности показана связь между картами (двусторонней стрелкой).

Разбивка схемы перехода на 2 части

Теперь уже понятно, как следует располагать на картах необходимые энтити. В результате игрок, перейдя на другую карту, оставит уже позади себя trigger_changelevel, ведущий назад (на предыдущую карту).
Учтите, что игрок появится на следующей карте в той же точке относительно info_landmark, в которой относительно info_landmark на текущей карте начался переход (загрузка)


Необходимые условия правильного двустороннего перехода между картами:

  • на обеих картах должны быть энтити info_landmark с одинаковыми именами (параметр Name), расположенные в пределах видимости игрока
  • энтити trigger_changelevel обязательно должны быть на обеих картах, иначе переход не состоится (движок не находит связи между картами)
  • минимальное расстояние между энтити trigger_changelevel в системе координат относительно info_landmark (или на схеме перехода) должно быть немного больше размеров игрока; в противном случае произойдет зацикливание перехода (бесконечная загрузка) либо возвращение игрока в предыдущую карту
  • естественно, энтити trigger_changelevel не должны накладываться друг на друга в системе координат относительно info_landmark (или на схеме перехода); последствия будут аналогичными
  • атрибут New Map Name энтити trigger_changelevel на <карте 1> содержит имя файла <карты 2> без расширения .bsp; атрибут New Map Name энтити trigger_changelevel на <карте 2> содержит имя файла <карты 1> без расширения .bsp
  • атрибут Landmark Name энтити trigger_changelevel на каждой карте содержит имя энтити info_landmark (одинаковое для обеих карт)
  • trigger_transition обязательно должен присутствовать, так как в противном случае переносятся все энтити на карте
  • атрибут Name энтити trigger_transition на каждой карте имеет то же самое имя, что и энтити info_landmark (одинаковое для обеих карт), в противном случае повторится ситуация из предыдущего пункта
  • все необходимые энтити на обеих картах должны быть ориентированы в одном направлении
  • самое главное - обе карты должны быть откомпилированы*.bsp-файлы); в противном случае игроку будет попросту некуда переходить


Другой пример перехода

Другой пример перехода между картами

Обратите внимание на то, что энтити trigger_changelevel расположены с отступом от угла браша (1), чтобы игрок, перейдя на другую карту, ни при каких условиях не коснулся сразу же trigger_changelevel, ведущего назад.
Это более приемлемый случай, хотя и тут рекомендуется отодвинуть энтити trigger_changelevel от угла браша (1), чтобы до загрузки следующей карты игрок не видел местности за поворотом.


Рассмотренный способ дает работающий в обоих направлениях переход между двумя картами.
Для построения одностороннего перехода отключите trigger_changelevel на второй карте (атрибут Start Disabled установить в Yes); в этом (и только в этом) случае данные энтити могут перекрываться. Альтернативный вариант - расположить trigger_changelevel в недоступном для игрока месте.


Если Вы построили переход с <карты 1> на <карту 2>, и теперь нужно построить, в свою очередь, переход с <карты 2> на <карту 3>, на время представьте, что:

<карта 2> соответствует <карте 1>
<карта 3> соответствует <карте 2>

Затем повторите аналогичные действия для построения перехода, однако имена (атрибуты Name) энтити, участвующих в переходах 1-2 и 2-3, не должны совпадать.



Статьи (рус):
Статьи (eng):

перейти к общему списку

Номер статьи: 14

Сборник полезной информации по созданию модификаций на движке Valve Source Engine (игры Half-Life 2, Episode One, Episode Two)