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

Продвинутые эффекты и механики: взрывы, погода, животные, конвейеры, маятники, табло очков и многое другое.

20.1

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

В этой статье мы расскажем о том, как устроен авиаудар на карте de_torn. Вы разве не знаете, что на de_torn есть авиаудар? Тогда поспешите прочитать о нем в разделе "Секреты". Для создания подобного авиаудара нам понадобятся следующие энтити-объекты: Вот как будет выглядеть авиаудар:
Так будет выглядеть авиаудар в игре
Схема действия авиаудара будет следующей:
  1. Игрок проходит через trigger_multiple, расположенный на мосту
  2. Trigger_multiple активирует multi_manager
  3. Multi_manager активирует все объекты, создающие эффект авиаудара
t24torn2

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'а выглядят так:
t24torn4 "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 или нет.
t24torn6 Считаем количество квадратов с размером 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.
20.2

Активация объектов при рождении/смерти игрока

Из этой статьи Вы узнаете как можно активировать объекты, каждый раз когда игрок умирает/рождается, присоединяется или покидает игру.
В качестве примера мы будем использовать карту KA_100x100, т.к. на этой карте реализовано очень большое число любопытных спецэффектов. Здесь и табло с подсчетом фрагов, и звуки апплодисментов при каждом убийстве, бой барабанов, воющие сирены, прожекторы и пр. — все это реализовано при помощи одного малоизвестного свойства объектов.
Начнем с простого примера с дверью и кнопкой. Итак, допустим у нас на карте в каком-нибудь месте есть дверь (func_door), а рядом кнопка (func_button), открывающая эту дверь. Чтобы игрок мог открыть дверь нажатием кнопки — двери необходимо присвоить имя (Name), например, Door1. Затем это имя нужно вписать в параметр "Target" кнопки. Все прекрасно — игрок жмет кнопку, и дверь с именем Door1 открывается.
Теперь собственно о том, как заставить дверь открываться, когда кто-нибудь кого-нибудь убъет. Существуют 5 специальный имен для объектов, вот они:
  • game_playerdie
    game_playerkill
    game_playerjoin
    game_playerspawn
    game_playerleave
Рассмотрим первые 2 специальных имени game_playerdie и game_playerkill. Если Вы дадите двери (лампочке, звуку и вообще любому другому объекту) имя game_playerdie или game_playerkill, то каждый раз, когда кто-то кого-то убъет, дверь будет открываться-закрываться! Если Вы дадите какое-нибудь из этих имен лампочке (light), то при каждом фраге она будут загораться и при следующем фраге гаснуть!
Этот трюк работает со всеми объектами, которым можно дать имя. Вы можете присвоить имя game_playerkill, например, объекту multi_manager, который, напомним, может активировать до 16 различных объектов с заданными интервалами времени. В этот multi_manager мы можем записать, сначала активацию лампочки через 3 секунды, затем звука через 5 секунд, ну и напоследок двух дверей через 10 секунд. Ну это все к примеру, а так Вы можете активировать все, что захотите.

Другие имена означают следуещие действия:

game_playerjoin — активация объекта, когда игрок присоединяется к какой-нибудь команде
game_playerspawn — активация объекта, когда игрок рождается (т.е. в начале каждого раунда)
game_playerleave — активация объекта, когда игрок уходит из игры
Проявив фантазию, Вы сможете реализовать самые невероятные спецэффекты.
20.3

Вентилятор

В этой статье мы расскажем как создаются вентиляторы. Для этого нам потребуются всего 2 объекта (звук и сам вентилятор): Мы решили не делать обычный вентилятор. Вместо него мы создадим пару ветровых мельниц, которые отличаются от вентилятора лишь внешне.
Итак, в итоге наши ветровые мельницы будут выглядеть так:
Так будут выглядеть в игре ветровые мельницы
Для начала изготовим парочку вот таких вентиляторов. Т.к. наш объект вращается, то не забудем и про ORIGIN-браш, который поместим ровно в центр, между четырмя лопостями.
Создаем 2 вентилятора с ORIGIN-брашами
Теперь выделяем все 4 лопасти вместе с ORIGIN-брашем (как это показано на рисунке выше справа) и превращаем в объект func_rotating.
На рисунке ниже видно, как расположен ORIGIN-браш по отношению к лопостям вентилятора.
Так мы разместили ORIGIN-браш
Т.к. лопасти наших мельниц вращаются вдоль горизонтальных осей X или Y (сейчас мы это определим), а не вдоль вертикальной оси Z, то в свойствах func_rotating, а именно во флагах, необходимо выставить или X Axis, или Y Axis.
Для определения оси, вдоль которой происходит вращение, ставим в редакторе вид сверху, тогда ось Y будет направлена вверх, а ось Х — горизонтально (см. рис. ниже).
t24fan4 Из рисунка видно, что ось вращения вентилятора, заданная ORIGIN-брашем, совпадает с осью X. Следовательно, во флагах необходимо отметить X Axis.
А вот какие флаги мы также отметили у каждого из двух вентиляторов:
t24fan5 Start On — для того, чтобы вентилятор автоматически начал крутиться в начале раунда.
Fan Pain — чтобы наносил повреждения игроку, дотронувшемуся до лопастей.
Пояснения к остальным флагам Вы можете найти в разделе "Энтити".
Все, что остается сделать, это добавить пару объектов ambient_generic. Мы могли бы указать звук вентилятора и в свойствах func_rotating (в них предусмотрена такая опция), однако нам так и не удалось заставить вентилятор работать со звуком. Поэтому мы решили просто вставить около мельниц по одному объекту ambient_generic (см. рис. ниже).
Около мельниц размещаем по одному объекту ambient_generic
В свойствах объекта указываем путь к файлу со звуком вращающегося вентилятора.
Вот собственно и все. Две наши нехитрые мельницы готовы.
fan.zip [30Кб] — в архиве карта-пример в форматах BSP и RMF.
20.4

Взрывы, мины и растяжки

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

1. Создание мины

Начнем с самого простого — создания мины. Мины у нас будут противопехотные, т.е. такие, которые взрываются от небольшого веса, например, веса игрока :) Игрок наступает на мину и раздается взрыв.
Мину мы изобразим в виде небольшого холмика, по ширине и длине равного 32 юнитам. Края прямоугольного браша мы сделаем наклонными при помощи инструмента Vertex Tool (см. рис. ниже).
Так будет выглядеть мина
После того, как холмик будет готов, выделяем его и превращаем в func_breakable.
Выставим для этого объекта такие свойства и флаги:
Func_breakable (мина)
Strenght: 1 (прочность)
Material type: Rocks (тип материала, камушки)
Explode magnitude: 25 (сила взрыва, небольшая)
Флаги:
Touch — взрывается от прикосновения
Pressure — взрывается от давления
На нашей карте-примере мы создали 3 таких мины, таким образом, получилось небольшое минное поле.

2. Создание растяжки

Растяжка устроена немного посложнее. Для ее создания используется 3 энтити-объекта.
На рисунке ниже показано, какие именно объекты мы использовали.
Устройсво растяжки
1. Первый объект — func_illusionary, который изображает тонкую проволоку (веревку). Веревка натянута между мешками с песком, в сечении веревка имеет размеры 1х1 юнит. Покрашена текстурой rope.
2. Второй объект — env_explosion, т.е. взрывчатка. Это точечный энтити-объект, в редакторе изображается фиолетовым кубиком. Взрывчатку размещаем рядом с веревкой.
Env_explosion (взрывчатка)
Name: exp1
Magnitude: 35 (сила взрыва, небольшая)
Флаги:
Repeatable — чтобы можно было взрывать много раз
3. Третий объект — trigger_multiple. Данный триггер будет активировать взрывчатку. Триггер мы размещаем поверх веревки, как показано на рисунке.
Trigger_multiple (активирует взрывчатку)
Target: exp1
Delay before trigger: 2 (время до активации взрывчатки, в секундах)
Итак, игрок проходит через веревку, задевает trigger_multiple, тот через 2 секунды активирует env_explosion и ... следует взрыв.
Взрыв после прохождения через растяжку
Если необходимо, чтобы взрывчатка срабатывала только один раз за игру, то вместо trigger_multiple используйте trigger_once.

3. Создание цепочки взрывов

И на закуску, немного украсим обычный взрыв бомбы. А украсим мы его подрывом дополнительных боезарядов env_explosion и не только.
Суть в следующем: при взрыве бомбы разрывается ящик со взрывчаткой, а также 2 дополнительных боезаряда, расположенные рядом.
На картинке ниже показаны ящик со взрывчаткой, 2 объекта env_explosion, зона закладки бомбы (func_bomb_target) и multi_manager.
Создание цепочки взрывов
Схема работы данного "устройства" выглядит так:
  1. Игрок устанавливает бомбу в зону func_bomb_target
  2. Когда бомба взрывается, активируется multi_manager
  3. Multi_manager активирует по очереди 3 объекта (ящики + 2 взрыва)
t24explosion1 Итак, что нужно записать в свойствах:
Func_bomb_target (зона для закладки бомбы)
Target when bomb blows: manager (имя объекта, который активируется при взрыве бомбы, т.е. имя multi_manager)
Multi_manager (объект, активирующий подрыв ящика и 2-ух взрывчаток)
В свойства multi_manger при отжатой кнопке Smart Edit мы записываем по очереди имена ящика и двух взрывчаток.
Name: manager (имя самого менеджера)
exp2 — 0.2 (объект по имени exp2 активируется через 0.2 секунды)
exp3 — 0.7 (объект по имени exp3 активируется через 0.7 секунды)
exp4 — 1.2 (объект по имени exp4 активируется через 1.2 секунды)
Теперь остается присвоить имена ящику (exp2), первой взрывчатке (exp3) и второй взрывчатке (exp4).
env_explosion.zip [28Кб] — в архиве карта-пример в форматах BSP и RMF.
20.5

Вылетающие из трубы куски мяса

Эта статья предназначена для всех любителей мяса :) Мы создадим трубу, из которой будут вылетать кости, кровавые куски мяса и прочая требуха. Мы воспользуемся следующими объектами: Оригинальная статья взята с сайта: http://halflife.ru/demi/. Благодарим автора!
Давайте посмотрим, что у нас получится в итоге:
Вылетающие из трубы куски мяса
Устройство очень простое. В трубе размещается точечный объект gibshooter.
Около трубы создается trigger_multiple, который и будет вызывать выброс мяса.
Вот как это выглядит в редакторе:
Вид в редакторе
Теперь расскажем о свойствах этих двух объектов.
1. Gibshooter (выкидывает куски мяса)
Name: shooter
Angle: 180° (угол, определяющий направление выброса кусков)
Number of Gibs: 7 (количество выбрасываемых за 1 раз кусков мяса)
Delay between shots: 0 (время между выбросами кусков)
Gib Velocity: 800 (скорость вылета кусков, высокая)
Course Variance: 0.15 (параметр опредляет на сколько летящие куски будут отклоняться от прямой траектории)
Gib Life: 5 (время "жизни" кусков, затем они исчезают)
Флаги:
Repeatable — чтобы gibshooter можно было активировать многократно
Более подробно стоит остановиться на параметре Angle (угол в градусах).
Угол определяет сторону, куда будут выбрасываться куски мяса. Чтобы правильно определить этот угол, поставьте вид сверху. На нашей тестовой карте куски выбрасываются налево на виде сверху, а это 180°.
2. Trigger_multiple (активирует gibshooter)
Target: shooter
Delay before reset: 0
gibshooter.zip [18Кб] — в архиве карта-пример в форматах BSP и RMF.
20.6

Гром на карте de_aztec

В этой статье мы раскроем секрет грома на карте de_aztec.
Данный эффект реализован при помощи следующих энтити-объектов: На рисунке ниже запечатлен момент появления молнии:
Молния на карте De_Aztec
Давайте вспомним последовательность природных явлений при грозе. Сначала мы видим молнию, вместе с ней яркую вспышку и затем слышим гром. На de_aztec все происходит точно в такой же последовательности.
  1. Игрок проходит через триггер trigger_multiple (всего на карте расположено 4 таких триггера)
  2. Trigger_multiple активирует multi_manager
  3. Multi_manager через 3 секунды включает молнию (env_laser) и лампочки (light)
  4. Multi_manager через 3.5 секунды отключает молнию (env_laser) и лампочки (light)
  5. Multi_manager через 4.3 секунды включает звук грома
Расположение объектов на карте De_Aztec
На рисунке выше показано расположение этих энтити-объектов. Обратите внимание на фиолетовые прямоугольники с черной буквой "лямбда" — это триггеры trigger_multiple.
Данные триггеры расположены в четырех местах карты (посередине моста, подъем с воды у контров, выход с базы террористов и "картонка" у контров).
Задача у данных триггеров одна — активировать multi_manager, который затем актвирует по очереди все объекты, создающие эффект грома и молнии.
Вот как выглядит схема работы грома и молнии:
t24aztec1 Как видно из схемы, multi_manager включает лампочки (они расставлены практически по всей карте, но в начале раунда выключены). Когда они включаются, создается эффект яркой вспышки от молнии. В этот же момент включается сама молния (объект env_laser).
Через 0.5 секунды и лампочки и молния выключаются все тем же multi_manager'ом (получается, что молния сверкает в течении 0.5 секунды).
Еще через 0.8 секунды включается звук грома (объект ambient_generic).
Все объекты (лампочки, молния и звук) активируются за 4.3 секунды.
Свойства энтити-объектов:
1.1-1.4 Trigger_multiple (4 триггера, активирующих multi_manager)
Target: thunder (это имя multi_manager'а)
Delay before trigger: 0 (срабатывает без задержки, т.е. через 0 секунд)
Delay before reset: 20 (в следующий раз сработает через 20 секунд)
2. Multi_manager (активирует молнию, лампочки и звук грома)
Name: thunder
ouch — 3 (включается молния по имени ouch через 3 секунды)
flash — 3 (включаются лампочки по имени flash через 3 секунды, вместе с молнией)
ouch#1 — 3.5 (вЫключается молния по имени ouch через 3.5 секунды)
flash#1 — 3.5 (вЫключаются лампочки по имени flash через 3.5 секунды, вместе с молнией)
boom — 4.3 (включается звук грома по имени boom через 4.3 секунды)
3. Env_laser (молния, бьющая лучами в объекты info_target)
Name: ouch
Target of laser: bob (имена двух объектов info_target, которые являются конечными точками для луча)
Brightness: 255 (яркость луча)
Beam color: 255 255 255 (цвет луча в формате RGB — красный, зеленый, синий)
Width of beam: 80 (ширина луча от 0 до 255)
Ammount of noise: 100 (степень изогнутости луча, значения от 0 до 255)
Sprite name: sprites/lgtning.spr (путь к спрайту, который будет лучем)
Texture scroll rate: 1 (скорость движения текстуры спрайта)
Damage/second: 100 (повреждения при поподании игрока под луч)
Флаги:
End Sparks — из места, где заканчивается луч, будут сыпать искры
4.1-4.2 Info_target (2 объекта, в которые по очереди бьет молния)
Name: bob
5. Light (многочисленные лампочки, создающие кратковременную вспышку от молнии)
Name: flash (имена всех лампочек, используемых для создания вспышки)
Brightness: 255 255 255 255 (цвет света и яркость лампочек)
Флаги:
Initially dark — в начале раунда лампочки выключены (включаются только при активации)
6. Ambient_generic (звук грома)
Name: boom
Path: ambience/thunder_clap.wav (путь к звуку грома)
Volume: 10 (громкость, максимальная)
Флаги:
Play Everywhere — звучит по всей карте
Start Silent — изначально (в начале раунда) звук молчит
Not Toggled — играет 1 раз (затем его необходимо активировать повторно)
env_laser.zip [31Кб] — в архиве карта-пример в форматах BSP и RMF.
20.7

Дождь на карте

В этой статье мы расскажем о создании дождя. Нам пригодятся следующие энтити-объекты: Так будет выглядеть дождь в игре:
Так будет выглядеть в игре дождь
Что нужно для создания атмосферы дождя?
  1. Темное небо с тучами
  2. Сам дождь, который у нас будут изображать спрайты
  3. Звук дождя
  4. Лужи на земле

1. Темное небо с тучами

Установим темное грозовое небо. Из стандартных картинок, как нам кажется, наиболее подходит небо по имени blue. Вписываем это название в параметр environment map, который доступен в меню
Map/Map properties....

2. Дождь

Дождь, как мы уже говорили, будет реализован при помощи спрайтов. Спрайты мы вставим при помощи объектов env_sprite.
На рисунке ниже видно, что точечные объекты env_sprite расположены произвольно на некоторой высоте над землей (96-128 юнитов). Расстояние между объектами необходимо выбирать в соответствии с размером спрайта дождя. Мы использовали спрайт с размером 256х256 пикселей. А расстояние между объектами сделали порядка 128-140 юнитов, чтобы дождь казался более сильным, насыщенным.
Расположение объектов на дождевой карте
Все объекты env_sprite имеют одинаковые свойства, поэтому достаточно создать всего лишь один такой объект, указать для него свойства, а затем просто размножить до нужного числа объектов.
Свойства объектов env_sprite:
Env_sprite (спрайты дождя)
Render Mode: additive (данный режим убирает черную подложку у спрайта)
FX Amount: 255
FX Color: 220 220 235 (цвет спрайта в формате RGB, т.е. красный, зеленый, синий)
Framerate: 20 (скорость смены кадров спрайта в секунду)
Sprite Name: sprites/xrain2.spr (путь к файлу со спрайтом дождя)
Scale: 1 (масштаб спрайта)
Флаги:
Start on — чтобы спрайт проигрывался с самого начала раунда

3. Звук дождя

Звук (объект ambient_generic) мы разместили в середине карты и выставили для него флаг "Play Everywhere", чтобы дождь был слышен по всей карте.
Необходимо заметить, что звук должен проигрываться бесконечно, а для этого он должен содержать специальную метку (по-английски cue point). Как создавать такие метки Вы можете узнать из статьи "Создание бесконечно играющих звуков".
Свойства звука:
Ambient_generic (звук дождя)
Path: ambience/waterfall_med.wav (путь к звуку)
Volume: 8 (громкость)
Флаги:
Play Everywhere - играет по всей карте

4. Лужи на земле

Лужи мы создадим из объектов func_water. Толщина таких объектов будет составлять 1 юнит. Форму для луж можно задать или инструментом Clip, или Vertex Manipulation. На нашей тестовой карте лужи являются многоугольниками произвольной формы.
Свойства объектов func_water:
Func_water (лужи на земле)
Render Mode: texture (данный режим придает объекту прозрачность)
FX Amount: 40 (степень прозрачности, ближе к 0 — более прозрачный объект)
rain.zip [440Кб] — в архиве карта-пример в форматах BSP и RMF, а также необходимый звук и спрайт.
20.8

Землетрясение

В этой статье мы научим Вас создавать настоящее землетрясение на своей карте. Мы будем использовать следующие объекты: Безусловно, самым главным объектом из всех перечисленных является env_shake, потому как именно он обеспечивает "встряску" карты.
Еще нам потребуется звук землетрясения, который мы вставим естественно через ambient_generic. Встряску и звук неободимо активировать одновременно, ну, или почти одновременно. Для этой цели мы будем использовать multi_manager, в который заложим интервалы активации звука и землетрясения. Ну, а сам multi_manager будет активироваться игроком через триггер trigger_multiple.
Ну, чтож задача ясна. В путь! Нам потребуется карта с горами, например, такая:
Горная карта

1. Trigger_multiple

Мы сделаем так, чтобы землетрясение начиналось, когда игрок проходит через середину моста. Размещаем там trigger_multiple (см. рис. ниже).
Так мы разместили все четыре объекта
1. Trigger_multiple (активирует multi_manager)
Target: manager1
Delay before reset: 10 (по умолчанию)

2. Multi_manager

Multi_manager с заданным интервалом времени активирует два объекта: звук (через 0,2 сек) и землетрясение (через 0,3 сек). Вот как выглядят свойства этого объекта: t24quake3

3. Env_shake

Env_shake, как главный элемент, мы разместили еще немного выше остальных объектов (просто для удобства).
3. Env_shake (объект, вызывающий землетрясение)
Name: shake1
Amplitude 0-16: 4 (амплитуда колебаний)
Effect radius: 500 (по умолчанию)
Duration (seconds): 7 (продолжительность встряски)
0.1 jerk, 255.0 = rumble: 15 (частота толчков; чем больше значение, тем чаще)
Флаги:
GlobalShake — землетрясение действует по всей карте
Так как мы установили флаг GlobalShake, то параметр "effect radius", определяющий радиус действия землетрясения в юнитах, не нужен. Мы просто оставляем его по умолчанию.
Продолжительность землетрясения, равная 7 секундам, специально подобрана под длительность звука, которая составляет около 8 сек.

4. Ambient_generic

И, наконец, последний объект — звук.
4. Ambient_generic (звук землетрясения)
Name: sound1
Volume: 8 (громкость звука; подбирается экспериментально)
Флаги:
Play everywhere — играть по всей карте
Start silent — не играть в начале раунда
Not toggled — звук проигрывается один раз после каждой активации
Вот и все устройство. В игре землетрясение выглядит довольно убедительно, как благодаря хорошо подобранной частоте и силе толчков, так и реалистичному звуку. Все это Вы можете проверить и сами, скачав нашу карту-пример.
earthquake.zip [412Кб] — в архиве карта-пример в форматах BSP и RMF, а также нужный звуковой файл.
20.9

Как отобрать оружие у игроков?

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

1. Отбираем оружие

Итак, чтобы в начале раунда отобрать оружие у игроков необходимо разместить в любом месте карты точечный энтити-объект player_weaponstrip. Затем в его свойствах в параметр "Name" нужно вписать специальное имя: game_playerspawn.
В статье "Активация объектов при рождении/смерти игрока" более подробно рассказано о применении специальных имен (одним из которых в частности и является game_playerspawn) для активации объектов.

2. Выдаем определенный вид оружия

Оружие мы отобрали, теперь при рождении игрок будет полностью лишен оружия (даже ножа). Причем действие объекта player_weaponstrip благодаря спец имени распространяется на всех игроков обеих команд.
Теперь, возможно, Вы хотите дать определенный вид оружия всем игрокам. Например, Вы делаете карту только на ножах или пистолетах и хотите дать каждому игроку по ножу и пистолету. Для этого необходимо вставить еще один точечный объект game_player_equip. Для удобства рекомендуем вставить его рядом с объектом player_weaponstrip.
Сразу же дайте этому объекту спец имя: game_playerspawn, чтобы он активировался сразу после рождения игрока.
Свойства game_player_equip очень просты. В них перечислены все доступные виды оружия, а также гранаты, броня, щипцы для разминирования и пр. обмундирование. Все что нужно сделать, это выставить напротив выбранного вида оружия значение "Yes" или "No".
Например, чтобы раздать игрокам ножи, выберите пункт "Give Knife" и справа в списке поставьте значение "Yes". Если хотите раздать калаши, выберите пункт "Give Ak47 (762nato Calibre)". Затем к калашу необходимо дать патроны. Выберите пункт "Give 7.62mm Nato Ammo" и справа в списке укажите сколько магазинов необходимо дать (1 Clip; 2 Clips; 3 Clips) — соответственно: 1, 2, 3 магазина патронов.
Точно также раздаются пистолеты, снайперки, дробовики, гранаты, флешки (можно выбрать 2 штуки) и пр.

3. Запрещаем покупку

Если Вы делаете карту с определенным видом оружия, то отобрать его (оружие) объектом player_weaponstrip недостаточно. Необходимо еще запретить оружие покупать.
Делается это при помощи объекта info_map_parameters. Вставьте в любое место вашей карты этот объект. Откройте свойства.
В свойствах выберите пункт "Weapon Buying" и затем в списке справа выставьте "Neither CT's or T's can buy guns". Теперь когда игрок нажмет кнопку "B", на экран выведется сообщение, что "мол, обломитесь, но покупать оружие на этой карте нельзя".
Естественно, если покупка запрещена, то нет необходимости создавать объекты func_buyzone на базах команд, напомним, что данный брашевый энтити-объект определяет место, где команды закупаются.

4. Раскладываем оружие по карте

Встречаются карты, на которых оружие валяется на земле, например: fy_iceworld, dm_aztec_maso2, dm_aztec_maso3, cs_pf_dust и др. Обычно его раскладывают на респаунах команд. Вот как это делается.
В то место, где должно появиться оружие вставьте объект armoury_entity. Разместите его несколько выше уровня земли. В свойствах выберите пунк "Item" и затем в списке справа укажите какую пушку (тип гранаты или броник) Вы хотите положить. В параметре "Count" цифрой укажите количество пушек.
Например, Вы в первом пункте выбрали "weapon_ak47" и хотите, чтобы калашей было 5 штук. Для этого в "Count" пишем цифру 5. В игре калаши будут лежать как бы друг в друге, т.е. взяв 1 калаш с земли, на его месте будет лежать еще один. Когда Вы возьмете пятый калаш, халява закончится :)
Если Вы делаете карту на снайперках, то можете разместить по 10 объектов armoury_entity около баз обеих команд, выставить "Item": weapon_awp и "Count": 1. Но помните, что оружие сильно повышает параметр epoly (сокр. от entity poligons, подробнее Вы можете прочитать в разделе об r_speeds). Нежелательно, чтобы epoly превышал значение 4500-6000 (дальше карта начинает тормозить), так что или раскладывайте оружие по разным частям карты или уменьшайте его количество.
Таким образом, оперируя этими четырмя объектами, Вы можете сделать карту на любом типе оружия, можете выдавать его игрокам при рождении или же разложить его по карте, чтобы игроки сами подбирали его.
20.10

Как поставить бомбу под водой?

В этой статье мы расскажем об одной небольшой хитрости, которая позволит Вам сделать подводный бомб-плейс!
Прежде всего необходимо отметить тот факт, что установленная в воде бомба не взрывается — она пиликает до самого конца, а затем бесследно исчезает, никакого взрыва естественно нет.
Если Вы протестируете нашу карту-пример, то увидите, что там данного глюка нет.
Бомба не только устанавливается...
Установленная под водой бомба
...но и прекрасно взрывается:
Взрыв установленной под водой бомбы
На счет взрыва мы поговорим чуть ниже, а пока раскроем данный секрет.
Для того, чтобы бомба могла взорваться в воде, необходимо немного приподнять воду над землей. Достаточно оставить между землей и водой промежуток в 1 юнит. Схематически это показано на рисунке ниже.
t24bombwater3 В таком случае бомба падает сквозь воду и касается земли, этого достаточно, чтобы она взорвалась.

Недостаток метода

Все было бы прекрасно, если бы не одно "НО". Все мы прекрасно знаем, чем опасна взрывающаяся бомба — ударной волной. У нас же в случае с подводной бомбой взрыв распространяется только на воду, т.е. если мы будем стоять на суше (даже на очень близком расстоянии от бомбы), то повреждений не получим! Но стоит только нам зайти в воду...
Но это единственный минус, который, кстати, может быть исправлен установкой около воды объектов env_explosion, которые можно активировать при взрыве бомбы. Но это тема уже отдельной статьи "Взрывы, мины и растяжки".
bomb_under_water.zip [27Кб] — в архиве карта-пример в форматах BSP и RMF.
20.11

Канализация, туннель

В этой статье мы познакомим Вас с техникой создания канализаций :) Помните подземный ход на cs_militia? Вот, подобный туннель мы сейчас и научим Вас создавать.
На рисунке ниже показано, что канализация пройдет от пункта А до Б и будет иметь один изгиб на 90 градусов.
План канализации
Чтобы построить канализацию, нам нужен довольно толстый пласт земли под картой. Нормальным считается ход высотой и шириной 128 юнитов, следовательно, толщина земли должна быть немного больше. У нас на тестовой карте толщина земного пласта 256 юнитов.
Разрезаем землю на 3 горизонтальных пласта. Верхний — 64 юнита (он будет над головой игрока),
средний — 128 юнитов (в нем мы вырежем подземный туннель) и нижний — 64 юнита (по нему игрок будет ходить).
Разрезаем землю на 3 части
Теперь скроем верхний пласт земли (чтобы он нам не мешал делать проход), оставив два нижних.
Средний пласт разбиваем на несколько брашей, чтобы получился проход от точки А до точки Б. Ширина и высота прохода 128 юнитов. Нижний пласт мы, естественно, не разрезаем, по нему игрок будет ходить.
В среднем пласте вырезаем проход от точки А к точке Б
Проход практически готов. Остается сделать его менее квадратным, добавить лампочек, сделать люки и лестницы, чтобы залезать с улицы.
Скруглять туннель мы будем при помощи вот таких треугольных брашей (см. рис. ниже), расположенных по углам прохода.
Скругляем проход по углам треугольными брашами
Вы можете сделать более 4-х скругляющих брашей, но чтобы упростить статью, мы сделали минимум — четыре.
Дальше вытягиваем браши по всей длине прохода (см. рис. ниже), а также копируем все четыре браша и вставляем во вторую "ветку" туннеля. При этом мы получим пересечение двух групп скругляющих брашей (см. рис. ниже).
Пересечение двух групп скругляющих брашей
Чтобы убрать лишние части пересекающихся брашей, выберем первую группу объектов, поставим 2D-вид сверху и инструментом Clip обрежем группу объектов под углом 45° (см. рис. ниже).
t24sewer5 Также поступаем со второй группой брашей. И теперь обе группы прекрасно пересекаются под углом 45° и не надо ничего править инструментом для работы с вертексами!
t24sewer6 В итоге обе группы на виде сверху должны выглядеть так:
t24sewer7 А так пересечение теперь выглядит в 3D-виде:
Так выглядит пересечение двух групп брашей в 3D-виде
Самое время вспомнить про верхний пласт земли. Включим его.
Теперь надо прорезать люки, чтобы можно было спускаться в канализацию. Проще всего сделать это инструментом "Carve". Для этого создаем браш с длиной и шириной 48 юнитов (минимальная ширина должна быть 33 юнита, чтобы игрок мог пролезть в отверстие). По высоте браш должен быть больше 64 юнитов (напомним, толщина верхнего пласта земли у нас 64 юнита), чтобы он высовывался и в туннеле, и на поверхности земли. Дальше применяем к брашу функцию Carve.
Люк готов. Можно также скруглить его четырмя треугольными брашами, как это мы делали в канализации.
Прорезаем люк. Скругляем треугольными брашами
У люка делаем лестницу, можно вставить звук (ambient_generic) с падающими каплями воды (путь к звуку: ambience/drips.wav) и добавляем по длине туннеля лампочки (light). Для лампочек мы выставили яркость 140 единиц, в итоге туннель получился довольно светлым.
Создаем лестницу у люка, добавляем звук падающих капель воды и вставлем несколько лампочек
Естественно, то же самое мы делаем с окончанием туннеля: такой же люк, звук и лестницу.
Все.
sewer.zip [40Кб] — в архиве карта-пример в форматах BSP и RMF.
20.12

Катапульта на карте de_rats3

Все знают серию карт DE_RATS и в частности карту DE_RATS3, на которой есть катапульта. В этой статье мы расскажем как она устроена. Для создания катапульты потребуются следующие энтити-объекты: Для тех, кто не помнит, как выглядит катапульта на DE_RATS3, и какие эффекты создаются при прыжке с нее, напомним:
Катапульта на De_Rats3
Для создания полной копии такой катапульты необходимо 23 энтити-объекта! Однако сразу спешим Вас успокоить, львиная доля, а именно 18 из 23 объектов, используется для реализации эффектов с лучами. Если такие эффекты Вам не нужны, просто не создавайте эти 18 объектов, а ограничьтесь 5-ю.
Мы сначала рассмотрим создание катапульты без каких либо эффектов. А во второй части статьи разберемся, как устроен эффект с лучами.

1. Создание катапульты

Работу катапульты обеспечивают 5 объектов (см. схему ниже).
  1. Игрок попадает в trigger_multiple
  2. Trigger_multiple активирует звук подъема игрока (ambient_generic), а также 2 триггера trigger_relay
  3. Триггеры trigger_relay включают и через 1,5 секунды выключают "толкатель" (trigger_push)
  4. Trigger_push толкает игрока вверх
t24rats30 Теперь посмотрим, как это реализовано в редакторе.
Мы имеем площадку, окрашенную черной текстурой (см. рис. ниже). На рисунке она скрыта многочисленными объектами. Это простой браш, изображающий место для толкания.
На остальные объекты пока внимания не обращайте, чтобы не запутаться.
Итак, первым делом над этим брашем создаем trigger_multiple (показан стрелкой).
Trigger_multiple и 2 trigger_relay
Теперь внутри trigger_multiple (т.е. чуть выше толкательного браша) создаем звук подъема игрока вверх (ambient_generic). На рисунке объект ambient_generic скрыт триггером, но он там есть :) и это будет видно на предпоследнем рисунке статьи.
Далее создаем два триггера trigger_relay (см. рис. выше, в верху). Один из этих триггеров будет включать толкатель, а другой через 1,5 секунды выключать.
Теперь посмотрите на рисунок ниже. Там показан объект trigger_push, который закрывает собой уже созданный нами trigger_multiple. На остальные объекты, повторимся, пока внимания не обращайте.
Trigger_push и есть толкающий вверх объект. Форма этого триггера повторяет форму черного браша, т.е. является 8-ми гранной призмой.
Trigger_push
Вот собственно и все, что касается непосредственно катапульты. Она уже будет работать, ну, конечно, после выставления всех свойств энтити-объектов.
Свойства объектов, составляющих катапульту.
1. Trigger_multiple (активирует звук и 2 триггера)
Target: sponge_jump (это имена звука и двух trigger_relay)
Delay before trigger: 0 (срабатывает без задержки, т.е. через 0 секунд)
Delay before reset: 2 (в следующий раз сработает через 2 секунды)
2. Ambient_generic (звук прыжка)
Name: sponge_jump
Path: weapons/electro5.wav (путь к звуку)
Volume: 5 (громкость)
Флаги:
Medium Radius — средний радиус распространения звука
Start Silent — изначально (в начале раунда) звук молчит
Not Toggled — играет 1 раз (затем его необходимо активировать повторно)
3. Trigger_relay (включает толкатель)
Name: sponge_jump
Target: sponge_push (ВКЛючает толкатель)
Delay before trigger: 0 (мгновенно включает толкатель, т.е. через 0 секунд)
Trigger state: On (здесь указывается, что триггер работает только на ВКЛючение)
4. Trigger_relay (выключает толкатель через 1,5 секунды)
Name: sponge_jump
Target: sponge_push (ВЫКЛючает толкатель через 1,5 секунды)
Delay before trigger: 1.5 (время до выключения толкателя)
Trigger state: Off (здесь указывается, что триггер работает только на ВЫКЛючение)
5. Trigger_push (толкатель)
Name: sponge_push
Angle: Up (направление толкания игрока, вверх)
Delay before trigger: 0
Speed of push: 3000 (скорость толкания игрока)
Флаги:
Start Off — изначально (в начале раунда) толкатель выключен

2. Создание эффектов из лучей

Теперь разберем сложную часть катапульты — эффект "кривых" лазерных лучей (см. самый первый рис.).
Схема работы выглядит следующим образом:
  1. В начале игры 3 триггера (trigger_auto) запускают в движение 3 невидимых поезда (func_train)
  2. Эти 3 поезда (func_train) начинают ездить по кругу из 8-ми объектов path_corner
  3. Когда игрок начинает прыгать, происходит активация всех трех источников лучей (env_beam)
  4. Лазерные лучи начинают бить из центральной точки (info_target) в ездящие по кругу поезда
Хитроумность данного эффекта заключается в том, что в нем используется 3 объекта env_beam, которые испускают лазерные лучи. Для того, чтобы разобраться с лучами, необходимо хорошо представлять работу данного объекта.
Принцип работы env_beam заключается в следующем: создается собственно объект env_beam, далее создается начальная точка для луча (какой-нибудь энтити-объект) и затем — конечная точка, куда будет бить луч (второй энтити-объект).
Весь прикол заключается в том, что первая (начальная) точка неподвижная, а вот вторая (конечная) подвижная! Движение происходит по кругу, т.е. лучи испускаются из неподвижной центральной точки и бьют в движущиеся по кругу точки. Это прекрасно видно на самом первом рисунке.
Теперь посмотрим, как это реализовано в редакторе.
На картинке ниже обратите внимание на 3 фиолетовых кубика (вверху) — это 3 env_beam (испускатели лазерных лучей). Лучи будут испускаться не из этих объектов, а из начальных точек в конечные!
Создание эффекта лазерных лучей при прыжке игрока с катапульты (Рис.1)
Желтые 8 объектов — это path_corner, т.е. точки по которым движутся неуправляемые поезда func_train.
На рисунке ниже уже создано 3 поезда (func_train), зеленого цвета. Эти 3 поезда по очереди движутся по всем 8-ми желтым точкам траектории.
Создание эффекта лазерных лучей при прыжке игрока с катапульты (Рис.2)
Помните, что для каждого func_train необходим ORIGIN-браш, т.к. это вращающийся объект. Мы максимально упростили "поезда" и сделали их из ORIGIN-брашей. Т.е. ORIGIN-браши превратили в func_train.
А теперь самое интересное. Эти 3 поезда (невидимых и нематериальных в игре) и будут конечными точками, в которые будут попадать лазерные лучи! Это назвается использованием поездов не по назначению :)
ВАЖНО! В центре, немного выше черного браша, создаем начальную точку для всех лучей. Это будет точечный объект info_target (красная мишень на рисунке выше).
И последнее, поезда необходимо автоматически привести в движение в начале раунда. Сделаем это при помощи 3-х триггеров trigger_auto. Вернемся к третьему рисунку статьи и посмотрим, где мы их разместили.
Trigger_multiple и 2 trigger_relay
Триггеры trigger_auto, напомним, автоматически активируют объект в начале игры, и это как раз пригодится нам для активации поездов.
Свойства объектов, создающих эффект лазерных лучей.
6.1 Trigger_auto (запускает 1-ый поезд)
Target: focus1 (активируется первый поезд func_train)
Delay before trigger: 0 (срабатывает без задержки, т.е. через 0 секунд)
Delay before reset: 2 (в следующий раз сработает через 2 секунды)
Trigger state: On (здесь указывается, что триггер работает только на ВКЛючение)
6.2 Trigger_auto (запускает 2-ой поезд)
Target: focus2 (активируется второй поезд func_train)
Delay before trigger: 0
Delay before reset: 2
Trigger state: On
6.3 Trigger_auto (запускает 3-ий поезд)
Target: focus3 (активируется третий поезд func_train)
Delay before trigger: 0
Delay before reset: 2
Trigger state: On
7.1 Func_train (1-ый поезд)
Name: focus1
Render mode: Texture (делает поезд невидимым)
FX Amount: 0 (делает поезд невидимым)
First stop target: focus_pc1 (имя начальной точки траектории для первого поезда)
Speed: 128 (скорость поезда)
Флаги:
Not Solid — нематериальный в игре
Другие 2 объекта func_train отличаются лишь несколькими параметрами. Их мы и рассмотрим.
7.2 Func_train (2-ой поезд)
Name: focus2
First stop target: focus_pc3 (имя начальной точки траектории для второго поезда)
7.3 Func_train (3-ий поезд)
Name: focus3
First stop target: focus_pc6 (имя начальной точки траектории для третьего поезда)
8.1-8.8 Path_corner (8 точек траектории для всех 3-х поездов)
Name: focus_pc1
Next stop target: focus_pc2 (имя следующей точки в траектории поезда)
Name: focus_pc2
Next stop target: focus_pc3 (имя следующей точки в траектории поезда)
...........
...........
...........
Name: focus_pc8
Next stop target: focus_pc1 (имя следующей точки в траектории поезда)
9. Info_target (начальная точка, откуда бьют лазерные лучи)
Name: arc_centre
10.1 Env_beam (объект, испускающий 1-ый лазерный луч)
Name: sponge_push
Start entity: arc_centre (имя начальной точки, из которой испускаются все 3 луча)
Ending entity: focus1 (имя конечной точки, в которую будет попадать 1-ый луч)
Brightness: 192 (яркость луча)
Beam color: 128 255 255 (цвет луча в формате RGB — красный, зеленый, синий)
Radius: 256 (радиус)
Life: 1 (время, в течении которого виден луч; 0 — чтобы луч не исчезал)
Width of beam: 64 (ширина луча от 0 до 255)
Ammount of noise: 255 (степень изогнутости луча, значения от 0 до 255)
Sprite name: sprites/zbeam1.spr (путь к спрайту, который будет лучем)
Texture scroll rate: 35 (скорость движения текстуры спрайта)
Frames per 10 seconds: 0 (скорость анимации луча)
Strike again time: 1 (частота появления луча, работает если Life > 0)
Damage: 0 (повреждения при поподании игрока под луч, 0 — нет повреждений)
Флаги:
Toggle — луч можно включать и выключать
Start Sparks — из места появления луча будут сыпать искры
End Sparks — из места, где заканчивается луч, будут сыпать искры
Shade Start — начало луча будет затененным
Shade End — окончание луча будет затененным
Другие 2 объекта env_beam отличаются лишь одним параметром (именем конечной точки).
10.2 Env_beam (объект, испускающий 2-ой лазерный луч)
Ending entity: focus2 (имя конечной точки, в которую будет попадать 2-ой луч)
10.3 Env_beam (объект, испускающий 3-ий лазерный луч)
Ending entity: focus3 (имя конечной точки, в которую будет попадать 3-ий луч)
Вот и все нехитрое устройство катапульты :) Если Вы дошли до конца этой статьи и при этом все поняли — наши поздравления! Вы настоящий профессиональный маппер!
trigger_push.zip [32Кб] — в архиве карта-пример в форматах BSP и RMF.
20.13

Конвейер

В этой статье мы расскажем Вам о создании конвейеров. Мы воспользуемся следующими энтити-объектами: Мы создадим не обычный конвейер, как в школьной столовой для сбора посуды :), а конвейер-трамплин. Подобные трамплины есть на карте Ka_100x100. И вот как они выглядят (скриншот с тестовой карты):
Так будет выглядеть конвейер в игре
Сам конвейер создается очень просто. Строим наклонный браш на подобие того, что изображен на рисунке выше. Окрашиваем его текстурой, в названии которой есть слово SCROLL. Это необходимо для создания эффекта прокручивания ленты конвейера. Превращаем браш в объект func_conveyor.
Сделаем наш трамплин немного интереснее — добавим звук, который будет раздаваться при прыжке игрока.
На картинке ниже показано, как это реализовано.
Устройство конвейера
На краю трамплина создаем триггер trigger_multiple, который будет активировать звук прыжка ambient_generic, расположенный тут же.
Таким образом, получается, что игрок забегает на трамплин, тот толкает его. Игрок проходит через триггер, который активирует звук.
А вот какие свойства мы выставили для этих объектов:
1. Func_conveyor (конвейер-трамплин)
Angle: 0° (угол, определяющий направление толкания игрока конвейером)
Speed: 1000 (скорость толкания, высокая)
Угол выставляется на виде сверху. Например, если игрок должен лететь на виде сверху налево, то ставим угол 180°.
2. Trigger_multiple (активирует звук прыжка)
Target: sound1 (имя звука)
Delay before reset: 0 (время, через которое триггер вновь сможет активировать звук)
3. Ambient_generic (звук прыжка)
Name: sound1
Path: weapons/g_bounce3.wav (путь к звуку)
Volume: 8 (громкость)
Флаги:
Small Radius — малый радиус распространения звука
Start Silent — изначально (в начале раунда) звук молчит
Not Toggled — играет 1 раз (затем его необходимо активировать повторно)
На нашей тестовой карте мы создали 4 трамплина с разными направлениями толкания игрока.
func_conveyor.zip [65Кб] — в архиве карта-пример в форматах BSP и RMF.
20.14

Курица на карте cs_italy

В этой статье мы расскажем как сделана курица на карте CS_ITALY.
Для ее создания необходимы следующие энтити-объекты: Давайте посмотрим на всеми любимую курицу на CS_ITALY:
Курица на Cs_Italy
Примечание: мы расскажем об "устройстве" курицы как есть, т.е. так, как это сделано на карте CS_ITALY. Данный метод имеет несколько недостатков, о которых мы расскажем в конце статьи.

1. Создание курицы (как на cs_italy)

Курица на cs_italy является моделью (файл *.mdl). Модели на карту вставляются при помощи объекта cycler. Раньше, когда данного объекта не было, модели вставлялись через объект cycler_sprite, который вообще-то предназначен для вставки спрайтов. Мы решили делать курицу "как есть", поэтому будем использовать cycler_sprite.
Проблема с курицей заключается в ее убийстве :) При отправлении курицы в мир иной, она должна исчезнуть, издать предсмертный звук и выпустить пару перышек — всего этого модель делать не умеет. Модель просто стоит на карте, она не может быть застрелена, она не может выпустить перышки, она не может издавать звуков.
Вот, как устроено убийство курицы
На самом деле игрок не убивает курицу (привет GreenPeace :). Он стреляет в невидимый разбиваемый объект func_breakable. Данный объект расположен в том же месте, где и курица.
От разрушения невидимого func_breakable активируются сразу 3 энтити-объекта, т.к. все они имеют одинаковое имя.
  1. Активируется env_render, который делает курицу-модель невидимой
  2. Активируется env_shooter, который выбрасывает перья (тоже модели)
  3. Активируется ambient_generic (т.е. раздается предсмертный крик курицы)
Рождение курицы заново
С началом нового раунда курица не станет вновь видимой! Ее необходимо сделать видмой при помощи другого объекта env_render. На CS_ITALY этот второй env_render активируется триггером, расположенным на базе контров. При рождении в начале раунда контры пробегают через триггер, и курица вновь "оживает" (становится видимой).
Расположение объектов
На рисунке ниже показано расположение объектов.
Расположение объектов на карте Cs_Italy
Черный выделенный желтой рамкой кубик — это курица. Внутри курицы расположен разбиваемый невидимый в игре объект (CS_ITALY).
Сверху курицы находится env_shooter. Этот объект выбрасывает перья от курицы. Справа внизу расположен звук (CS_ITALY), который раздается при убийстве курицы.
Слева от курицы расположены 2 объекта env_render. Один из них делает курицу невидимой, другой — наоборот видимой.
На нашей тестовой карте так же, как и на CS_ITALY, есть еще один объект — это trigger_multiple. Данный триггер, будучи активированным игроками, запускает второй env_render, который делает курицу видимой.
Trigger_multiple активирует env_render, который делает курицу видимой
Свойства энтити-объектов:
1. Cycler_sprite (используется для вставки модели курицы)
Name: chicken1 (имя курицы)
Angle: угол, который может быть использован для разворота курицы в нужном направлении
Sprite: models/chick.mdl (путь к файлу с моделью курицы)
Frames per second: 1 (скорость проигрывания анимации, т.е. 1 движение в секунду)
Render mode: Solid
FX Amount: 255 (при значении 0 — модель будет полностью невидимой)
2. Func_breakable (невидимый разбиваемый объект, расположенный на месте курицы)
Target on break: chicken1kill (имена трех объектов, активируемых при разрушении данного func_breakable)
Strenght: 1 (прочность)
Material type: flesh (тип материала, куски мяса)
Gibs Direction: Relative to attack (куски летят в направлении атаки)
Render mode: Texture
FX Amount: 0 (делает этот объект невидимым)
3.1 Env_render (делает курицу невидимой после ее убийства)
Name: chicken1kill
Target: chicken1
Render mode: Solid
FX Amount: 0 (делает курицу невидимой)
3.2 Env_render (делает курицу видимой в начале раунда)
Name: chicken1respawn
Target: chicken1
Render mode: Solid
FX Amount: 255 (делает курицу видимой)
4. Env_shooter (выбрасывает перья из "убитой" курицы)
Name: chicken1kill
Number of gibs: 15 (число выбрасываемых моделей, т.е. перьев)
Gib velocity: 100 (скорость падения перьев)
Cource variance: 5 (параметр опредляет на сколько летящие перья будут отклоняться от прямой траектории)
Gib life: 4 (время "жизни" перьев, затем они исчезают)
Model: models/feather.mdl (путь к файлу с моделью перьев)
Флаги:
Repeatable — позволяет активировать env_shooter многократно
5. Ambient_generic (звук при убийстве курицы)
Name: chicken1kill
Path: misc/killChicken.wav (путь к звуку)
Volume: 10 (громкость, максимальная)
Флаги:
Medium Radius — средний радиус распространения звука
Not Toggled — играет 1 раз (затем его необходимо активировать повторно)
6. Trigger_multiple (активирует env_render, который делает курицу видимой)
Target: chicken1respawn
Delay before reset: 180 (в следующий раз сработает только через 180 секунд)

2. Недостатки метода

При некоторых обстоятельствах курица может не появится в начале раунда, или же она может стать неубиваемой!
Все дело в триггере trigger_multiple, у которого установлено время обнуления в 180 секунд.
Автор карты расчитывал на то, что в среднем раунд длится 3 минуты или 180 секунд.
Но всем известно, что раунд может быть и 30-секундным, а может длиться более 3 минут.
Если Вы убъете курицу и раунд закончится быстрее 3-х минут, то в следующем раунде курицы не будет!
  1. Игрок убивает курицу
  2. Раунд заканчивается быстрее 3 минут, следовательно, триггер не успевает обнулится (не истекли 180 секунд)
  3. В следующем раунде игроки пробегают через триггер, но он еще не работает, следовательно, курица остается невидимой!
Если Вы убъете курицу, затем пройдет 3 минуты, и Вы еще раз пробежите через триггер на базе контров, то курица станет неубиваемой!
  1. Игрок убивает курицу
  2. Проходит 3 минуты, триггер снова может активировать появление курицы
  3. Игрок пробегает через триггер, курица становится видимой
  4. Но так как объект func_breakable уже был разбит, то курица становится неубиваемой до конца раунда!
italy_chicken.zip [17Кб] — в архиве карта-пример в форматах BSP и RMF.
20.15

Летающая птица на карте de_survivor

В этой статье мы расскажем, как сделана летающая птица на карте DE_SURVIVOR.
Кто не помнит эту птицу — вот посмотрите:
Летающая птица на De_Survivor
Для того, чтобы сделать такую птицу, нам понадобится текстура с ее изображением. Это будет текстура с маской, вот такая:
t24survivor5 А теперь собственно о том, как устроена птичка. Данный зверь будет у нас объектом func_tracktrain, который будет постоянно перемещаться по объектам path_track. Эти path_track, как известно, определяют траекторию движения для func_tracktrain.

1. Делаем птичку

Начнем с изготовления птицы. Создадим небольшой браш, в нашем случае это будет браш с размерами 96х48х8 юнитов.
Создаем небольшой браш, окрашиваем его нижнюю сторону текстурой с птицей
Нижнюю сторону браша окрасим текстурой с птицей. Все остальные стороны окрасим текстурой {BLUE. Сделаем мы это для того, чтобы они были прозрачными в игре.
Объект func_tracktrain, который будет птицей, должен содержать ORIGIN-браш. ORIGIN-браш мы разместим в центре птицы.
t24survivor3 На виде сверху хорошо видно, как размещен ORIGIN-браш:
t24survivor4 Дальше выделяем птицу вместе с ORIGIN-брашем и превращаем в объект func_tracktrain.
Выставим свойства и флаги для данного объекта.
Func_tracktrain (птица)
Render Mode: Solid (режим отображения, при котором синие части текстуры будут прозрачными)
FX Amount: 255
First stop target: 1 (имя первой точки маршрута, т.е. первого объекта path_track)
Distance between the wheels: 100 (влияет на плавность разворота птицы; больше -> плавнее)
Initial speed: 240 (начальная скорость полета птицы)
Speed: 240 (максимальная скорость птицы)
Флаги:
No User Control — чтобы игрок не мог управлять птицей
Passable — чтобы птица была нематериальной (игроки могут через нее "проходить")
Все остальные свойства можно оставить по умолчанию.
И последнее, что касается птицы. Проследите за тем, чтобы голова птицы смотрела налево на виде сверху. Т.е. Вы просто ставите в редакторе 2D-вид сверху и разворачиваете птицу головой налево. Это необходимо, чтобы игра знала, какой стороной объект func_tracktrain должен двигаться вперед. В противном случае птичка может полететь вперед хвостом :)

2. Определяем траекторию движения птицы

Теперь мы создадим 16 объектов path_track. Мы расположим их "восьмеркой", примерно так, как это сделано на карте DE_SURVIVOR.
При помощи объектов path_track определяем траекторию движения птицы
Чем больше path_track Вы создадите, тем более плавной будет траектория полета птицы. Хотя можно сделать много path_track, а траектория все равно будет угловатой :) Тут уж все зависит от Вашего глазомера.
Свойства всех объектов path_track схожи. Разница лишь в названии объектов и в названии следующей точки траектории.
Path_track (16 точек, составляющих траекторию полета птицы)
Name: 1
Next stop target: 2 (имя следующего объекта path_track в траектории)
Name: 2
Next stop target: 3
...........
...........
...........
Name: 16
Next stop target: 1
Из приведенных выше свойств видно, что у каждого объекта DE_SURVIVOR в параметре Next stop target прописано имя следующего DE_SURVIVOR в траектории.
У самого последнего — шестнадцатого — объекта в данном параметре записано имя начальной — первой — точки траектории. Таким образом, птица будет летать бесконечно по восьмерке.
Птицу можно разместить в любом месте карты. Но для удобства, разместите ее около какого-нибудь объекта DE_SURVIVOR. И не забудьте направить голову птицы налево на виде сверху.
Чтобы птичка еще что-нибудь кричала, можно сделать объект DE_SURVIVOR, в котором указать звуковой файл с криком птички. Активировать его можно объектом DE_SURVIVOR.
Если что-то осталось для Вас не ясным, Вы можете скачать нашу карту-пример.
func_tracktrain.zip [28Кб] — в архиве карта-пример в форматах BSP и RMF, а также нужный текстурный файл.
20.16

Маятник

В этой статье мы рассмотрим создание маятника. Нам понадобятся два объекта (звук и собственно маятник): Давайте подумаем, как часто на CS-картах встречаются часы с маятником и вообще нужны ли они? Ответ вполне очевиден. Но ведь мы знаем, что объекты в Half-Life не являются какими-то конкретными предметами. Например, в HL нет стиральной машины (func_clotheswasher :), однако мы можем ее изобразить при помощи других объектов. Так вот и в нашем случаем мы будем использовать func_pendulum не по своему прямому назначению.
Мы создадим подвесной мост, раскачивающийся из стороны в сторону. Согласитесь, что в некотором роде такой мост тоже является маятником. Вот как он будет выглядеть:
Так мост будет выглядеть в игре
Мы не будем подробно останавливаться на создании самого моста, т.к. каждый вправе самостоятельно решить, какой мост будет лучше смотреться на его карте. Мы считаем более важным рассказать о расположении ORIGIN-браша, который обязательно должен быть у func_pendulum, т.к. это вращающийся объект.
На рисунке ниже показано, как расположен ORIGIN-браш по отношению к мосту. Форма ORIGIN-браша не имеет значения, главным является расположение его центра. Для наглядности мы удлинили ORIGIN-браш вдоль оси Y (оси вращения).
Так мы расположили ORIGIN-браш
На следующих двух картинках Вы можете более четко увидеть, как расположен ORIGIN-браш на видах сверху и спереди. Для большей наглядности внизу каждой картинки мы разместили 3-х мерный вид (ORIGIN-браш отмечен белой стрелкой).

t24pendulum2 t24pendulum3 Итак, выделяем все браши, составляющие мост (это и доски, и канаты) и ORIGIN-браш, и превращаем в func_pendulum . Теперь все, что выделено (см. рис. ниже) будет вращаться (раскачиваться) вокруг ORIGIN-браша.
Выделяем все браши, составляющие мост (доски, канаты и ORIGIN-браш)
Теперь необходимо выставить свойства и флаги для func_pendulum.
Func_pendulum (раскачивающийся мост)
Speed: 3 (скорость раскачивания моста; очень медленная)
Distance (deg): 2 (угол раскачивания моста)
Damping (0-1000): 0 (замедление при раскачивании до остановки)
Damage inflicted when blocked: 0 (повреждения игроку; по умолчанию отключены)
Флаги:
Start ON — раскачиваться в начале раунда
Y Axis — вращение вдоль оси Y

Определение оси вращения

Мост раскачивается вдоль одной из горизонтальных осей (X или Y), поэтому во флагах необходимо отметить флаг или X Axis, или Y Axis.
Ось определяем на виде сверху (см. рис.3). На виде сверху ось, вдоль которой раскачивается мост, вертикальна, а значит это ось Y. Следовательно во флагах отмечаем Y Axis.

Вставляем звук

Для придания большей реалистичности около середины моста вставим звук ambient_generic. Звук раскачивания моста (скрип натянутых канатов) будет воспроизводиться постоянно, как бы повторяя движения моста слева-направо и обратно.
Так как звук будет повторяться бесконечно, то он должен содержать ключевую точку (cue point), которая дает знать движку Half-Life откуда начинать повторение. Подробнее о создании бесконечно играющих звуков Вы можете прочитать в этой статье.
Свойства ambient_generic мы приводить не будем, потому как Вы прекрасно их знаете :) Данный объект неоднократно использовался в других наших уроках.
func_pendulum.zip [74Кб] — в архиве карта-пример в форматах BSP и RMF, а также нужный звуковой файл.
20.17

Подсчет фрагов на табло

В данной статье мы расскажем о создании табло с подсчетом фрагов. Такое табло Вы могли видеть на карте Ka_100x100. При каждом убийстве игрока счетчик увеличивается на единицу. Счетчик имеет 3 разряда: единицы, десятки, сотни, т.е. максимальное количество фрагов составляет 999, затем происходит обнуление.
Мы будем очень активно использовать следующие энтити-объекты: Приготовьтесь к созданию 94 объектов и выставлению их свойств :) Ничего страшного нет, вся система построена как бы из повторяющихся звеньев. Каждое звено состоит из 3-4 объектов, свойства которых очень схожи.
Итак, давайте посмотрим, как будет выглядеть табло:
Так будет выглядеть табло с подсчетом фрагов в игре
Нолики и другие цифры, которые будут появляться при каждом фраге, не просто картинки, это объекты func_button с нанесенными на них цифрами. Когда убьют какого-либо игрока, кнопка с цифрой "0" поднимется вверх, а сверху опустится кнопка с цифрой "1". При следующем фраге кнопка с цифрой "1" поднимется вверх, а сверху опустится кнопка с цифрой "2" и т.д.
Средняя цифра меняется только при каждом десятом фраге. Левая цифра (разряд сотен) меняется только при каждом сотом фраге.
Изначально кнопку с цифрой "0" необходимо разместить так, чтобы ее было видно на табло. Остальные кнопки с цифрами от 1 до 9 нужно разместить над кнопкой 0 так, чтоб они были скрыты в "конструкции табло". Всего необходимо создать 30 кнопок (по 10 на разряды единиц, десятков и сотен). Из этих 30 кнопок сразу будут видны только 3 — это изначальные нули, остальные 27 будут скрыты в табло.
Кстати, мы рекомендуем конструкцию табло (т.е. все, что окружает кнопки) превратить в func_wall, чтобы при компиляции свет мог проникнуть через конструкцию (как известно, энтити-объекты пропускают свет) и осветил текстуры цифр (иначе текстуры получатся затемненными).
Внизу — кнопки 0, вверху — кнопки с 1 по 9 (находятся в одном и том же месте)

О подсчете фрагов

Теперь расскажем о том, как будут подсчитываться фраги.
У нас есть замечательный энтити-объект game_counter, который считает свои активации и по достижении определенного значения активирует другой объект.
Мы создадим 3 таких объекта:
  • Первый будет считать отдельные фраги (он будет переключать кнопки единиц)
  • Второй будет считать до 10 фрагов (он будет переключать кнопки десятков)
  • Третий будет считать до 100 фрагов (он будет переключать кнопки сотен)
Нам нужно, чтобы при каждом фраге все 3 счетчика увеличивали свое значение на 1. Для этого воспользуемся объектом multi_manager, в который запишем активацию всех 3-х счетчиков. Имя для multi_manager'а нужно выставить как game_playerkill. Это одно из пяти специальных имен, которое позволяет активировать объект при убийстве игрока. Таким образом, теперь при каждом фраге у нас будет автоматически активироваться multi_manager, который в свою очередь активирует 3 счетчика.
Multi_manager (этот объект активируется при каждом фраге)
Name: game_playerkill (имя должно быть именно таким!)
1counter — 0 (активация счетчика единиц по имени 1counter через 0 секунд)
10counter — 0 (активация счетчика десятков по имени 10counter через 0 секунд)
100counter — 0 (активация счетчика сотен по имени 100counter через 0 секунд)
Счетчики game_counter с именами: 1counter, 10counter, 100counter активируют кнопки с цифрами. Например, кто-то набрал 1 фраг. Срабатывает multi_manager. Тут же все три счетчика увеличивают свое значение на 1. Самый первый счетчик ведет отсчет отдельных фрагов, а значит он должен при каждой активации переключать кнопки единиц.
Нам необходимо сделать так, чтобы активировав первую кнопку, в следующий раз счетчик активировал бы вторую кнопку, затем третью и т.д., то есть необходимо, чтобы параметр "Target" счетчика менялся по кругу от 0 до 9 кнопки. Это можно организовать при помощи объекта trigger_changetarget.
Ниже приведена схема работы одного из счетчиков.
t24frag o matic1 Предположим, что кто-то набрал фраг. В этом случае возникает следующая цепочка действий:
  1. Счетчик game_counter увеличивает свое значение на 1
  2. Затем он активирует первый multi_manager (на схеме левая красная стрелка)
  3. Multi_manager поднимает кнопку "0"
  4. Multi_manager опускает кнопку "1" туда, где только что была кнопка "0"
  5. Multi_manager запускает первый объект trigger_changetarget (на схеме CT1)
  6. Trigger_changetarget перенаправляет счетчик с первого multi_manager'а на второй
Дальше действия развиваются по второй красной стрелке на схеме (все действия аналогичные).
  1. Счетчик game_counter увеличивает свое значение на 1
  2. Активирует второй multi_manager (вторая красная стрелка)
  3. Multi_manager поднимает кнопку "1"
  4. Multi_manager опускает кнопку "2" туда, где только что была кнопка "1"
  5. Multi_manager запускает второй объект trigger_changetarget (на схеме CT2)
  6. Trigger_changetarget перенаправляет счетчик со второго multi_manager'а на третий
Тоже самое происходит при смене кнопки "2" на кнопку "3" и т.д. до кнопки "9". Таким образом, для разряда единиц необходимо создать 10 подобных звеньев из multi_manager'а, двух кнопок и trigger_changetarget (всего: 30 объектов).
Для раздела десятков все тоже самое (нужно создать еще 30 объектов, считая кнопки десятков), единственная разница в свойствах счетчика — он активирует кнопки через каждые 10 фрагов, а не через каждый фраг. Для сотен — еще 30 объектов. А счетчик сотен активирует кнопки через каждые сто фрагов, т.е. довольно редко.
Рекомендуем размещать счетчики единиц, десятков и сотен рядом с соответствующими мульти_менеджерами и прочими объектами (чтобы не запутаться). Вы можете посмотреть, как это сделано на нашей тестовой карте.

Свойства объектов для счетчика единиц

Ниже мы приводим свойства самого первого звена объектов (на схеме к этому звену ведет левая красная стрелка).
Game_counter (счетчик единиц)
Name: 1counter (имя счетчика единиц)
Target: m0 (сюда необходимо записать имя самого первого объекта multi_manager, см. схему выше)
Initial Value: 0 (начальное значение счетчика — 0)
Limit Value: 1 (конечное значение, достигнув которого, счетчик начнет активировать кнопки; т.к. это счетчик единиц, то необходимо поставить значение 1)
Флаги:
Reset on fire: нужно отметить этот флаг, чтобы счетчик сбрасывался на 0 (обнулялся), когда достигаеся значение "Limit Value"
Multi_manager (этот объект опускает/поднимает кнопки, активирует другие объекты)
Name: m0 (имя данного объекта)
btn0 — 0 (поднимает кнопку "0")
btn1 — 0 (опускает кнопку "1")
ct0 — 0 (запускает объект trigger_changetarget)
Func_button (кнопка "0", разряд единиц)
Name: btn0 (имя кнопки "0" из разряда единиц)
Angle: Up (направление движения вверх)
Speed: 200 (скорость движения)
Lip: -8 (этот параметр управляет расстоянием, на которое перемещается кнопка; отрицательное значение увеличивает расстояние, положительное уменьшает)
Delay before reset: 0 (время, после прошествия которого, кнопку можно вновь активировать)
Флаги:
Toggle: этот флаг оставляет кнопку в нажатом положении до следующей активации
Func_button (кнопка "1", разряд единиц)
Name: btn1 (имя кнопки "1" из разряда единиц)
Angle: Down (направление движения вниз, т.к. изначально кнопка расположена выше табло)
Speed: 200 (скорость движения)
Lip: -8 (этот параметр управляет расстоянием, на которое перемещается кнопка; отрицательное значение увеличивает расстояние, положительное уменьшает)
Delay before reset: 0 (время, после прошествия которого, кнопку можно вновь активировать)
Флаги:
Toggle: этот флаг оставляет кнопку в нажатом положении до следующей активации
Trigger_changetarget (меняет параметр "Target" счетчику единиц)
Name: ct0 (имя данного объекта)
Target: 1counter (здесь указывается имя счетчика единиц)
New Target: m1 (означает, что в следующий раз счетчик будет активировать объект по имени m1, т.е. следующий мульти_менеджер из второго звена)
Это первое звено объектов, которые меняют цифру 0 на цифру 1. Как Вы понимаете, необходимо сделать еще 9 таких звеньев.

Свойства объектов для счетчика десятков

Ниже мы приводим свойства первого звена объектов для счетчика десятков.
Game_counter (счетчик десятков)
Name: 10counter (имя счетчика десятков)
Target: m00 (сюда необходимо записать имя самого первого объекта multi_manager в звене десятков)
Initial Value: 0 (начальное значение счетчика — 0)
Limit Value: 10 (конечное значение, достигнув которого, счетчик начнет активировать кнопки; т.к. это счетчик десятков, то необходимо поставить значение 10)
Флаги:
Reset on fire: нужно отметить этот флаг, чтобы счетчик сбрасывался на 0 (обнулялся), когда достигаеся значение "Limit Value"
Multi_manager (этот объект опускает/поднимает кнопки, активирует другие объекты)
Name: m00 (имя данного объекта)
btn00 — 0 (поднимает кнопку "0" в разряде десятков)
btn11 — 0 (опускает кнопку "1" в разряде десятков)
ct00 — 0 (запускает объект trigger_changetarget)
Func_button (кнопка "0", разряд десятков)
Name: btn00 (имя кнопки "0" из разряда десятков)
Angle: Up (направление движения вверх)
Speed: 200 (скорость движения)
Lip: -8 (этот параметр управляет расстоянием, на которое перемещается кнопка; отрицательное значение увеличивает расстояние, положительное уменьшает)
Delay before reset: 0 (время, после прошествия которого, кнопку можно вновь активировать)
Флаги:
Toggle: этот флаг оставляет кнопку в нажатом положении до следующей активации
Func_button (кнопка "1", разряд десятков)
Name: btn11 (имя кнопки "1" из разряда десятков)
Angle: Down (направление движения вниз, т.к. изначально кнопка расположена выше табло)
Speed: 200 (скорость движения)
Lip: -8 (этот параметр управляет расстоянием, на которое перемещается кнопка; отрицательное значение увеличивает расстояние, положительное уменьшает)
Delay before reset: 0 (время, после прошествия которого, кнопку можно вновь активировать)
Флаги:
Toggle: этот флаг оставляет кнопку в нажатом положении до следующей активации
Trigger_changetarget (меняет параметр "Target" счетчику десятков)
Name: ct00 (имя данного объекта)
Target: 10counter (здесь указывается имя счетчика десятков)
New Target: m11 (означает, что в следующий раз счетчик будет активировать объект по имени m11, т.е. следующий мульти_менеджер из второго звена)
Это первое звено объектов, которые меняют цифру 0 на цифру 1 в разряде десятков. Дальше необходимо создать еще 9 таких звеньев.

Свойства объектов для счетчика сотен

Ниже мы приводим свойства первого звена объектов для счетчика сотен.
Game_counter (счетчик сотен)
Name: 100counter (имя счетчика сотен)
Target: m000 (сюда необходимо записать имя самого первого объекта multi_manager в звене сотен)
Initial Value: 0 (начальное значение счетчика — 0)
Limit Value: 100 (конечное значение, достигнув которого, счетчик начнет активировать кнопки; т.к. это счетчик сотен, то необходимо поставить значение 100)
Флаги:
Reset on fire: нужно отметить этот флаг, чтобы счетчик сбрасывался на 0 (обнулялся), когда достигаеся значение "Limit Value"
Multi_manager (этот объект опускает/поднимает кнопки, активирует другие объекты)
Name: m000 (имя данного объекта)
btn000 — 0 (поднимает кнопку "0" в разряде сотен)
btn111 — 0 (опускает кнопку "1" в разряде сотен)
ct000 — 0 (запускает объект trigger_changetarget)
Func_button (кнопка "0", разряд сотен)
Name: btn000 (имя кнопки "0" из разряда сотен)
Angle: Up (направление движения вверх)
Speed: 200 (скорость движения)
Lip: -8 (этот параметр управляет расстоянием, на которое перемещается кнопка; отрицательное значение увеличивает расстояние, положительное уменьшает)
Delay before reset: 0 (время, после прошествия которого, кнопку можно вновь активировать)
Флаги:
Toggle: этот флаг оставляет кнопку в нажатом положении до следующей активации
Func_button (кнопка "1", разряд сотен)
Name: btn111 (имя кнопки "1" из разряда сотен)
Angle: Down (направление движения вниз, т.к. изначально кнопка расположена выше табло)
Speed: 200 (скорость движения)
Lip: -8 (этот параметр управляет расстоянием, на которое перемещается кнопка; отрицательное значение увеличивает расстояние, положительное уменьшает)
Delay before reset: 0 (время, после прошествия которого, кнопку можно вновь активировать)
Флаги:
Toggle: этот флаг оставляет кнопку в нажатом положении до следующей активации
Trigger_changetarget (меняет параметр "Target" счетчику сотен)
Name: ct000 (имя данного объекта)
Target: 100counter (здесь указывается имя счетчика сотен)
New Target: m111 (означает, что в следующий раз счетчик будет активировать объект по имени m111, т.е. следующий мульти_менеджер из второго звена)
Это первое звено объектов, которые меняют цифру 0 на цифру 1 в разряде сотен. Дальше необходимо создать еще 9 таких звеньев.
Вот и все нехитрое устройство счетчика фрагов :) Думается, немногие мапперы дочитают эту статью до конца, но поверьте, придумать такое, да еще и понятно описать оч-ч-чень трудно. В любом случае Вы можете скачать нашу карту-пример и скопировать счетчик на свою карту. Используйте на здоровье!
frag-o-matic.zip [93Кб] — в архиве карта-пример в форматах BSP и RMF.
20.18

Пузырьки

В этой статье мы расскажем как создаются пузырьки воздуха, поднимающиеся со дна к поверхности воды.
Для создания пузырьков используется энтити-объект env_bubbles. Чтобы создать такой объект, нужно выбрать текстуру AAATrigger, построить браш произвольных размеров и затем превратить его в env_bubbles.
Посмотрите на картинку ниже, на ней мы видим 2 объекта env_bubbles, окрашенные текстурой AAATrigger.
Так пузырьки выглядят в редакторе
Пузырьки будут подниматься от нижней части env_bubbles к верхней. Высота объектов env_bubbles на нашей тестовой карте составляет 176 юнитов, это значит, что пузырьки будут подниматься именно на такое расстояние.
У env_bubbles есть несколько параметров, которые определяют количество пузырьков, скорость их всплытия и частоту появления.
Env_bubbles (пузырьки)
Name — если дать пузырькам имя, то их можно будет включать/выключать, например, кнопкой
Bubble Density — количество пузырьков
Bubble Frequency — частота появления пузырьков
Speed of Current — чем больше это значение, тем больше пузырьков будет придерживаться прямолинейного направления
Флаги:
Start Off — если отмечено, то пузырьки не появятся до тех пор, пока их не активируют
Где использовать такие пузырьки — решать Вам.
Мы, например, создали вот такой морской аквариум :)
Так пузырьки выглядят в игре
Карта-пример, как всегда, поможет Вам, если Вы что-то не поняли.
env_bubbles.zip [66Кб] — в архиве карта-пример в форматах BSP и RMF.
20.19

Пулемет

В этой статье мы расскажем, как создаются управляемые пулеметы. Нам понадобятся следующие энтити-объекты: Так будет выглядеть пулемет в игре:
Так будет выглядеть пулемет в игре
Вы можете придать пулемету какую угодно форму, можете сделать его маленьким или огромным — это не имеет значения. При создании пулемет необходимо ориентировать дулом направо на виде сверху, это необходимо для того, чтобы игра могла определить, откуда должны вылетать пули :) Если Вы хотите, чтобы в начале раунда пулемет был направлен в какую-то определенную сторону — выставьте направление углом "Angle".
Наиболее важной частью пулемета (а это объект func_tank) является ORIGIN-браш. ORIGIN-брашем задается точка, вокруг которой пулемет будет вращаться. Размер ORIGIN-браша значения не имеет, важно расположение его центра (впрочем, Вы это уже давно знаете :)
Что еще следует знать об ORIGIN-браше в пулемете? От положения его центра зависит какие параметры Вы должны будете выставить в свойствах пулемета, например, необходимо будет указать длину ствола, расстояние от центра ствола до ORIGIN-браша — все эти параметры отсчитываются от центра ORIGIN-браша.
Итак, форма пулемета определена. Создаем ORIGIN-браш и помещаем его куда-нибудь в центр пулемета. Затем выделяем все браши, составляющие пулемет, также выделяем ORIGIN-браш и превращаем это дело в func_tank.
Создаем пулемет и звук стрельбы
Чуть выше пулемета Вы можете видеть объект ambient_generic — это звук стрельбы пулемета (на нашей тестовой карте мы использовали свой звук, который поместили в папку "cstrike/sound/ambience..").
Func_tank (пулемет)
Name: gun (имя пулемета)
Target: gun_sound (имя объекта ambient_generic — звука выстрелов)
Yaw rate: 60 (скорость движения пулемета по горизонтали)
Yaw range: 150 (угол поворота по горизонтали в градусах)
Pitch rate: 15 (скорость движения пулемета по вертикали)
Pitch range: 45 (угол поворота по вертикали в градусах)
Barrel Length: 66 (расстояние в юнитах от центра ORIGIN-браша до конца ствола)
Barrel Horizontal: 0 (расстояние в юнитах от центра ORIGIN-браша до центра ствола по горизонтали)
Barrel Vertical: 0 (расстояние в юнитах от центра ORIGIN-браша до центра ствола по вертикали)
Rate of Fire: 20 (скорострельность, выстрелов в секунду)
Damage Per Bullet: 10 (убойная сила пуль)
Bullet accuracy: small cone (точность выстрелов, небольшое отклонение)
Bullets: 12mm (калибр пуль)
Флаги:
Controllable: следует отметить, чтобы игрок мог управлять пулеметом
Свойства звука стрельбы выглядят так:
Ambient_generic (звук стрельбы)
Path: ambience/dm_gun.wav (путь к звуку, в данном случае это наш собственный файл)
Volume: 10 (громкость, максимальная)
Флаги:
Small radius: маленький радиус распространения
Start silent: "молчит" в начале раунда
Not toggled: не повторяется бесконечно (звучит только при активации)
И последний, но неменее важный объект: func_tankcontrols — область, откуда игрок управляет пулеметом.
Как создается эта область? Сначала делаем обычный браш (размером, скажем, 64х64х32 юнита). Окрашиваем его со всех сторон спецтекстурой AAAtrigger и превращаем в func_tankcontrols.
Создаем область управления пулеметом
Если при тестировании работы пулемета Вы никак не можете найти область управления — значит разместили ее не в том месте, где следует.
Func_tankcontrols (область, откуда игрок управляет пулеметом)
Tank entity name: gun (сюда записываем имя пулемета)
Если что-то не понятно, скачайте карту-пример. На ней Вы, кстати, сможете пострелять из пулемета по разбиваемым ящикам 8]
pulemet.zip [72Кб] — в архиве карта-пример в форматах BSP и RMF, а также необходимый звук.
20.20

Скалы

В этой статье мы познакомим Вас с техникой создания скал, которая была применена маппером N0TH1NG при создании карты CS_SIEGE.
На картинке ниже показано, как будут выглядеть скалы:
Так будут выглядеть скалы в игре
Метод создания таких скал можно назвать "методом треугольников", т.к. скалы будут иметь треугольные грани.
Итак, в самом начале около простой, отвесной скалы создаем равный по высоте браш. Толщину выберем произвольно, например, 64 юнита. На картинке ниже браш показан в режиме работы с вертексами, т.к. сейчас нам понадобится совместить некоторые из вершин.
Шаг 1. Делаем простой браш
Переведя браш в режим работы с вертексами, выделяем правые (верхний и нижний) вертексы и совмещаем их с другими вертексами, как показано на рисунке ниже (выделять вертексы удобно в 3D-виде, а совмещать/переносить на 2D-виде).
При совмещении вершин будет задан вопрос "Merge vertices?" ("Совместить вершины?"), отвечайте — Да.
Шаг 2. Совмещаем правые вертексы
Переносим левый нижний вертекс:
Шаг 3. Переносим левый нижний вертекс
И заканчиваем совмещением правого вертекса с левым:
Шаг 4. Совмещаем правый и левый вертексы
Теперь можно скопировать образовавщийся браш треугольной формы и вставить рядом его копию, как показано на рисунке ниже. Здесь удобно использовать зеркальное (горизонтальное или вертикальное) отражение браша (сочетания клавиш: Ctrl-I и Ctrl-L).
Шаг 5. Делаем копию получившегося браша
Подобным образом создаются и другие "куски" скал. Можно перевернуть треугольные браши, таким образом, чтобы расширение скалы было не сверху, а снизу — это поможет разнообразить форму скал.
На следующей картинке в виде 2D-flat показаны скалы, расширяюшиеся как к верху, так и к низу.
t24cliffs7 cliffs.zip [19Кб] — в архиве карта-пример в форматах BSP и RMF.
20.21

Снег на карте

В этой статье мы расскажем о создании падающего снега. Нам пригодятся следующие энтити-объекты: Так будет выглядеть падающий снег:
Так будет выглядеть в игре снег
Что нужно для создания холодной, снежной атмосферы?
  1. Картинки неба с заснеженным пейзажем
  2. Снег, который у нас будут изображать спрайты
  3. Звук ветра

1. Небо

Из стандартных картинок хорошо подойдет небо по имени snowlake_. Вписываем это название в параметр environment map, который доступен в меню Map/Map properties....

2. Снег

Падающий снег мы реализуем при помощи спрайтов. А спрайты вставим при помощи объектов env_sprite.
На рисунке ниже видно, что точечные объекты env_sprite расположены произвольно на некоторой высоте над землей (96-128 юнитов).
Расположение объектов на снежной карте
Все объекты env_sprite имеют одинаковые свойства, поэтому достаточно создать всего лишь один такой объект, указать для него свойства, а затем просто размножить до нужного числа объектов.
Свойства объектов env_sprite:
Env_sprite (снежные спрайты)
Render Mode: additive (данный режим убирает черную подложку у спрайта)
FX Amount: 255
FX Color: 220 220 235 (цвет спрайта в формате RGB, т.е. красный, зеленый, синий)
Framerate: 15 (скорость смены кадров спрайта в секунду)
Sprite Name: sprites/snow.spr (путь к файлу со спрайтом снега)
Scale: 2 (масштаб спрайта)
Флаги:
Start on — чтобы спрайт проигрывался с самого начала раунда

3. Звук ветра

Звук ветра (объект ambient_generic) мы разместили в середине карты и выставили для него флаг "Play Everywhere", чтобы ветер был слышен по всей карте.
Необходимо заметить, что звук должен проигрываться бесконечно, а для этого он должен содержать специальную метку (по-английски cue point). Как создавать такие метки Вы можете узнать из статьи "Создание бесконечно играющих звуков".
Свойства звука:
Ambient_generic (звук ветра)
Path: ambience/coldwind_1.wav (путь к звуку)
Volume: 10 (громкость)
Флаги:
Play Everywhere — играет по всей карте
snow.zip [494Кб] — в архиве карта-пример в форматах BSP и RMF, а также необходимый звук и спрайт.
20.22

Табло с выбором фоновой мелодии

В данной статье мы расскажем о создании табло с кнопками, нажатие которых будет приводить к смене музыки, звучащей во время игры. Также у игрока будет возможность отключить музыку вовсе. Подобное табло Вы могли видеть на карте Ka_100x100. Особенностью данного табло будет возможность запоминания проигрываемой мелодии и воспроизведение ее в начале следущего раунда.
Мы будем активно использовать следующие энтити-объекты: Статья состоит из двух частей. В первой части мы рассказываем об устройстве табло. Во второй — о принципе действия "запоминающего устройства".

Часть 1. Устройство табло

На картинке ниже показано, как будет выглядеть табло в игре. На рисунке мы видим 3 кнопки с цифрами — это кнопки выбора 3-х различных мелодий. Кнопка "Стоп" предназначена для выключения музыки.
Так будет выглядеть табло в игре
Давайте посмотрим, что должно происходить при нажатии на ту или иную кнопку.
Предположим, игрок захотел послушать первую мелодию. Он подходит к табло и нажимает "кнопку 1". Как известно, звуки вставляются на карту при помощи объекта ambient_generic. Мы можем прописать имя этого объекта в свойства кнопки (func_button), тогда при нажатии на кнопку звук начнет проигрываться. При следующем нажатии звук выключится.
А теперь представим, что первая мелодия уже играет, и игрок решил сменить ее на вторую. Он подходит и нажимает "кнопку 2". Начинает играть вторая мелодия, но (!) первая мелодия тоже играет. Получается наложение двух мелодий. А если нажать еще и "кнопку 3", то получится совсем нехорошо :) В связи с этим возникает задача: необходимо автоматически выключать любую из играющих мелодий и включать мелодию, выбранную игроком.
Из всего этого можно сделать вывод, что при нажатии на кнопку (func_button) нам потребуется одновременно активировать несколько объектов: 2 объекта должны "глушить" две возможно играющие мелодии. То есть, например, при выборе второй мелодии, мы должны проверить: "а не играет ли первая мелодия" + "а не играет ли третья мелодия" и затем заглушить любую их них. Естественно мы заранее не знаем, какая мелодия будет играть, когда включается вторая мелодия, поэтому мы будем на всякий случай глушить обе "лишних" мелодии одновременно: как первую, так и третью.
Использование объектов
Ну, чтож, мы вплотную подошли к использованию объектов.
Теперь мы знаем, что при нажатии на любую кнопку (func_button) должны активироваться 3 объекта, а это можно сделать только через multi_manager. Проверять состояние мелодий можно при помощи trigger_relay, который, напомним, может или только включать объекты, или только выключать объекты, ну, а также он может работать, как обычный триггер в обоих направлениях, но эта функция нам сейчас неинтересна. Нам необходимо выключать "лишние" звуки, поэтому параметр "Trigger State" этого объекта мы выставим в "Off".
Давайте посмотрим, что должно происходить при нажатии на "кнопку 1". На схеме ниже видно, что при нажатии на первую кнопку, активируется multi_manager, который включает первую мелодию, глушит вторую мелодию объектом trigger_relay и глушит третью мелодию еще одним объектом trigger_relay.
t24melody2 Такие же операции происходят при нажатии на вторую и третью кнопки. Разница лишь в запускаемых и глушимых мелодиях. Таким образом, нам необходимо создать:
  • 4 кнопки : func_button
  • 4 объекта: multi_manager
  • 3 глушащих триггера: trigger_relay (каждый из них глушит 1 мелодию)
  • 3 мелодии: ambient_generic
Вот как мы разместили эти объекты на тестовой карте:
t24melody3 Чтобы не запутаться в многочисленных свойствах объектов, приведенных ниже, пользуйтесь схемой.
Func_button 1 (первая кнопка)
Name: button_1 (имя кнопки)
Targetted object: multi_1 (сюда записываем имя первого multi_manager'а)
Delay before reset: 2 (время после нажатия, в течении которого кнопка не действует)
Sounds: Keycard Sound (звук при нажатии на кнопку)
Multi_manager 1 (этот объект по очереди запускает другие объекты)
Name: multi_1 (имя данного объекта)
sound_1 — 0.1 (запуск первой мелодии через 0.1 секунды)
sound_2_off — 0.1 (запуск объекта trigger_relay, глушащего вторую мелодию)
sound_3_off — 0.1 (запуск объекта trigger_relay, глушащего третью мелодию)
change_1 — 0.1 (объяснено во второй части статьи)
Ambient_generic 1 (первая мелодия)
Name: sound_1 (имя первой мелодии)
Path: ambience/guit1.wav (путь к первой мелодии)
Volume: 10 (громкость мелодии, максимальная)
Флаги:
Play Everywhere: мелодия слышна по всей карте
Start Silent: в начале раунда мелодия не играет
Trigger_relay 2 (глушит вторую мелодию)
Name: sound_2_off (имя данного объекта)
Target: sound_2 (здесь указывается имя второй мелодии, которую надо заглушить)
Trigger State: Off (означает, что триггер будет только выключать мелодию, но не включать)
Trigger_relay 3 (глушит третью мелодию)
Name: sound_3_off (имя данного объекта)
Target: sound_3 (здесь указывается имя третьей мелодии, которую надо заглушить)
Trigger State: Off (означает, что триггер будет только выключать мелодию, но не включать)
Свойства объектов при выборе второй мелодии. Если внимательно просмотреть свойства приведенных ниже объектов, то можно заметь их сходство со свойствами предыдущих объектов.
Func_button 2 (вторая кнопка)
Name: button_2 (имя кнопки)
Targetted object: multi_2 (сюда записываем имя второго multi_manager'а)
Delay before reset: 2 (время после нажатия, в течении которого кнопка не действует)
Sounds: Keycard Sound (звук при нажатии на кнопку)
Multi_manager 2 (этот объект по очереди запускает другие объекты)
Name: multi_2 (имя данного объекта)
sound_2 — 0.1 (запуск второй мелодии через 0.1 секунды)
sound_1_off — 0.1 (запуск объекта trigger_relay, глушащего первую мелодию)
sound_3_off — 0.1 (запуск объекта trigger_relay, глушащего третью мелодию)
change_2 — 0.1 (объяснено во второй части статьи)
Ambient_generic 2 (вторая мелодия)
Name: sound_2 (имя второй мелодии)
Path: ambience/opera.wav (путь ко второй мелодии)
Volume: 10 (громкость мелодии, максимальная)
Флаги:
Play Everywhere: мелодия слышна по всей карте
Start Silent: в начале раунда мелодия не играет
Trigger_relay 1 (глушит первую мелодию)
Name: sound_1_off (имя данного объекта)
Target: sound_1 (здесь указывается имя первой мелодии, которую надо заглушить)
Trigger State: Off (означает, что триггер будет только выключать мелодию, но не включать)
Trigger_relay 3 (глушит третью мелодию)
Name: sound_3_off (имя данного объекта)
Target: sound_3 (здесь указывается имя третьей мелодии, которую надо заглушить)
Trigger State: Off (означает, что триггер будет только выключать мелодию, но не включать)
Свойства объектов при выборе третьей мелодии. Свойства схожи с предыдущими двумя группами объектов.
Func_button 3 (третья кнопка)
Name: button_3 (имя кнопки)
Targetted object: multi_3 (сюда записываем имя третьего multi_manager'а)
Delay before reset: 2 (время после нажатия, в течении которого кнопка не действует)
Sounds: Keycard Sound (звук при нажатии на кнопку)
Multi_manager 3 (этот объект по очереди запускает другие объекты)
Name: multi_3 (имя данного объекта)
sound_3 — 0.1 (запуск третьей мелодии через 0.1 секунды)
sound_1_off — 0.1 (запуск объекта trigger_relay, глушащего первую мелодию)
sound_2_off — 0.1 (запуск объекта trigger_relay, глушащего вторую мелодию)
change_3 — 0.1 (объяснено во второй части статьи)
Ambient_generic 3 (третья мелодия)
Name: sound_3 (имя третьей мелодии)
Path: ambience/lv_jubilee.wav (путь ко третьей мелодии)
Volume: 10 (громкость мелодии, максимальная)
Флаги:
Play Everywhere: мелодия слышна по всей карте
Start Silent: в начале раунда мелодия не играет
Trigger_relay 1 (глушит первую мелодию)
Name: sound_1_off (имя данного объекта)
Target: sound_1 (здесь указывается имя первой мелодии, которую надо заглушить)
Trigger State: Off (означает, что триггер будет только выключать мелодию, но не включать)
Trigger_relay 2 (глушит вторую мелодию)
Name: sound_2_off (имя данного объекта)
Target: sound_2 (здесь указывается имя второй мелодии, которую надо заглушить)
Trigger State: Off (означает, что триггер будет только выключать мелодию, но не включать)
Теперь давайте подумаем, что должно происходить при нажатии на четвертую кнопку? Мы знаем, что должна "замолкнуть" любая играющая мелодия. То есть при нажатии на четвертую кнопку нам надо запустить четвертый multi_manager, который запустит все 3 глушащих объекта (trigger_relay), созданные ранее для первых трех случаев.
Func_button 4 (четвертая кнопка)
Name: button_4 (имя кнопки)
Targetted object: multi_4 (сюда записываем имя четвертого multi_manager'а)
Delay before reset: 2 (время после нажатия, в течении которого кнопка не действует)
Sounds: Keycard Sound (звук при нажатии на кнопку)
Multi_manager 4 (этот объект по очереди запускает другие объекты)
Name: multi_4 (имя данного объекта)
sound_1_off — 0.1 (запуск объекта trigger_relay, глушащего первую мелодию)
sound_2_off — 0.1 (запуск объекта trigger_relay, глушащего вторую мелодию)
sound_3_off — 0.1 (запуск объекта trigger_relay, глушащего третью мелодию)
change_off — 0.1 (объяснено во второй части статьи)
Trigger_relay 1 (глушит первую мелодию)
Name: sound_1_off (имя данного объекта)
Target: sound_1 (здесь указывается имя первой мелодии, которую надо заглушить)
Trigger State: Off (означает, что триггер будет только выключать мелодию, но не включать)
Trigger_relay 2 (глушит вторую мелодию)
Name: sound_2_off (имя данного объекта)
Target: sound_2 (здесь указывается имя второй мелодии, которую надо заглушить)
Trigger State: Off (означает, что триггер будет только выключать мелодию, но не включать)
Trigger_relay 3 (глушит третью мелодию)
Name: sound_3_off (имя данного объекта)
Target: sound_3 (здесь указывается имя третьей мелодии, которую надо заглушить)
Trigger State: Off (означает, что триггер будет только выключать мелодию, но не включать)
Вот и все! :)
Теперь перейдем к заключительной части статьи и объясним принцип работы "запоминающего устройства", которое запоминает играющую мелодию (или что мелодии не играют) и в следующем раунде запускает туже самую мелодию (или глушит все мелодии).

Часть 2. Запоминающее устройство

Сейчас мы немного модернизируем созданную систему, добавим некоторые параметры и дополнительно сделаем еще 6 объектов.
В качестве запускающего мелодию в начале нового раунда устройства мы будем использовать func_door. А что значит, что мы будем запускать мелодию? Это значит, что дверь (func_door) будет автоматически активировать один из 4-х объектов multi_manager (ведь именно эти объекты управляют всей системой: три из них запускают мелодии, а четвертый глушит).
В параметр "Target" двери мы запишем: multi_4 — имя четвертого multi_manager'а, который глушит все мелодии. Однако этот параметр будет меняться при каждом нажатии любой из кнопок: при нажатии на первую кнопку этот параметр поменяется на multi_1 (запуск первого multi_manager'а), при нажатии на вторую кнопку параметр сменится на multi_2, при нажатии на третью кнопку параметр сменится на multi_3 и при нажатии на четвертую кнопку (кнопку "Стоп") параметр вновь вернется к значению multi_4.
Менять параметр "Target" любого объекта (а у нас это будет дверь) позволяет объект trigger_changetarget. Создадим 4 таких объекта. Их имена следующие: change_1, change_2, change_3, change_off. Эти имена необходимо записать в объекты multi_manager, согласно приведенным в первой части статьи свойствам.
Теперь схема размещения объектов будет выглядеть так (добавилось 4 объекта trigger_changetarget):
t24melody4 Итак, теперь у нас при нажатии, например, на первую кнопку, активируется первый multi_manager , который активирует уже 4 объекта: включает первую мелодию, глушит вторую мелодию, глушит третью мелодию, меняет "Target" двери на значение multi_1. При нажатии на другие кнопки происходят схожие операции.
Вернемся к двери (func_door). Ее необходимо сделать прозрачной и нематериальной, чтобы игроки даже не знали о ее существовании. Достигается это выставлением определенных параметров отображения и флага "Passable" (свойства приведены ниже). На рисунке ниже видно, что на нашей карте дверь покрашена в обычную текстуру (такую же, как на стенке) и размещена она прямо у табло, но благодаря выставленным свойствам и флагам, дверь мешать игрокам не будет — она будет невидимой и нематериальной.
Дверь, запускающая мелодию в начале каждого нового раунда
Также необходимо подумать об активации двери в начале раунда, ведь сама она активироваться не может, а соответственно не может и запустить мелодию. Для этого необходимо создать на базах команд по одному объекту trigger_multiple. Эти триггеры необходимо разместить, так, чтобы были перекрыты все точки рождения игроков (см. рис. ниже).
Триггер, активирующий дверь
Получается, что игроки рождаются, тут же попадают в поле действия объектов trigger_multiple, которые активируют дверь, а т.к. мы установили параметр двери "Delay before close: -1", который не позволяет активировать дверь несколько раз за раунд, то мелодия будет запущена только один раз в начале раунда.
Свойства новых объектов:
Trigger_changetarget 1 (меняет параметр "Target" двери на multi_1)
Name: change_1 (имя данного объекта)
Target: memory (здесь указывается имя двери)
New Target: multi_1 (означает, что теперь параметр "Target" двери будет иметь значение multi_1)
Trigger_changetarget 2 (меняет параметр "Target" двери на multi_2)
Name: change_2 (имя данного объекта)
Target: memory (здесь указывается имя двери)
New Target: multi_2 (означает, что теперь параметр "Target" двери будет иметь значение multi_2)
Trigger_changetarget 3 (меняет параметр "Target" двери на multi_3)
Name: change_3 (имя данного объекта)
Target: memory (здесь указывается имя двери)
New Target: multi_3 (означает, что теперь параметр "Target" двери будет иметь значение multi_3)
Trigger_changetarget Off (меняет параметр "Target" двери на multi_4)
Name: change_off (имя данного объекта)
Target: memory (здесь указывается имя двери)
New Target: multi_4 (означает, что теперь параметр "Target" двери будет иметь значение multi_4)
Func_door (дверь, запускает мелодию в начале раунда)
Name: memory (имя двери)
Target: multi_4 (это значение по умолчанию, однако оно меняется объектами trigger_changetarget)
Render Mode: texture (этот режим вместе со следующим "FX Amount" делает дверь прозрачной в игре)
FX Amount: 0
Delay before close: -1 (это значение не позволяет активировать дверь несколько раз за раунд)
Флаги:
Passable: делает дверь нематериальной, чтобы она не мешала передвижениям игроков
Trigger_multiple (триггер, активирует дверь)
Target: memory (сюда записывается имя двери)
Вот и все нехитрое устройство табло :) Возможно, данное табло никогда Вам не понадобится, но задача, стоявшая перед нами при написании этой статьи, заключалась в ознакомлении Вас с возможностями таких энтити-объектов, как: trigger_relay и trigger_changetarget. Данная статья должна помочь Вам понять, что сделать в CS можно много интересных вещей, главное, знать свойства объектов и уметь соединить 10, 20, 30 объектов в одну работающую систему.
melody.zip [37Кб] — в архиве карта-пример в форматах BSP и RMF.
20.23

Холмы

В данной статье мы познакомим Вас с техникой создания небольших холмов и пригорков. Статья показывает каким образом можно украсить карту, сделать рельеф более разнообразным.

1. Создание пригорка у стены и ящика

Создаем браш подходящей высоты и длины.
Пригорок у стенки и ящика, рис.1Пригорок у стенки и ящика, рис.2
Переводим его в режим работы с вертексами и опускаем верхние передние вертексы, таким образом, чтобы они совместились с нижними. На вопрос "Merge Vertices?" всегда отвечаем "Да".
Для большей эстетичности можно одинаково наложить текстуры как на пригорок, так и на основную землю.
Пригорок у стенки и ящика, рис.3Пригорок у стенки и ящика, рис.4

2. Создание пригорка в углу

Создаем браш и превращаем его в угол, разрезав пополам.
Пригорок в углу, рис.1Пригорок в углу, рис.2
Верхние передние вертексы совмещаем с нижними. Выравниваем текстуры и получается замечательный холмик :)
Пригорок в углу, рис.3Пригорок в углу, рис.4

3. Создание холмов

Холм будет иметь плоскую среднюю часть прямоугольной формы. Вокруг мы создадим браши треугольной формы. Затем мы превратим их в наклонные плоскости.
Холм, рис.1
Превращаем первый треугольный браш в наклонную плоскость, совместив верхние вертексы с нижними.
Холм, рис.2
То же самое проделываем с остальными боковыми брашами.
Холм, рис.3
Мы привели лишь несколько самых простых по форме примеров холмов. Немного потренировавшись, Вы сможете сделать что-нибудь более красивое. Главное, следите за тем, чтобы не получались плоскости неправильной формы. Почаще нажимайте [Alt-P], чтобы проверить геометрию карты на наличие ошибок.
20.24

Щит с вращающейся рекламой

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

Как это работает?

Мы создадим 12 вращающихся створок (func_door_rotating) и 1 multi_manager, который будет активировать с интервалом в 0.1 секунды каждую створку по очереди.
На разных сторонах створок мы нанесем разные рекламные рисунки, таким образом, чтобы при повороте створок, получалось цельное изображение. Так как объекты func_door_rotating обладают свойством автоматического закрытия после некоторого времени, то створки самостоятельно будут закрываться, показывая первую рекламу, пока их вновь не активирует multi_manager, чтобы показать вторую рекламу.

Создаем створки

На картинке ниже видно, что мы создали 12 "треугольных" вращающихся створок func_door_rotating. Почему треугольных? Просто треугольные створки вращаются красивше, чем квадратные :) Кстати, треугольники нужно делать равносторонними, чтобы разные рекламные картинки совпадали после вращения.
Создаем 12 "треугольных" func_door_rotating
Func_door_rotating — вращающийся объект, поэтому не забываем про ORIGIN-браш.
Двери func_door_rotating (близко)
Параметр "Delay before close" определяет, через сколько секунд створка автоматически вернется в начальное положение. Для всех створок необходимо выставить одинаковые промежутки времени.
Обратите внимание также на параметр "Distance (deg)", который определяет угол поворота створок. Так как на нашей карте мы использовали створки в виде равносторонних треугольников, то угол равен 120°.
Картинку на створки нужно наносить, выбрав все нужные стороны створок, нажав флажок "Tread as one" и кнопку "Fit", так будет удобнее.
Func_door_rotating (створка)
Name: door1 (имя створки)
Speed: 180 (скорость вращения)
Distance (deg): 120 (угол поворота створки в градусах)
Delay before close: 10 (время до автоматического возврата в исходное положение)
С такими же параметрами, но разными именами нужно создать еще 11 створок (всего будет: 12).
Створки мы назвали: door1, door2, door3 ... door12.

Управление створками (multi_manager)

Створки мы будем заставлять вращаться объектом multi_manager. Первую створку мы активируем через 0.1 секунды, вторую — через 0.2 секунды, третью — через 0.3 секунды ... и т.д. до активации 12 створки через 1.2 секунды.
Последним 13-м объектом активации мы сделаем (ВНИМАНИЕ!) сам multi_manager! Это необходимо, чтобы смена рекламы происходила бесконечно, без дополнительных активаций со стороны игрока.
Для объекта multi_manager обязательно нужно поставить флажок "Multithreaded", иначе multi_manager не сможет активировать сам себя.
Multi_manager (этот объект по очереди запускает створки)
Name: door_multi (имя мульти_менеджера)
door1 — 0.1 (запуск первой створки через 0.1 секунды)
door2 — 0.2 (запуск второй створки через 0.2 секунды)
door3 — 0.3 (запуск третьей створки через 0.3 секунды)
door4 — 0.4
door5 — 0.5
door6 — 0.6
door7 — 0.7
door8 — 0.8
door9 — 0.9
door10 — 1.0
door11 — 1.1
door12 — 1.2
door_multi — 20 (активация самого себя через 20 секунд)
Флаги:
Multithreaded: необходимо отметить этот флаг, чтобы мульти_менеджер мог активировать сам себя
Если Вы планируете создать вокруг створок некое подобие рамы, то ее необходимо превратить в func_wall. Известно, что энтити-объекты пропускают свет, а это означает, что рекламные картинки на разных сторонах створок будут нормально освещены. В противном случае (когда рама вокруг щита сделана брашами) "внутренняя" реклама после компиляции получится затемненной, т.к. браши не пропускают свет.
Раму для рекламного щита необходимо делать из func_wall

Автоматический запуск в начале карты

Чтобы наша система смены рекламы заработала в самом начале игры, разместим на карте trigger_auto и в параметре "Target" укажем имя мульти_менеджера (т.е. door_multi). Время до активации ("Delay before trigger") мы сделали равным 4 секундам, чтобы все объекты успели появится на карте, прежде чем trigger_auto начнет что-либо активировать.

Как правильно наносить текстуры на створки?

Тут есть определенная сложность, ведь когда одна рекламная картинка видна целиком, другая должна быть нанесена на несколько развернутых под углом створок. Можно, конечно, сначала нанести на одну сторону щита, составленную из 12 створок, первую картинку, затем развернуть каждую створку и нанести вторую картинку, но мы предлагаем другой способ, без разворота створок.
Ниже представлена схема (вид сверху) переноса створок для нанесения второй рекламной картинки. На схеме имеется всего 6 створок вместо 12, просто мы немного поленились нарисовать все 12 :)
Итак, смотрим на горизонтальные 6 створок. Это так называемое "начальное положение" рекламного щита. Красные стороны створок означают составленную в единое целое первую картинку. Синяя стрелка справа показывает, как вращаются створки при активации, т.е. против часовой стрелки.
Теперь представим, какие стороны створок необходимо закрасить, чтобы при повороте сложилась вторая картинка? Правильно — ярко-зеленые. Ярко-зеленые створки необходимо покрасить во вторую рекламную картинку.
t24reklama1 Чтобы не вращать створки в редакторе с целью нанесения второй картинки, мы предлагаем временно пренести их, как показано на этой же схеме, но чуть ниже. Как только створки будут перенесены, наносим вторую картинку (см. рис. ниже), выделив все стороны створок, нажав флажок "Tread as one" и кнопку "Fit".
Закрашиваем временно перенесенные створки второй картинкой
Возвращаем створки в исходное положение и наслаждаемся красивейшим эффектом смены рекламы :)
reklama.zip [24Кб] — в архиве карта-пример в форматах BSP и RMF.