Учебник по созданию карт
Глава XX. Продвинутый маппинг.

§ 20.1 Авиаудар на карте de_torn

В этой статье мы расскажем о том, как устроен авиаудар на карте de_torn. Вы разве не знаете, что на de_torn есть авиаудар? Тогда поспешите прочитать о нем в разделе "Секреты". Для создания подобного авиаудара нам понадобятся следующие энтити-объекты:

Вот как будет выглядеть авиаудар:

Так будет выглядеть авиаудар в игре


Схема действия авиаудара будет следующей:

Схема действия авиаудара



1. Trigger_multiple

Итак, начинаем с создания объекта trigger_multiple. Его мы разместим на середине моста (см. рис. ниже). Когда игрок пройдет через этот триггер, будет активирован multi_manager, расположенный чуть выше.

Создаем trigger_multiple


Trigger_multiple (активирует объект multi_manager)
Target: jet_multi (сюда мы записали имя multi_manager'а)
Delay before trigger: 5 (время до активации объекта, в секундах)
Delay before reset: 360 (время, в течении которого триггер не может быть активирован повторно)

2. Multi_manager

Multi_manager, как видно из схемы, представленной выше, активирует 4 объекта: сначала звук самолета, затем запускает сам самолет, после этого "запускает" встряску земли и, в конце концов, "подрывает" разрушаемые ящики.

Свойства 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

Самым первым объектом активируемым через 0.1 секунды является звук самолета. Естественно, это будет объект ambient_generic. Вот как выглядят его свойства и флаги:

Ambient_generic (звук самолета)
Name: jet_sound (имя звука)
Path: ambience/jetflyby1.wav (путь к звуку, это стандартный звук самолета)
Volume: 10 (громкость звука, максимальная)

Флаги:

Play Everywhere: играть по всей карте
Start Silent: в начале раунда звук молчит
Not Toggled: играет 1 раз (затем его необходимо активировать повторно)

4. Запуск самолета Func_door

Для опытного маппера энтити-объекты не более, чем просто объекты, облажающие определенным набором свойств. Действительно, не стоит думать, что объект func_door может быть только дверью, исходя из его названия. Если мы раскрасим дверь подходящими текстурами и расположим горизонтально, то вполне можем получить платформу или простенький лифт.

Так и в нашем случае дверь будет выполнять отличную от ее прямого назначения функцию - она будет самолетом :) В нашей тестовой карте мы использовали текстуры самолета из карты de_torn.

На картинке ниже видно, что самолет у нас будет плоским прямоуголным брашем (а впоследствии объектом func_door), повернутым на угол 45° в направлении своего движения.

Создаем самолет из func_door и определяем направление его полета


Окрасив браш текстурой самолета, разверните его на виде сверху (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 (остается в конечной точке до конца раунда, затем возвращается на место)

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 вместо ящиков используется крыша одного из домов. Самолет пролетает над крышей - раздается взрыв, и часть крыши разрушается.

Время активации ящиков func_breakable рассчитано с учетом скорости самолета и расстояния, на котором он находится от ящиков в начале раунда. Да, кстати, если Вы не знаете, то объекты func_breakable при активации разрушаются, а установив значение "Explode magnitude" мы добавляем к простому разрушению еще и взрыв определенной силы. Внешне все выглядит, как будто самолет сбросил бомбы на ящики.

Func_breakable (взрывающие ящики)
Strenght: 1 (прочность, можно оставить по умолчанию)
Material type: Wood (тип материала, дерево)
Explode magnitude: 170 (сила взрыва, довольно большая)

Флаги:

Only Trigger: взрывается только от активации (игрок разрушить ящики не может)

Заключение

При создании самолета желательно разместить его так, чтобы он не был виден с земли, иначе может получиться, что самолет будет неподвижно висеть над каким-нибудь домом и ждать, когда его "вызовут" :) На нашей карте самолет находится очень низко над горами, поэтому с земли незаметен. Игрок думает, что самолет вылетает из-за гор.

Также необходимо учитывать следующую особенность объекта func_door (самолета): в начале следующего раунда func_door всегда возвращается в исходное положение, т.е. Вы можете увидеть, как самолет задом летит в начальное положение. Зная эту особенность, не размещайте места рождения игроков под траекторией полета самолета, если Вы не хотите, чтобы они увидели этот довольно странный маневр :)


Ссылки

torn_airplane.zip [193Кб] - в архиве карта-пример в форматах BSP и RMF.


Глава XX. Продвинутый маппинг.


К оглавлению Учебника

© http://cs-mapper.by.ru/
CMT (CS Mapping Tutorials) - © 2006-2011+. Created by VM
[ Script Execution time: 0.0051 ]