Смена карт
Ну что ж, решил я вам написать статью по смене
уровней в Half-Life. Эта проблема довольно актуальна,
поэтому читайте внимательно.
Итак
смена уровня состоит в основном из двух ентить,
наличие которых ОБЯЗАТЕЛЬНО !!! Это
trigger_changelevel и
info_landmark.
Trigger_changelevel —
объёмная браш-энтитя или триггер, при попадании в который
или вызова оного происходит смена
карты. Смотри иллюстрацию ниже:
- Name — имя триггера, оно обязательно при флаге
Use Only,
- New map name — имя следущей карты,
например если вы находитесь в map1, и надо
попасть в map2, то пишите естественно map2, а
в тот же trigger_changelevel с теми же функциями
только в map2 пишите наоборот map1
- Landmark Name — имя info_landmark, сведения о которой я
приведу дальше, имя ставим, например,
map1tomap2_lm
- Change Target — об этом параметре
напишу позже, сейчас она нам не нужна (и в
принципе вообще не очень нужна),
- Delay before change target — время перед вызовом
цели, написанной в поле выше
Флаги
- No Intermission — нам сейчас не нужно,
- Use Only — при активации данного флага
trigger_changelevel может быть вызван только
другим объектом (trigger_once например) — для
этого нужно вписать имя trigger_changelevel в
поле target вызывающего объекта, а при
попадании игрока в этот trigger_changelevel он
ничего делать не будет.
Info_landmark —
точечная энтитя, которая настраивает постоянный
пункт появления игрока на новой карте. Её
наличие в обеих картах обязательно, так как
относительно положения info_landmark игрок
появиться в следующей карте. Например, если при
смене уровня игрок находиться на расстоянии 1 м
и 60° (на виде сверху — х\у), то и в следующей
карте он появиться на таком же расстоянии от
этой энтити, поэтому info_landmark следует
распологать аккуратно, т. к. если в следущей
карте на расстоянии 1 м и 60° от
info_landmark будет стена, то игрок появиться в
этой стене. Я советую копировать и
trigger_changelevel и info_landmark, и блоки,
которые находятся рядом, в следущую карту, чтобы
избежать ошибок.
- Name — имя энтити, в
нашем случае map1tomap2_lm, должно быть
одинаково в обоих картах.
Также есть
ещё одна брашевая энтитя trigger_transition,
которую не часто, но используют:
Trigger_transition — браш-энтитя или
триггер, который, так сказать, регулирует
действия trigger_changelevel. Чтобы его
активировать, поставьте ему то же самое имя, что и
у info_landmark (в нашем случае map1tomap2_lm).
У trigger_transition две основные
функции. Во-первых, trigger_changelevel не будет
работать если игрок не находиться в зоне
trigger_transition. А во-вторых, в следующую
карту попадут ТОЛЬКО ТЕ ЭНТИТИ, КОТОРЫЕ
НАХОДЯТСЯ В ЗОНЕ
trigger_transition!
Есть 3 основных
типа смен карт:
1) Обычный (линейный)
2) Смещение
3) Односторонний и
реже встречающийся Глобальный.
Рассмотрим каждый из них подробно:
1 — Обычный (линейный)
Это самый лёгкий способ смены карты, который был
практически уже описан:
Посередине
коридора создаём trigger_changelevel (браш, затем на него применяем Tools->tie to entity... и выбираем
trigger_changelevel),
- в поле Name не пишем ничего за ненадобностью,
- в поле New map name пишем map2 (карта у нас как помните map1),
- в поле Landmark Name пишем имя ландмарки map1tomap2_lm.
Рядом с триггером создаём
точечную энтитьку info_landmark, в которой в
поле Name пишем map1tomap2_lm . Затем копируем
trigger_changelevel, info_landmark и прилежащие
к ним блоки в карту map2 и в поле Name у
trigger_changelevel пишем map1, чтобы
возможен был обратный переход. А затем
продолжаем коридор уже в map2. Вот собсно и всё
по первому способу, ничего особо сложного
нету.
2 — Смещение
Если в обычном
способе при смене карты ничего видимого не
меняется, то в способе смещения меняется
окружающая среда вокруг игрока:
Этот
способ используется в случаях, например, с
телепортом. Отличие от предыдущего способа
в том, что вы должны убедиться, что при смене
уровней игрок не застрянет в какой-нибудь стенке,
для этого нужно сделать ясную область вокруг
info_landmark, минимум равную той области, где
начинается смена уровня в предыдущей карте (от
которой игрок напрмер телепортировался). Делаем
всё как в предыдущем случае, только по середине
корридора ставим спрайт телепорта и вокруг него
trigger_changelevel, чтобы вступив в спрайт
попасть в map2. Затем копируем ТОЛЬКО
trigger_changelevel и info_landmark в map2 и
ставим их на место появления игрока на следущей
карте. Также меняем с map2 на map1 в поле New Map
Name в trigger_changelevel, как в прошлом
случае. Единственный совет — место появления
игрока должно быть рядом с таким же спрайтом
телепорта , чтобы вступив в него уже в map2
можно было вернуться в map1. Реалистика
.....
3 — Односторонний
Этот случай очень похож на вариант со смещением, разница лишь в
том, что в данном случае игрок не сможет
телепортироваться обратно в map1:
Создаём trigger_changelevel с флагом Use Only, Name —
map1ch (остальные настройки такие же, как приведённые
до) и ландмарку с таким же именем, как и раньше.
Также какой-нибудь триггер или
мультименеджер, который вызывает
trigger_changelevel вместе с какими-нибудь
эффектами. Затем копируем ТОЛЬКО
trigger_changelevel и info_landmark в карту map2 и
ставим их на место появления игрока на карте. В
поле New Map Name в trigger_changelevel меняем с
map2 на map1, это следует делать в любых случаях,
даже если обратный переход невозможен!!! Всё
дело в привязанности ландмарка с
trigger_changelevel. Тут уже ничего не
попишешь...
Вот собственно я и описал 3
основных случая смены уровня. Не очень сложно
как казалось раньше, не так ли?
Но есть
ещё один более сложный четвёртый способ смены
карт — Глобальный, с использованием Глобального
имени:
Например, вы едете на лифте и
хотите сделать смену уровня, но не хотите
потерять сам лифт. В этом случае вам как раз
надо использовать Глобальное имя. Тогда лифт на карте
map2, несмотря на своё изначальное положение,
в начале карты будет двигаться так, как будто это тот
же самый лифт из предыдущей карты map1. Для этого обоим func_plat
в параметре Global Entity Name нужно поставить
одинаковое имя, и расположить их в одинаковом
расстоянии от info_landmark. В примерах, ссылки
на которые будут представлены ниже, вы сможете
найти образцы и такой смены карт.
Скачать
карты с примером первого способа можно отсюда,
с примером второго способа отсюда,
с примером третьего метода отсюда
и, наконец, четвертого способа отсюда.
Вот
так, 90 % всех ошибок по смене уровней
происходят по неправильным ссылкам между
trigger_changelevel и info_landmark или
неаккуратной расстановкой info_landmark в
следующих картах.
Однажды я встретил
ошибку, где у чувака все ссылки и расположения
были правильными, но он появлялся где-то в совсем
постороннем месте, долго думали над этим, и
что бы вы думали? Он так заострил внимание на
этих триггерах и лэндмарках, что забыл
поместить info_player_start на карте! Это я
рассказал, чтобы показать пример того, как
иногда, зациклившись на тригерах и лэндмарках,
забывают элементарные вещи...
Однако есть одна ошибка которая стоит особняком — когда вас
выбрасывает из игры и пишет CHANGE LEVEL MAP1
LANDMARK. Данная ошибка встречается очень часто
и очень трудно сразу понять в чём там дело ,
появляются мысли с недоработкой самой халфы и
т.д. Дело же совсем в другом: эта проблема
происходит когда в месте откуда игрок из map1
переходит в следующую карту, в map2 стоит
trigger_changelevel, то есть игрок только
появившись на новой карте (map2) сразу
оказывается в trigger_changelevel и меняется
назад в map1, и затем в map1 происходит та же
история и так до бесконечности, игра таких
поворотов явно не тянет и выбрасывает с
ошибкой.
Решение данной проблемы довольно
просто — отодвигайте trigger_changelevel дальше
от info_landmark во второй карте map2 и всё =)
Возникает иногда также и такая проблема
(за предоставление данной информации отдельное
спасибо хорошему челу, который именует себя
Nicord): после компиляции карты вы запускаете её
в игре, и при смене карт Халфа дохнет.
Происходит это потому, что включён
Хаммер\Кварк\другой редактор карт. Решение просто
— закройте редактор и запустите игру заново!
:) Маленький совет:
Так как смена
уровней для игрока это всего лишь небольшая
загрузка, всегда создавайте иллюзию из map1 (как
пример с коридором), что за стеной что-то есть
(двери, вентиляция и т.д.) — в общем, что уровень
продолжается, а загрузка — просто небольшое
недразумение . Поэтому обычные (линейные)
смены карт старайтесь делать на поворотах,
чтобы во второй карте не воспроизводить карту
первую и наоборот. Да и так интересней играть,
хотя это моё личное IMHO...
Спасибо за
внимание, ваш Mitoh!
|