Ну что же, решил я вам написать тутор по смене уровней в халфе. Эта проблема довольно актуальна, поэтому читайте внимательно...
Итак смена уровня состоит в основном из двух энтить наличие которых ОБЯЗАТЕЛЬНО!!! Это 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(браш с текстурой
aaatrigger, затем 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(как пример с коридором) что за стеной
что то есть(двери, вентиляция и т.д.) - вобщем что уровень продолжается а
лоадинг просто небольшое недоразумение(лол) Поэтому обычные(линейные)
смены карт старайтесь делать на поворотах, чтобы во второй карте не
воспроизводить карту первую и наоборот. Да и так интересней играть, хотя
это моё личное ИМХО...
Спасибо за внимание, ваш
Mitoh