В этой статье мы расскажем о том, как устроен авиаудар на карте
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 (время до активации объекта, в секундах)
Delay before reset: 360 (время, в течении которого триггер не может быть активирован повторно)
Delay before trigger: 5 (время до активации объекта, в секундах)
Delay before reset: 360 (время, в течении которого триггер не может быть активирован повторно)
2. Multi_manager
Multi_manager, как видно из схемы, представленной выше, активирует 4 объекта: сначала звук самолета, затем запускает сам самолет, после этого "запускает" встряску земли и, в конце концов, "подрывает" разрушаемые ящики.Свойства 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
Самым первым объектом активируемым через 0.1 секунды является звук самолета. Естественно, это будет объект ambient_generic. Вот как выглядят его свойства и флаги:
Ambient_generic (звук самолета)
Name: jet_sound (имя звука)
Path: ambience/jetflyby1.wav (путь к звуку, это стандартный звук самолета)
Volume: 10 (громкость звука, максимальная)
Флаги:
Play Everywhere: играть по всей карте
Start Silent: в начале раунда звук молчит
Not Toggled: играет 1 раз (затем его необходимо активировать повторно)
Path: ambience/jetflyby1.wav (путь к звуку, это стандартный звук самолета)
Volume: 10 (громкость звука, максимальная)
Флаги:
Play Everywhere: играть по всей карте
Start Silent: в начале раунда звук молчит
Not Toggled: играет 1 раз (затем его необходимо активировать повторно)
4. Запуск самолета Func_door
Для опытного маппера энтити-объекты не более, чем просто объекты, облажающие определенным набором свойств. Действительно, не стоит думать, что объект func_door может быть только дверью, исходя из его названия. Если мы раскрасим дверь подходящими текстурами и расположим горизонтально, то вполне можем получить платформу или простенький лифт.Так и в нашем случае дверь будет выполнять отличную от ее прямого назначения функцию — она будет самолетом :) В нашей тестовой карте мы использовали текстуры самолета из карты de_torn.
На картинке ниже видно, что самолет у нас будет плоским прямоуголным брашем (а впоследствии объектом func_door), повернутым на угол 45° в направлении своего движения.

Окрасив браш текстурой самолета, разверните его на виде сверху (2D-top). Рекомендуем использовать ровные значения: 30°, 45°, 60° и т.д.
Превратите браш в объект func_door и выставьте в параметре "Angle" точно такой же угол, на который развернули самолет. В нашем случае самолет развернут на угол 45°, поэтому и в параметре "Angle" мы указали 45°. Важно также установить параметр Delay before close: -1, чтобы самолет мог пролететь только 1 раз за раунд, т.е. долетев до конечной точки, он останется там до конца раунда.
Чтобы синие части текстуры стали в игре прозрачными, необходимо поставить следующие режимы:
Render Mode: Solid, FX Amount: 255.
Следующим важным параметром самолета (func_door) является "Lip", определяющий расстояние, на которое переместится самолет. По умолчанию самолет переместится на расстояние, равное своей длине (ширине). Расстояние при использовании параметра "Lip" высчитывается так: расстояние = длина самолета - Lip.
Расстояние определяем на 2D-виде сверху. Так как угол, под которым летит наш самолет, равен 45°, то расстояние легко высчитать по диагонали координатной сетки. Если у нас сетка разбита на квадраты 128х128 юнитов, то по теореме Пифагора (Вы же ее помните? :) длина диагонали получается равной ~180 юнитов. Как Вы конечно же понимаете, теорема Пифагора применима к любому прямоугольному треугольнику, независимо от того, одинаковы катеты A и B или нет.
Считаем количество квадратов с размером 128х128 юнитов от начального до конечного
положения
самолета. У нас получилось 9 квадратов, а значит расстояние равно ~1600 юнитов. Именно
поэтому в параметр "Lip" мы записали значение "-1600" ("минус", т.к. отрицательное
значение
увеличивает расстояние полета. Действительно, в формуле: расстояние = длина самолета
-
Lip перед параметром "Lip" стоит минус, а минус на минус дает плюс).
Func_door (самолет)
Angle: 45° (направление полета самолета, определяется на 2D-виде
сверху)
Name: jet (имя самолета)
Render mode: Solid (вместе с fx amount: 255 делает синие части самолета прозрачными)
FX Amount: 255
Speed: 1600 (скорость самолета)
Lip: -1600 (дополнительное расстояние, на которое летит самолет; значение никак не связано со скоростью, просто цифры совпали)
Wait before close: -1 (остается в конечной точке до конца раунда, затем возвращается на место)
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: землетрясение действует по всей карте
Amplitude 0-16: 2 (амплитуда колебаний, маленькая)
Duration (seconds): 3 (продолжительность встряски в секундах)
0.1 jerk, 255.0 = rumble: 2 (частота толчков; чем больше значение, тем чаще трясет)
Флаги:
GlobalShake: землетрясение действует по всей карте
6. Взрыв ящиков Func_breakable
Рядом с конечной точкой полета самолета создадим несколько ящиков и превратим их в func_breakable. На de_torn вместо ящиков используется крыша одного из домов. Самолет пролетает над крышей — раздается взрыв, и часть крыши разрушается.Время активации ящиков func_breakable рассчитано с учетом скорости самолета и расстояния, на котором он находится от ящиков в начале раунда. Да, кстати, если Вы не знаете, то объекты func_breakable при активации разрушаются, а установив значение "Explode magnitude" мы добавляем к простому разрушению еще и взрыв определенной силы. Внешне все выглядит, как будто самолет сбросил бомбы на ящики.
Func_breakable (взрывающие ящики)
Strenght: 1 (прочность, можно оставить по умолчанию)
Material type: Wood (тип материала, дерево)
Explode magnitude: 170 (сила взрыва, довольно большая)
Флаги:
Only Trigger: взрывается только от активации (игрок разрушить ящики не может)
Material type: Wood (тип материала, дерево)
Explode magnitude: 170 (сила взрыва, довольно большая)
Флаги:
Only Trigger: взрывается только от активации (игрок разрушить ящики не может)
Заключение
При создании самолета желательно разместить его так, чтобы он не был виден с земли, иначе может получиться, что самолет будет неподвижно висеть над каким-нибудь домом и ждать, когда его "вызовут" :) На нашей карте самолет находится очень низко над горами, поэтому с земли незаметен. Игрок думает, что самолет вылетает из-за гор.Также необходимо учитывать следующую особенность объекта func_door (самолета): в начале следующего раунда func_door всегда возвращается в исходное положение, т.е. Вы можете увидеть, как самолет задом летит в начальное положение. Зная эту особенность, не размещайте места рождения игроков под траекторией полета самолета, если Вы не хотите, чтобы они увидели этот довольно странный маневр :)
torn_airplane.zip [193Кб] — в архиве карта-пример в форматах BSP и RMF.



Из рисунка видно, что ось вращения вентилятора, заданная ORIGIN-брашем, совпадает с осью X.
Следовательно, во флагах необходимо отметить X Axis.
Start On — для того, чтобы вентилятор автоматически начал крутиться в начале
раунда.




Итак, что нужно записать в свойствах:




Как видно из схемы, multi_manager
включает лампочки (они расставлены практически по
всей карте, но в начале раунда выключены). Когда они включаются, создается эффект яркой
вспышки от молнии. В этот же момент включается сама молния (объект
env_laser).



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




Также поступаем со второй группой брашей. И теперь обе группы прекрасно пересекаются под углом
45° и
не надо ничего править инструментом для работы с вертексами!
В итоге обе группы на виде сверху должны выглядеть так:
А так пересечение теперь выглядит в 3D-виде:



Теперь посмотрим, как это реализовано в редакторе.









А теперь собственно о том, как устроена птичка. Данный зверь будет у нас объектом
func_tracktrain, который будет постоянно перемещаться по объектам
path_track.
Эти
path_track, как известно, определяют траекторию движения для
func_tracktrain.
На виде сверху хорошо видно, как размещен ORIGIN-браш:
Дальше выделяем птицу вместе с ORIGIN-брашем и превращаем в объект
func_tracktrain.


Итак, выделяем все браши, составляющие мост (это и доски, и канаты) и ORIGIN-браш, и
превращаем в func_pendulum
. Теперь все, что выделено (см. рис. ниже) будет вращаться
(раскачиваться) вокруг ORIGIN-браша.

Предположим, что кто-то набрал фраг. В этом случае возникает следующая цепочка
действий:













Такие же операции происходят при нажатии на вторую и третью кнопки. Разница лишь в
запускаемых и глушимых мелодиях. Таким образом, нам необходимо создать:
Чтобы не запутаться в многочисленных свойствах объектов, приведенных ниже, пользуйтесь
схемой.
Итак, теперь у нас при нажатии, например, на первую кнопку, активируется первый
multi_manager
, который активирует уже 4 объекта: включает первую мелодию, глушит
вторую мелодию, глушит третью мелодию, меняет "Target" двери на значение multi_1.
При
нажатии на другие кнопки происходят схожие операции.












Чтобы не вращать створки в редакторе с целью нанесения второй картинки, мы предлагаем
временно пренести их, как показано на этой же схеме, но чуть ниже. Как только створки
будут
перенесены, наносим вторую картинку (см. рис. ниже), выделив все стороны створок, нажав
флажок "Tread as one" и кнопку "Fit".