Все о Outputs / Inputs
1. Пролог
Приветствую вас, уважаемые товарищи мапперы. Сейчас темой нашего разговора будут Аутпуты и Инпуты.

Для тех, кто не мапперил ранее (до ХЛ2) говорю: это — нововведение в новый Valve Hammer Editor (далее «Хаммер»).
Если вы читали FAK на сайте inside.hl2.ru, то видели там такую фразу «Эти
вкладки отвечают за влияние на данный объект (Input) и влияние самого объекта на
другие объекты (Output).
». Она, конечно, дает базовое понятие о них, но очень обобщенно и просто. А если вы хотите подробнее узнать о них и о том, как
ими пользоваться? Вот тут-то и приходит на помощь эта статья. Она помогает новичку изучить и освоить Аутпуты и Инпуты, не применяя метод проб и ошибок.
Так вот эти «пробы и ошибки» делал я и пишу вам, чтобы вы не наступили на те же
грабли :).
2. Аутпуты/Инпуты — внуки программирования
Аутпуты и Инпуты (запарился уже называть их вместе так, разрешите называть их Путами)… Путы, на мой взгляд, можно назвать элементом программирования. Если
вы знаете азы программинга (хоть-какого: C, JavaScript
и т. п.), то эти Путы «дадутся» вам легче. Если вы знаете, типичными операторами
языков программинга являются условия: if… else… К
моему сожалению, такого вот в нашем новом Хаммере нет (а может просто я еще не
заметил, но скорее всего нет). Тем не менее, тот элемент программинга, про который я хочу вам
сказать, это обработчики событий и события.
Обработчик события — это…
Как бы вам так объяснить?.. Ну это такое специфическое воздействие на объект, совершив которое выполняется событие.
Событие — оно и в Африке событие :)… Это то, что случится, когда сработает обработчик события.
Наверно, вы думаете: зачем это мозгохавство нам нужно, при чем тут эти обработчики и события? А я вам скажу: надо, Федя, надо :), чтобы понять суть, принцип работы
путов; и не беспокойтесь, сейчас я установлю связь между обработчиками, событиями и аутпутами, инпутами.
Итак, в нашем случае роль обработчика играет Аутпут. А роль события играет Инпут. Просто замените слово Обработчик словом Аутпут, Событие — Инпутом, а вместо объекта — энтитю, и прочитайте теперь выше написанные определения…
3. ХЛ1 VS. ХЛ2

Давайте-ка простым примером сравним возможности движка (и Хаммера тоже) ХЛ1 с движком ХЛ2. Мы возьмем кнопку и свет, и посмотрим, как они смогут взаимодействовать в каждом случае.

ХЛ1:
Поставим кнопку func_button и свет
light. Имя света пусть будет svet. Заходим в
свойства нашей кнопки и в свойство Target вводим
svet, т. е. мы назначили цель кнопки: на что будет
ссылаться кнопка, когда на нее нажмут (у нас — на свет). А что именно при этом
будет делать свет — это уже не наши проблемы, а света… Заходим в игру:
нажимаем на нашу кнопку — свет выключается, еще раз жмем — включается. Вот такой вот механизм… примитивный…

ХЛ2:
Поставим на карту те же самые энтити, то же самое имя света. Теперь заходим в свойства кнопки и говорим: «Опааа! А где же параметр Target???».
А он ушел… Как говорится, ушел с приветом, вернулся умным :), захватив с собой 2 новые вкладки в свойствах объекта: одна из них Outputs, другая — Inputs. Параметр Target пошел на расширение: отныне власть передана в наши руки, и мы сами можем определить: что именно случится при каком именно действии. Так например, мы
сможем сделать так: обработчик — при стрельбе в кнопку, событие — включить свет (только включить). Даже можем еще одну кнопку создать, при нажатии которой, свет
будет выключаться (только выключаться). И в игре все будет так: в одну кнопку стрельнете — свет останется включенным, а если подойдете и нажмете вторую кнопку — свет выключится и если еще раз нажать на эту кнопку — свет будет оставаться выключенным, и только при стрельбе в первую свет будет включаться.

Вывод:
В ХЛ1 кнопка работает переключателем между включить/выключить, которая поочередно то включает, то выключает свет. Таким образом, в ХЛ1 — узкий диапазон
возможностей, однообразное использование энтитей. В ХЛ2 же кнопки отвечают за выбранное нами действие и совершают выбранное нами событие (подчеркиваю: выбранное нами). Значит, в ХЛ2, в отличие от ХЛ1, нам дают возможность выбора.

P. S. Естественно, все, что сказано в выводе
справедливо не только для кнопок и света.


4. Аутпуты и Инпуты в Хаммере или Инструкция по применению

Начнем эту часть статьи с того, что у каждого объекта (энтити) есть свои специфические Аутпуты и Инпуты. Точнее сказать, аутпуты есть у большинства объектов,
но не у всех, а вот инпуты — абсолютно у всех. Рассмотрим теперь обе вкладки по-отдельности. Для начала создайте быстренько карту и в ней поместите дверь func_door и кнопку func_button. Обзовите дверь door1. Теперь зайдите в свойства кнопки, а затем в Аутпуты.

Вкладка Outputs:
Что мы здесь видим? Ну мне придется попунктно объяснить-разъяснить все содержимое этой вкладки.
1) Таблица. В ней выводятся все созданные Аутпуты для данного объекта и их настройки. 1 строчка в таблице — 1 Аутпут.

Далее идут настройки выделенного в таблице Аутпута.
2) My output named: … В это текстовое поле
надо вводить название Аутпута (обработчика), вернее не вводить, а даже выбирать из выпадающего списка. В этом списке собраны только те Аутпуты, которые относятся к текущей энтите. Название любого Аутпута любой энтити начинается на «On…» (например, OnPressed). Чтобы понимать смысл названий Аутпутов, действуйте так: первую часть названия «On» переводите как «При», а то, что идет после — с помощью словаря (если не понимаете). Так например, «OnPressed» переводится как «ПриНажатии».
3) Targets entities named: … Цель
взаимодействия. Сюда вводят имя энтити, с которой, непросредственно, будет взаимодействовать текущая энтитя своим Аутпутом. Здесь тоже предпрочтительнее выбирать из списка уже существующих энтитей на карте.
4) Via this input: … Переводится как «Через
этот инпут». Но этого как всегда не достаточно, чтоб понять для чего нужно это поле. В общем, сюда надо определить название Инпута, выбрав его из списка. Как
уже говорилось выше, это то, что случится именно с той энтитей, которую мы выбрали в поле «Targets entities named». Отсюда вытекает следствие: в поле Via this input всегда отображаются все возможные инпуты объекта, но не текущего, а выбранного в поле Targets entities named; содержимое поля Via this input зависит от содержимого поля Targets entities named.
5) With a parameter override of: … Это поле
предназначено для задания параметров. Параметров чего? Параметров события, выбранного в поле Via this input. Заметим, что это поле не всегда доступно, т. к. зависит от рода инпута. Например, если инпут такой «SetParent», который задает родителя (имя объекта, который станет родителем, когда случится инпут), то здесь без параметров не обойтись. В данном случае в поле параметров надо будет написать имя этого объекта.
6) After a delay in seconds of: … Задержка в
секундах перед выполнением инпута.
7) Флажок Fire once only — при установленном
флажке инпут выполнится только 1 первый раз, после первого раза как бы станет не работающим.
8) Кнопка Mark — нужна, чтобы автоматически
выделить тот объект, который указан в поле Targets entities named, т. е. тот объект, с которым взаимодействует данный Аутпут.
9) Кнопка Add — добавляет новый Аутпут с
пустыми настройками, естественно, которые в дальнейшем нужно будет настроить :)
10) Кнопка Copy — копирует один/несколько
выбранных Аутпутов со всеми настройками.
11) Кнопка Paste — вставляет скопированный (ые)
ранее Аутпут (ы)
12) Кнопка Delete — удаляет выделенный (ые) Аутпут (ы)

Еще одно: в окошке свойств объекта при создании Аутпута появляется значок Аутпута (внизу окошка — кружок, и от него идет стрелка). Он меняется в зависимости от правильного заполнения настроек Аутпута: если все правильно, то значок обычный, как на скриншоте ниже, а если хоть одно поле из настроек (кроме поля параметров) Аутпута заполнено неверно, то значок становится зачеркнутым красной линией.
Уууффф!.. Вот и исследовали вкладку Outputs.
Перейдем теперь к Инпутам. Там, слава Богу, все намного легче!

P. S. Сделайте у себя все как на том скрнишоте выше
(добавьте 2 Аутпута и заполните настройки), потому что это нам понадобится во время изучения Инпутов.

Вкладка Inputs:
Зайдем теперь в свойства нашей двери, во вкладку Inputs.
Смотрим… Как видим, здесь приведены Инпуты, которые должны происходить с дверью. А кто породил эти Инпуты… Ну конечно же Аутпуты! Аутпуты других объектов, воздействующие с этой дверью. У нас — это кнопки, у которых в полеTargets entities named стоит эта дверь. Итак, что мы выяснили? Что во вкладке Инпутс, в таблице приведен список всех других объектов, Аутпуты которых (точнее поле Targets entities named) взаимодействуют с данным объектом. И данный объект обязан выполнять все приказы Аутпутов других объектов :).

Здесь конечно нечего рассматривать… Ну хорошо… Рассмотрим графы таблицы:
1) Source — нет, это не движок Source!!! :))) Это, так сказать, исходник или даже источник данного Инпута — имя или название объекта, который породил данный Инпут
своим Аутпутом.
2) Output > - это Аутпут того объекта —
дейтсвие, при котором произойдет данный Инпут.
3) My Input — «Мой Инпут, никому не дам» :) Собственно, сам Инпут данного объекта, заданный Аутпутом того объекта.
4) Parameter — параметр Аутпута того объекта.
5) Delay — та же задержка перед выполнением
данного Инпута.
6) Once — однажды или не однажды на карте
должен произойти данный Инпут.

И тут одна единственная кнопка Mark — служит для того,
чтобы выделить объект, Аутпут которого ссылается на данный объект.

Инпуты также имеют свои значки. Они тоже появляются внизу окошка свойств объекта. Но, в отличие от Аутпутов, у них на значке нарисован кружок, в который заходит стрелка.

Взаимосвязь значков Аутпутов и Инпутов
Вот демонстрация этой взаимосвязи: построим 2 объекта; в Аутпутах первого объекта целью выставим второй объект; в окошке свойств первого появился значок Аутпута, у второго — значок Инпута; а теперь в Аутпутах первого введем в какое-нибудь поле (кроме Targets entities named) что-нибудь неправильное; увидим, что значок Аутпута у первого объекта зачеркнулся красной линией; теперь заходим в Инпуты второго объекта и видим — значок Инпута тоже зачеркнулся. Вот так-то!

5. Эпилог
Благодаря этой статье, думаю, я поднял и перенес вас через ту дорогу, на которой лежали грабли… :) А теперь отпускаю. Казалось бы, что я перенес вас абсолютно через все трудности, но это только теоретически. Теперь на практике вы будете сами идти по своей дороге продвижения вперед и, вероятно, будете иногда натыкаться на мелкие трудности и преодолевать их, но уже не на грабли!
Автор: GeCS.
20 марта 2005, 18:06