DS XXI
Local Pro
Ну что ж, решил я вам написать статью по смене уровней в Half-Life. Эта проблема довольно актуальна, поэтому читайте внимательно.
Итак смена уровня состоит в основном из двух ентить, наличие которых ОБЯЗАТЕЛЬНО !!! Это trigger_changelevel и info_landmark.
Trigger_changelevel — объёмная браш-энтитя или триггер, при попадании в который или вызова оного происходит смена карты. Смотри иллюстрацию ниже:
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),
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...
Итак смена уровня состоит в основном из двух ентить, наличие которых ОБЯЗАТЕЛЬНО !!! Это 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 он ничего делать не будет.
- Name — имя энтити, в нашем случае map1tomap2_lm, должно быть одинаково в обоих картах.
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.
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...