Из данного материала вы узнаете о том, как сделан
авиаудар на de_torn. Возможно, вы не знаете, что на de_torn есть
авиаудар... Тогда быстренько прочитайте о нём в разделе «Секреты» :-) От
вас потребуется знание следующих энтити-объектов:
Схема работы авиаудара будет такой (смотрите картинку ниже):
Игрок проходит через trigger_multiple, расположенный на мосту
Trigger_multiple активирует multi_manager
Multi_manager активирует все объекты, создающие эффект авиаудара
1. Trigger_multiple
Что же, начнём с создания брашевого энтити-объекта trigger_multiple.
Его мы расположим посередине моста (смотрите картинку ниже). Когда игрок
пройдет через данный триггер, будет активирован multi_manager,
расположенный чуть выше (местоположение его значения не имеет).
Trigger_multiple (активирует объект multi_manager)
Target: jet_multi (здесь мы указали название multi_manager'а) Delay before trigger: 5 (время до активации multi_manager'а, в секундах) Delay before reset: 360 (время в секундах, в течении которого триггер не может быть активирован повторно)
2. Multi_manager
Multi_manager, как видно из схемы, расположенной выше, запускает
четыре энтити-объекта: сначала звук самолета, потом запускает сам
самолет, после этого активирует встряску земли и, в конце концов,
запускает подрыв разрушаемых ящиков.
Свойства multi_manager'а выглядят так:
«Targetname» при отжатой кнопке «Smart Edit» означает название энтити-объекта multi_manager, то есть jet_multi.
Ниже названия мы видим запуск звука jet_sound через 0.1 сек, запуск
самолета jet через 1.0 сек, запуск встряски jet_shake через 1.0 сек и
запуск взрыва ящиков jet_crate через 1.9 сек. Время запуска всех данных
объектов рассчитано с учётом скорости полёта самолета (ведь нужно
подорвать ящики, когда самолет будет пролетать над ними, но не раньше и
не позже).
3. Звук самолета Ambient_generic
Самым 1-ым энтити-объектом запускаемым через 0.1 секунды является звук
самолета. Конечно, это будет энтити-объект ambient_generic. А вот как
выглядят его параметры и флаги:
Ambient_generic (звук самолета)
Name: jet_sound (название объекта) Path: ambience/jetflyby1.wav (путь к звуку, это стандартный звук самолета) Volume: 10 (громкость звука, максимальная)
Флаги:
Play Everywhere: играть по всему уровню Start Silent: в начале нового раунда звук не играется Not Toggled: играет один раз (затем его нужно запускать ещё раз)
4. Запуск самолета Func_door
Для профессионального создателя карт энтити-объекты не более, чем
просто объекты, обладающие определенными свойствами. В самом деле, не
стоит думать, что энтити-объект func_door может быть только дверью
исходя из названия. Если раскрасить дверь подходящими текстурами и
расположить горизонтально, то вполне можем получить платформу или
простой лифт.
Так и в нашем случае, дверь будет выполнять отличную от её прямого
назначения функцию — она будет самолетом :-) В нашем тестовом уровне мы
использовали текстуры самолета из de_torn.
На рисунке ниже видно, что самолет у нас будет плоским прямоугольным
брашевым энтити-объектом func_door, повернутым на угол 45 градусов в
направлении своего движения.
Раскрасив браш текстурой самолета, поверните его на виде сверху (2D
top). Советуем использовать ровные значения: 30 градусов, 45 градусов,
60 градусов и т.п.
Превратите браш нажатием комбинации клавиш [Ctrl-T] в
энтити-объект func_door и выставьте в параметре «Angle» точно такой же
угол, на который развернули самолет. В нашем случае самолет повёрнут на
угол 45 градусов. Важно также указать параметр Delay before close: -1,
чтобы самолет мог произвести авиаудар только один раз за раунд, то есть
долетев до конечной точки своего пути, он останется там до конца
раунда, чтобы с началом нового раунда вернуться в изначальную позицию.
Чтобы синие части текстуры стали в игре невидимыми, нужно указать такие режимы отображения: Render Mode: Solid, FX Amount: 255.
Следующим значимым параметром нашего будущего самолёта (func_door)
является «Lip», определяющий расстояние, на которое переместится
самолет. Стандартно самолёт пролетит расстояние, равное своей длине
(ширине). Дистанция при использовании параметра «Lip» вычисляется так: дистанция = длина самолета - Lip.
Эту дистанцию определяем на двумерном виде сверху (2D top). Так как
градус, под которым летит наш самолет, равен 45, то расстояние легко
высчитать по диагонали координатной сетки. Если у нас сетка разбита на
квадраты 128х128 юнитов, то по теореме Пифагора (вы же её помните? :-)
длина диагонали получается равной примерно 180 юнитов. Как Вы конечно же
понимаете, теорема Пифагора применима к любому прямоугольному
треугольнику, независимо от того, одинаковы катеты A и B или нет.
Считаем число квадратов с размером 128х128 юнитов от начального до
конечного положения самолета. У нас получилось 9 квадратов, а значит
дистанция равна примерно 1600 юнитов. Именно поэтому в параметр «Lip» мы
вбили значение «-1600» («минус», так как отрицательное значение
увеличивает дистанцию полёта. В самом деле, в формуле: дистанция = длина самолета - Lip перед параметром «Lip» стоит минус, а минус на минус дает плюс).
Func_door (самолет)
Angle: 45 градусов (направление полета самолета, определяется на двумерном виде сверху — 2D top) Name: jet (название самолета) Render mode: Solid (данный режим отображения вместе с fx amount: 255 делает синие части самолета невидимыми) FX Amount: 255 Speed: 1600 (скорость самолета, высокая) Lip: -1600 (дополнительная дистанция, на которую пролетит самолёт; значение никак не связано со скоростью, просто цифры совпали) Wait before close: -1 (остаётся в конечном положении до конца раунда; затем в начале следующего раунда возвращается на место)
5. Встряска Env_shake
Данный спецэффект отсутствует на de_torn, но мы решили немного
пошалить :-) и усилить восприятие низко летящего реактивного самолета,
поэтому добавили маленькое землетрясение при помощи энтити-объекта env_shake.
Env_shake (объект, вызывающий встряску карты)
Name: jet_shake (название «встряски») Amplitude 0-16: 2 (амплитуда колебаний, маленькая) Duration (seconds): 3 (длительность встряски в секундах) 0.1 jerk, 255.0 = rumble: 2 (частота толчков; чем больше значение, тем чаще трясет)
Флаги:
GlobalShake: землетрясение распространяется по всему уровню
6. Взрыв ящиков Func_breakable
Рядом с конечной точкой движения самолёта мы создали несколько ящиков, превратив их в энтити-объект func_breakable.
На карте de_torn вместо ящиков используется крыша 1-ого из домов. Когда
самолёт пролетает над крышей — раздается взрыв, и часть крыши
разрушается.
Время активации (взрыва) ящиков func_breakable рассчитано с учётом
скорости самолета (1600 юнитов в секунду) и дистанции, на которой он
расположен от ящиков в начале раунда. Да, кстати, если вы не знаете, то
энтити-объекты func_breakable при активации разрушаются, а установив
параметр «Explode magnitude» мы добавляем к обычному разрушению еще и
взрыв какой-либо силы.
Func_breakable (взрывающиеся ящики)
Strenght: 1 (прочность ящиков, можно оставить по умолчанию) Material type: Wood (тип материала, дерево) Explode magnitude: 170 (сила взрыва, значительная)
Флаги:
Only Trigger: взрывается только от активации (игрок расстрелять ящики не может)
Заключение:
При изготовлении данного самолета рекомендуется размещать его так,
чтобы он не был виден с земли, иначе может получиться, что самолёт будет
висеть над каким-либо домом и ждать, когда его активируют :-)
Также нужно учитывать следующую особенность энтити-объекта func_door: в
начале следующего раунда func_door всегда возвращается в начальное
положение, то есть можно увидеть, как самолет задом летит в изначальное
положение. Зная эту особенность, не размещайте респауны рядом с
траекторией полёта самолета, если вы не хотите, чтобы игроки увидели сей
казусный маневр :-)