камеры
Обычные камеры
В этой статье мы расскажем как создаются камеры на картах (такие, как на картах: CS_ASSAULT и CS_MILITIA). Перед прочтением статьи ознакомьтесь со слудующими энтити-объектами:
trigger_camera
info_target
Статичные камеры (показывают карту при загрузке)
Вы замечали, что как только загружается карта, начинают показываться определенные ее места? Так происходит на многих картах: de_dust, cs_siege, de_torn и др. Места эти не случайные. В них находятся камеры — специальные объекты trigger_camera. Обычно мапперы устанавливают камеры в самых красивых местах своей карты, чтобы при загрузке как бы представить ее игроку.
Trigger_camera — это точечный энтити-объект. Разместите его в том месте, где должна быть камера. Направление взгляда камеры задается объектом info_target (см. рис. ниже). Разместите этот объект в то место, куда должна смотреть камера. Дайте ему имя, например, trg1 и впишите его в параметр «Target» камеры. Теперь при загрузке карты на экран будет выводится изображения с камеры. Вы можете разместить несколько камер, чтобы показать все интересные места вашей карты по очереди.

Камеры, активируемые игроком
Другим типом камер являются камеры, которые активируются игроком. Такие камеры есть на CS_ASSAULT и CS_MILITIA. Вот как они создаются.
В нужном месте размещается trigger_camera с именем, например, cam1, а также мишень для нее (info_target) — все точно так же, как и для «презентационной» камеры, рассмотренной выше. Затем в нужном месте создается кнопка func_button (можно сделать ее в виде монитора, как на указанных выше картах). И в параметре «Targetted object» вписывается имя камеры. Игрок подходит к кнопке-монитору, нажимает «E» и видит изображение, передаваемое камерой cam1 (см. рис. ниже).

В свойствах trigger_camera в параметре «Hold time» можно установить время в секундах, в течении которого игроку будет показываться изображение. Рекомендуем также у объекта func_button (монитор) отметить флаг «Don't move», чтобы монитор не вдавливался в стену.
Двигающиеся камеры
В этой статье мы рассмотрим создание различных типов двигающихся камер. Перед прочтением статьи ознакомьтесь со слудующими энтити-объектами:
trigger_camera
info_target
func_train
path_corner
Надеемся, что Вы уже прочитали статью о создании обычных (статичных) камер, т.к. двигающиеся камеры отличаются от них не намного. Всего существует три типа двигающихся камер, рассмотрим их по порядку.
1. Камера стоит, мишень двигается
Подвижной мишенью может быть игрок или любой передвигающийся объект, например, платформа func_train (Вы можете прочитать о создании платформ в соответствующей главе). В любом случае создается обычная камера trigger_camera. В параметр «Target» камеры вписывается имя мишени (движущегося объекта) или, если камера должна следить за игроком, отмечается флаг «Follow Player».
Если в качестве мишени используется движущаяся платформа func_train, и Вы хотите сделать ее невидимой, то выставьте для нее параметры: Render Mode — Texture, FX Amount — 0. Также в этом случае полезно отметить флаг «Not Solid», который сделает объект-мишень нематериальным, чтобы игроки не задевали его.
Чтобы увидеть, что показывает камера, ее необходимо активировать, например, при помощи кнопки func_button. Учтите, что если объект-мишень в начале раунда неподвижен, то его необходимо дополнительно активировать, иначе камере не за чем будет следить.
2. Камера двигается, мишень стоит
Неподвижной мишенью может быть любой именованный объект (имеющий имя). Камера движется по цепочке, составленной из объектов path_corner, которые также используются для определения траектории движения платформ func_train. Поместите на карте необходимое количество объектов path_corner, дайте каждому индивидуальное имя и в параметре «Next stop target» каждого из них укажите следующую точку пути камеры (имя следующего объекта path_corner).
В параметре «Path Corner» самой камеры укажите имя первого объекта path_corner, к которому начнет свое движени камера из своей начальной позиции. Также обязательно должен быть отмечен флаг «Freeze Player», который удерживает игрока у кнопки-монитора, пока он смотрит изображение с камеры. Если этот флаг не отметить, то движущейся камеры не получится.
3. Камера двигается, мишень двигается
Это наиболее интересный тип двигающихся камер, т.к. позволяет игроку заглянуть в какое-нибудь место, недоступное с его текущей позиции.
Движущаяся мишень создается точно так же, как и в первом случае. Для этого можно использовать объект func_train, сделать его невидимым и нематериальным, как описано выше. Для func_train необходимо определить траекторию движения при помощи объектов path_corner.
Для движущейся камеры также необходимо изготовить путь из объектов path_corner, как и во втором случае. Это могуть быть и те же самые path_corner, что определяют маршрут движущейся мишени, однако, в этом случае необходимо активировать камеру несколько позже мишени, чтобы не возникло ситуации, когда камера находится внутри мишени.
Не забудьте отметить флаг «Freeze Player», чтобы камера могла двигаться и следить за мишенью. Небольшое замечание: если объекты path_corner, по которым движется камера, расположены слишком близко к стене, то возможно возникновение различных визуальных ошибок. Это исправляется перемещением объектов path_corner подальше от стен.
В нашей-карте примере мы создали третий вариант камеры. На карте имеется кнопка-монитор, нажав на которую, игрок видит изображение с двигающейся камеры, которая следит за двигающейся невидимой мишенью. Мишенью на нашей карте является платформа func_train. И для камеры, и для платформы мы создали по 4 объекта path_corner.
Разбиваемые камеры
Из данной статьи Вы узнаете как можно создать разбиваемую камеру, которая становится неработоспособной после ее уничтожения игроком. Для реализации данной идеи нам понадобятся следующие энтити-объекты:
func_door
func_button
func_breakable
info_target
trigger_camera
trigger_changetarget
Статья довольно сложная, по крайней мере, новичку будет непросто. Поверьте написать ее было тоже не так-то просто :) Если мы Вас еще не испугали, то можем начинать. Сейчас мы изготовим довольно эффектную фичу.
Главное, что Вы должны понять после прочтения статьи, что объекты в Half-Life не являются какими-то определенными предметами, например, объект func_door необязательно должен быть именно дверью. Необходимо понять, что объекты просто имеют определенные свойства, которые мы можем использовать для достижения различных целей.
Что будем делать:
Создадим где-нибудь на карте монитор (это будет объект func_button, т.е. обычная кнопка), нажав на который, игрок увидит изображение с камеры (объекта trigger_camera).
Так как сама камера (trigger_camera) является точечным объектом, то в игре она будет невидимой. Нам же необходимо сделать разбиваемую камеру, т.е. видимый объект, поэтому рядом с настоящей, но невидимой камерой мы создадим объект func_breakable, который будет, так сказать, олицетворять нашу камеру (материализировать).
Игрок думает, что видимая камера (func_breakable) — это и есть камера, при помощи которой он видит изображение, хотя естественно функцию камеры выполняет расположенный рядом объект trigger_camera.
Когда игрок разобъет видимую камеру (func_breakable), необходимо прекратить работу невидимой камеры (trigger_camera). Мы это сделаем переводом цели кнопки-монитора с камеры trigger_camera на какой-нибудь другой объект. Больше при нажатии на монитор изображение выводиться не будет, т.к. монитор уже не активирует камеру. Данную функцию можно реализовать при помощи точечного энтити-объекта trigger_changetarget, который может поменять парматр «Target» любому объекту.
Ну, и последнее. Необходимо, чтобы в начале каждого раунда функции кнопки-монитора восстанавливались, т.е. кнопка опять была бы «направлена» на объект trigger_camera и активировала бы его. Это опять же реализуется при помощи объекта trigger_changetarget, только теперь мы вернем монитору изначальное значение параметра «Target».
Схема работы разбиваемой камеры
Чтобы Вам было немного полегче все это понять, мы составили схему работы разбиваемой камеры (см. рис. ниже). В схему входят 7 энтити-объектов. Сейчас мы попытаемся еще раз повторить сказанное выше, но уже с использованием схемы.
Итак, главным на этой схеме является игрок. Его мы изобразили оранжевым кругом.

Рассмотрим среднюю линию схемы, состоящую из 3-х энтити-объектов (func_button, trigger_camera, info_target).
Игрок подходит к стене и нажимает на кнопку-монитор (func_button);
Кнопка-монитор активирует камеру (trigger_camera);
Камера показывает игроку какой-то участок карты. «Взгляд» камеры направлен в сторону объекта info_target
Теперь рассмотрим верхнюю линию схемы с двумя объектами (func_breakable и trigger_changetarget).
Игрок разбивает предмет, изображающий камеру, т.е. func_breakable;
Func_breakable активирует объект trigger_changetarget, который «переводит» кнопку-монитор с trigger_camera на func_door (синяя стрелка уходит вниз-вправо)
Т.к. кнопка больше не активирует камеру, то игрок, нажимая на нее, ничего не видит (камера разбита). Теперь при нажатии на кнопку будет открываться невидимая дверь, но это нам и нужно и совершенно никак не мешает.
Нижняя линия схемы (объекты func_door и trigger_changetarget).
Как мы уже говорили, из статьи Вы должны понять, что объекты можно использовать не по назначению. В данном случае мы используем дверь не по своему прямому назначению. Наша дверь не будет стоять в каком-то проеме, мало того она будет полностью прозрачной, через нее можно будет проходить (двери как бы и нет), и она будет выполнять функцию триггера (активировать объект).
В свойствах двери мы выставим следующий параметр delay before close: -1, таким образом дверь будет открываться один раз за раунд. Дальше мы воспользуемся тем, что любая открытая дверь в начале следующего раунда автоматически закрывается.
При закрытии (т.е. в самом начале каждого раунда) дверь будет активировать еще один (второй) объект trigger_changetarget, который обратно «переведет» кнопку-монитор на камеру (trigger_camera), и игрок вновь, если захочет, сможет увидеть изображение с камеры.
/* Если до сих пор Вам все понятно — наши поздравления! Вы сделали очень большой шаг на пути к профессиональному мапперству! Понять все это сразу сможет не любой новичек. Но зато когда он поймет, то почувствует, как у него развязываюся руки и он может крутить-вертеть свойствами объектов как хочет, добиваясь требуемой цели. */
Дальше мы приводим свойства всех используемых объектов.
1. Кнопка-монитор, висящая на стене. При активации ее игроком, она активирует камеру trigger_camera.

Name: monitor_button
Targetted object: camera1 (изначально кнопка активирует камеру)
Delay before reset: 0 (кнопку можно нажимать как угодно часто, без задержек)
Delay before trigger: 0 (кнопка активирует камеру мгновенно, без задержки)
Флаги:
Don't move: кнопка-монитор не вдавливается в стену при нажатии (так удобнее и реалистичнее)
2. Камера (trigger_camera). Камера направлена на объект info_target и передает изображение игроку.

Name: camera1
Target: target1
Hold time: 10 (время, в течении которого камера передает изображение)
3. Визуальная часть камеры (объект func_breakable). Разбивая func_breakable (см. рис. выше), мы переключаем кнопку-монитор с камеры на скрытую дверь, выполняющую функцию триггера.
Target on break: change_door (имя первого объекта trigger_changetarget)
Strength: 75 (прочность камеры, порядка 3 выстрелов из винтовки)
Material type: metal (тип материала, в данном случае металл)
4. Мишень для камеры (объект info_target). В сторону этого объекта будет направлен «взгляд» камеры.
Name: target1

5. Объекты, управляющие кнопкой-монитором (trigger_changetarget). Эти объекты «перенаправляют» кнопку-монитор с камеры на скрытую дверь (когда игрок разбивает камеру) и наоборот с двери на камеру в начале каждого раунда.

5.1 Первый trigger_changetarget. Переводит кнопку с камеры на дверь.
Name: change_door
Target: monitor_button (здесь мы указываем имя кнопки-монитора, т.к. именно ей мы меняем параметр Target)
New target: secret_door (сюда вписываем название новой цели для кнопки-монитора)
5.2 Второй trigger_changetarget. Переводит кнопку с двери обратно на камеру в начале каждого раунда.
Name: change_camera
Target: monitor_button (здесь мы указываем имя кнопки-монитора, т.к. именно ей мы меняем параметр Target)
New target: camera1 (сюда вписываем название изначальной цели для кнопки-монитора)
6. Секретная дверь (func_door). Невидимая дверь является у нас объектом, на который переводится действие кнопки-монитора, после разрушения камеры, а также дверь при своем закрытии в начале каждого раунда, активирует второй trigger_changetarget.
Размеры, раположение и текстура для закрашивания не важны! Дверь в данном случае не является собственно дверью.
Name: secret_door
Render mode: texture (этот режим совместно со следующим fx amount: 0 делает дверь абсолютно прозрачной)
FX Amount: 0 (этот режим совместно с предыдущим делает дверь абсолютно прозрачной независимо от текстуры на двери)
Delay before close: -1 (необходимо, чтобы дверь не закрывалась до начала следующего раунда, когда она автоматически закроется и активирует второй trigger_changetarget)
Fire on Close: change_camera (данный объект trigger_changetarget будет активирован при закрытии двери, в нашем случае в начале каждого раунда)
Флаги:
Passable: необходимо отметить, чтобы игроки не сталкивались с прозрачной дверью.
--
Ну, чтож, вот и все. Очень надеемся, что Вы разберетесь со всей этой хитрой системой, т.к. материал этой статьи дает базовый набор знаний, открывающих дорогу в мир профессионального маппинга.
Ну, и прежде, чем Вы перейдете к изучению дальнейшего материала, хочется сказать еще несколько слов.
Подобная камера была реализована на карте DE_ASCHE. Тогда было использовано 10 объектов. Отличие заключалось в том, что дверь не использовалась, как триггер. Вместо этого было два объекта trigger_multiple, размещенных на базах обеих команд. Задачей этих триггеров была активация, кстати посредством еще одной (второй уже) скрытой двери, объекта trigger_changetarget.
Как видите, та же самая идея сегодня реализована уже без trigger_multiple с помощью уже всего 7 объектов вместо десяти. Не исключено, что есть и еще более простое решение, надо лишь немного подумать, вспомнить какие еще есть объекты и попробовать использовать их свойства более эффективно. Здесь, как и в программировании, есть множество вариантов решения одной и той же задачи.