Portal 2

Portal 2

25 ratings
Раздатчик кубов в Portal 2
By Kimmi
Здесь представлено полное описание принципа работы раздатчика кубов на основе редактора уровней Hammer Editor
   
Award
Favorite
Favorited
Unfavorite
Добавление раздатчика кубов на основе готовых моделей
Для того чтобы в карту добавить раздатчик кубов при её создании в редакторе уровней "Hammer Editor", можно воспользоваться уже готовыми моделями, располагающимися в папке:

"...\Steam\SteamApps\common\Portal 2\sdk_content\maps\instances\gameplay".

Здесь из множества моделей воспользуемся стандартной моделью раздатчика - "cube_dropper_multiple_normal.vmf". В отличие от большинства других, данная модель содержит весь необходимый набор функциональных элементов. Для добавления её в карту, создаём объект "func_instance" и переходим к его свойствам. В свойствах указываем имя объекта ("Fix Up Name"), например, "cube_dropper", и путь к готовой модели ("VMF Filename").



Срабатывание раздатчика (выдача первого и последующих кубов) может быть организовано различными способами: триггерами, кнопками, логическими связями и т.д. Для примера создадим кнопку-пьедестал "prop_button" и присвоим ей имя "button". Там же в свойствах переходим во вкладку "Outputs" и добавляем там две строки условий:
  • OnPressed cube_dropper instance:cube_dropper;Trigger 0.00 No
  • OnPressed cube_dropper instance:cube_dropper_autorespawn;Enable 0.00 No



Первое условие посылает сигнал на непосредственную выдачу кубов. Второе условие отвечает за автоматическую выдачу нового куба при его уничтожении. Оно может быть прописано отдельно, например, в объекте класса "logic_auto", чтобы вызов данного условия производился единожды. В данном случае активация функции автоматической выдачи нового куба будет выполняться каждый раз при нажатии кнопки.

Теперь осталось только оформить карту, скомпилировать её и запустить.
Логическое устройство раздатчика кубов
Ниже приведена блок-схема логических элементов стандартного раздатчика кубов "cube_dropper_multiple_normal.vmf":



Логическое начало работы раздатчика кубов начинается с объекта "logic_auto" (в схеме данный объект не представлен). В его свойствах во вкладке "Outputs" имеется следующее условие:
  • OnMapSpawn cube_dropper_box_spawner ForceSpawn 0.00 No
Его смысл состоит в том, чтобы автоматически при загрузке карты создать первый куб (объект класса "prop_weighted_cube" с именем "cube_dropper_box"), который выпадет в раздатчик и останется внутри него до момента активации раздатчика.

Следующий этап работы раздатчика зависит от условий, заданных пользователем. Здесь уже имеет место функция непосредственной выдачи первого куба. Она берёт своё начало с подачи сигнала (Trigger) на объект класса "logic_relay" (реле) с именем "cube_dropper". Параллельно с этим должно быть задано условие на функцию автоматической выдачи нового куба (объект класса "logic_relay" с именем "cube_dropper_autorespawn"). По умолчанию данный объект отключён, то есть автоматическая выдача производиться не будет.

И реле "cube_dropper", и реле "cube_dropper_autorespawn" подают сигнал на следующее реле "cube_dropper_gate". В представленной блок-схеме видно, что реле "cube_dropper_gate" имеет три условия. Первое посылает сигнал на следующее реле "cube_dropper_loop". Из второго условия видно, что данное реле отключает само себя. Третье условие пока что не имеет смысла, так как параметр [FireUser1], направленный на объект с именем "cube_dropper_box" (куб), выполняется в том случае, когда в этом объекте (во вкладке "Outputs") имеется строка со специальным условием (начинающимся на [OnUser1]). Пока что в этом объекте этого условия нет. Оно будет прописано автоматически после подачи сигнала на реле "cube_dropper_drop".

Далее сигнал поступает на реле "cube_dropper_loop". Активация данного реле вызывает подачу сигнала на следующее реле "cube_dropper_retrigger" и на само себя с задержкой последнего на 0.5 секунд. Как видно из условия, реле "cube_dropper_loop" должно вызывать само себя каждые 0.5 секунд. Но повторения не происходит, потому что следующее реле "cube_dropper_retrigger" отменяет ожидание повтора предыдущего. Данное циклическое реле создано для того, чтобы сигнал, который должен поступить на следующее реле "cube_dropper_retrigger" сохранился, если последнее окажется отключенным. Как только данное реле включится, то сигнал поступит на него по завершению текущего цикла. А отключение реле "cube_dropper_retrigger" связано с тем, чтобы устранить возможную ошибку в работе раздатчика. Когда включена функция автовозрождения куба и куб при этом ещё находится в зоне триггера "cube_dropper_droptrigger", то при уничтожении куба на реле "cube_dropper_drop" сигнал (через последовательность всех реле) поступит немедленно. А возрождение куба в триггере (когда оно сработает при исчезновении куба из него) запустится только по истечении 1 секунды. Следовательно, на выданный куб не успеет попасть информация в "Outputs", согласно которой при выдаче нового куба, старый должен быть уничтожен.

Помимо отмены ожидания, реле "cube_dropper_retrigger" посылает сигнал на следующее реле - "cube_dropper_drop", которое, как видно из схемы, выполняет множество условий по управлению раздатчиком. Его основная функция - открытие раздатчика.

Рассмотрим, какие функции выполняет реле "cube_dropper_drop":
  • Включает триггер "cube_dropper_droptrigger". Первоначально он отключён. Это наиболее важный элемент, который отвечает за закрытие раздатчика после выдачи куба. После того, как куб покинет зону данного триггера (при выпадении куба из раздатчика), автоматически начнут выполняться условия, прописанные в самом триггере, направленные на закрытие раздатчика.
  • Отключает реле "cube_dropper_retrigger";
  • Добавляет к кубу "cube_dropper_box" строку с условием {OnUser1 !self:Dissolve::0:1}, согласно которому при подаче на данный объект сигнала [FireUser1], объект будет уничтожен;
  • Включает реле "cube_dropper_gate";
  • Изменяет окраску модели раздатчика "cube_dropper_prop" на "жёлтую";
  • Включает жёлтый источник света "cube_dropper_lights_active" (по умолчанию он выключен);
  • Отключает синий источник света "cube_dropper_lights_standby" (по умолчанию он включен);
  • Запускает анимацию {item_dropper_open} (анимация открытия раздатчика) модели "cube_dropper_prop" через 0,1 секунду;
  • Устанавливает анимацию по умолчанию {item_dropper_idle} (открытое состояние раздатчика) модели "cube_dropper_prop" через 0,2 секунды.
Рассмотрим теперь работу уже упомянутого выше триггера "cube_dropper_droptrigger", который выполняет функцию закрытия раздатчика при выпадении из него куба. Как только куб покинет зону данного триггера, объект начнёт выполнять следующие условия:
  • Запускает анимацию {item_dropper_close} (анимация закрытия раздатчика) модели "cube_dropper_prop";
  • Отключает реле "cube_dropper_droptrigger" (отключает сам себя);
  • Включает объект "func_brush" с именем "cube_dropper_blocker". Данный объект в форме прямоугольного браша (невидимого в игре) служит для защиты от помех, которые могут встать на пути закрывающейся апертуры раздатчика. Помехой может служить всё тот же куб, которым в начале закрытия раздатчика можно перекрыть его створки. Как только куб выйдет за пределы триггера, объект "cube_dropper_blocker" автоматически включится на 2 секунды (пока раздатчик закрывается), а затем выключится. Условие отключения прописано далее;
  • Устанавливает анимацию по умолчанию {item_dropper_idle_closed} (закрытое состояние раздатчика) модели "cube_dropper_prop" через 0.1 секунды;
  • Посылает сигнал (через 1 секунду) на объект "env_entity_maker" с именем "cube_dropper_box_spawner", который с помощью другого объекта (класс "point_template" с именем "cube_dropper_box_template") создаст новый куб;
  • Включает реле "cube_dropper_retrigger" через 2 секунды;
  • Отключает браш "cube_dropper_blocker" через 2 секунды.
Последние три условия начинают выполняться при срабатывании триггера:
  • Изменяется окраска модели раздатчика "cube_dropper_prop" на "синюю" через 2 секунды;
  • Включается стандартный источник света синего цвета "cube_dropper_lights_standby" через 2 секунды;
  • В этот же момент происходит отключение жёлтого источника света "cube_dropper_lights_active".
Куб "cube_dropper_box" сам по себе выполняет единственное условие, которое запускается при его уничтожении (условно: при растворении в поле анти-экспроприации, в кислоте, при оказании давления на него, при падении в бездну и т.д.):
  • OnFizzled cube_dropper_autorespawn Trigger 0.00 No
Здесь запускается реле автовозраждения куба.

Примечание: в тексте жирным шрифтом указан класс объекта, курсивом - его имя.
Описание объектов
Теперь рассмотрим оставшиеся энтити, косвенно или непосредственно влияющие на весь цикл работы раздатчика (см. рис. ниже).


На рисунке курсивом указан класс данного объекта, жирным шрифтом - его имя.

"cube_dropper_box_spawner" - объект класса "env_entity_maker", который отвечает за динамическое возрождение объектов (в данном случае куба) с помощью шаблона "point_template".

"cube_dropper_box_template" - объект класса "point_template", шаблон для возрождения объектов. В свойствах объекта в строке "Template 1" указано имя возрождаемого объекта - "cube_dropper_box".

"filter_weighted_cube" - объект класса "filter_activator_class", фильтр объектов определённого класса. Данный фильтр устанавливает условие, при котором триггер будет срабатывать только на определённый класс объектов. Для этого в триггере указывается имя данного фильтра. В данном случае фильтр установлен для класса "prop_weighted_cube".

"proxy" - объект класса "func_instance_io_proxy", используемый для управления общей моделью раздатчика, добавляемой в карту как объект класса "func_instace", при помощи условий от других объектов. В данном случае управление производится тремя условиями, прописанными в "proxy":
  • OnProxyRelay cube_dropper Trigger 0.00 No
  • OnProxyRelay cube_dropper_autorespawn Enable 0.00 No
  • OnProxyRelay cube_dropper_autorespawn Disable 0.00 No

"cube_dropper_lights_standby" и "cube_dropper_lights_active" - источники света. В модели раздатчика используются два типа источника с одним и тем же именем для освещения синим цветом и точно также для освещения жёлтым цветом. Первый тип - "light_spot", направленный источник света, второй - "light", обычный.

"env_cubemap" - специальный объект, используемый при наложении на блестящие поверхности объёмной картинки.

Примечание: в тексте жирным шрифтом указан класс объекта, курсивом - его имя.
10 Comments
Kimmi  [author] 6 Sep, 2019 @ 9:54pm 
:p2aperture: Если Вы хотите добавить в карту простой раздатчик кубов, всегда пользуйтесь готовыми экземплярами, например, "cube_dropper_multiple_normal.vmf" , используя энтити "func_instance". Использование готовых шаблонов позволяет упростить процесс проектирования и отладки; к тому же такие экземпляры хорошо отработаны и протестированы.
Kimmi  [author] 6 Sep, 2019 @ 9:54pm 
:p2aperture: Данная статья всего лишь отвечает на вопрос: "Как это работает?". Организовывать подобную логику в пользовательских картах не нужно, поскольку это усложняет процесс отслеживания ошибок, тем более, если в карте установлено несколько подобных раздатчиков. Данная статья поможет тем, кому не подходит организованная по умолчанию логика работы раздатчика, и он хочет организовать свою собственную. Именно такая ситуация возникла у меня, в связи с чем мне пришлось разбирать по частям всё устройство работы раздатчика кубов.
Cr 11 Jan, 2014 @ 1:07pm 
wat
Пудге 11 Jan, 2014 @ 2:53am 
0_0
Foxy7Bu 8 Jan, 2014 @ 7:31pm 
Спасибо за статью
S00102008 8 Jan, 2014 @ 2:16am 
? это для построения доп карт без помощи редактора или прям в редактор его пихать?
skv 7 Jan, 2014 @ 5:06am 
a
Yonker 5 Jan, 2014 @ 10:16pm 
спасибо
:tgrin:
Тетя Зло 5 Jan, 2014 @ 10:31am 
пфф
RazorMaster 16 Nov, 2013 @ 2:15pm 
d