Здравствуйте.
Сразу хочу предупредить, что этот урок рассчитан на картостроителя с некоторым опытом.
Этот опыт подразумевает умение создания различных помещений, а также умения
работать с точечными элементами (entite's).
Если вы еще не умеете делать вышеперечисленное, то настоятельно
рекомендую вам научиться этому прямо сейчас!

И так начнем… я расскажу вам как сделать лифт
для трех и более этажей.
================= ЧАСТЬ 1 ========================
Думаю почти каждый из картостроителей рано или поздно хотел сделать лифт
для своего замечательного уникального сооружения, и, но сталкивался с непреодолимыми
проблемами или же наоборот делал этот лифт, но он был очень сложен в использовании и
через некоторое время вообще отказывался работать.
Представленный ниже лифт имеет несколько достоинств: простоту построения, простоту
последующих изменений, а так же надежность постоянной работы.
(тут оговорюсь, что этот способ может быть не единственным и
не самым лучшим особенно учитывая ваше право выбора)
Для начала создадим помещение для будущего лифта и, самое главное, этажи между
которыми он будет передвигаться. Советую сделать «кубик» попросторнее чтобы избежать
неудобств в освоении.
Теперь у вас есть поле для действий. Создайте три или более этажа.
у меня это выглядит так.
далее нам необходимо создать сам лифт или, если быть точнее, его форму.
сделайте браш и превратите его в Func_train. Так же можно сделать множество брашей
далее выделить их вместе (используйте клавишу ctrl для удобства).
и не забудьте добавить панель для кнопок (имеется ввиду простой браш).
Теперь у вас есть свой лифт. Сразу же установите начальные настройки.
Name = Lift // Имя лифта
Speed = X/Z // Скорость движения лифта
First stop target = path_track1 // это первая остановка на вашем будущем пути.
Внимание! Если реальное имя первой остановки отличается от заданного тут, то лифт не будет двигаться!
Эта ошибка происходит очень часто, при каких либо изменениях в пути.
во Flag`ах поставьте галочку на [Fixed Orientation] для того, что бы ваш лифт всегда двигался ровно и
не переворачиваясь ;) а так же [No User Control] что бы игрок не мог управлять им как вагонеткой из Half-Life1
Когда форма лифта готова необходимо создать траекторию по которой он будет двигаться.
выберите path_track и Внимание поставьте по одному элементу на каждый этаж с
учетом стыка лифта и этажа. (количество path_track'ов в дальнейшем можно увеличить для более
точного и может быть красивого движения лифта)
То есть высота лифта может, и чаще всего будет, отличаться от высоты этажа.
Если вы не хотите, чтобы ваш лифт проезжал этаж или не доезжал до него, поставьте
path_track чуть ниже или чуть выше, так как этого требует архитектурная особенность
вашего уровня.
вот несколько примеров для более простого объяснения этой маленькой проблемы.

Я думаю, вы разобрались со всеми пока преследующими вас проблемами и можете двигаться дальше.
поставьте в настройках каждого path_track`а
Name = path_track1 // 2,3,4 и тд
Next stop target = path_track2 // Для первого 3 для 2 и 4 для 3.
Orientation type = no change // важно! при других параметрах могут быть проблемы с направлением движения.

на данный момент должно быть что-то вроде этого.
Давайте добавим кнопки, пока только для лифта.
ведь нам надо же как-то управлять им. :)
(В 3-ей Части описывается замена кнопок другим инструментом)
Создайте по одной для каждого этажа на вашей панели (браш лифта).
По желанию можно добавить еще одну кнопку для самоуничтожения по истечению пяти секу. =D
зададим следующие начальные настройки…
name = Lift_button01 // 02,03,04 и т.д. на каждую следующую кнопку.
parent = Lift // или имя того объекта к которому вы хотите приклеить эти кнопки
Deley before reset = 0 // время зажима кнопки.
во Flag`ах поставьте галочки на [Don't move] и [Use Activates]
Должен получиться аналог ниже представленного изображения.


================= ЧАСТЬ 2 ========================
И так вы пришли к самому главному, к принципу действия лифта.
Вы спросите КАК? А я отвечу ОЧЕНЬ ПРОСТО!
Тут не надо изобретать велосипед или пытаться нарисовать картину Манэ.
Сначала попробуем понять основу, то есть, то, что нам нужно от нашего изящного лифта.
Представим лифт и три этажа. Мы нажимаем на кнопку для передвижения на второй этаж.
А рас он должен двигаться значит, должно быть, что-то, что заставит его это сделать.
в данном случае будет команда через OutPut.
Думаем дальше… лифт поднимается поднимается и еще чуть чуть поднимается и останавливается
на втором этаже. Стоп! а что заставило его остановиться? Значит опять должно быть что-то
что заставит его сделать это.
Идем дальше… Зададим вопрос. Как лифт поймет, на каком именно этаже ему остановиться?
значит снова должно быть, что-то, что будет сравнивать этаж, который вы проезжаете
с тем этажом на который вы хотите попасть!
И последнее… продолжим представлять и продумывать. Мы остановились на втором этаже, сделали
все нужные дела, вернулись в лифт и нажали теперь уже кнопку третьего этажа. Лифт понимает что надо
ехать и первое приводит его в движение, третье определит, что мы остановимся именно на третьем этаже
(ведь компьютер не видит этажи, как это делаем мы! вдруг у нас и 99 этажей есть?!)
и второе остановит сам лифт, но зададимся последним вопросом.
А как, черт возьми, Лифт поймет, куда ему ехать вверх или вниз? значит должно и будет то что
будет это определять.
Все принцип действия лифта продуман, осталось только распределить первое, второе, третье и четвертое
в нужном порядке. Потому что порядок должен быть везде. Его не может не быть. ;)
Это будет выглядеть так.
Нажимаем кнопку, и лифт сначала определяет направление движения, затем движется,
затем сравнивает проезжаемый этаж с тем который нужен и в конце концов останавливается.
Вроде ничего сложного здесь не видно.
Уже было сказано много слов, и было продумано много мыслей, так давайте же приступим к работе!
(а то у вас уже, наверное, и глаза и мозг устали ;])
но как говорится… трудно в учении, легко в раю!
Вернемся к уже созданной заготовке, вспомним план :) и создадим то, что будет определять направление движения.
В данном случае это действие будет выполнять точечный элемент (Entity) Logic_Compare.
Поставьте куда-нибудь около лифта этот элемент и задайте начальные настройки.
name = Lift_Compare01 // Советую добавлять номер. а вдруг вы захотите создать еще. вы можете запутаться.
init Value = 1 // здесь мы будем задавать номер этажа, на который хотим поехать.
Compare Value = 1 // здесь мы будем задавать номер этажа, который будем проезжать.
Теперь заранее откройте закладку OutPut и добавьте команды
OnGreaterThan → Lift → StartForward
OnLessThan → Lift → StartBackward
Затем зайдите в настройки остальных кнопок и задайте те же команды с нужным номером этажа.
Таким образом, вы соединили первое и второе действие воедино.

Следуем дальше. Зайдите в кнопку этажа [1] и откройте закладку OutPut.
Тут снова добавьте команды

OnPressed → Lift → Resume → 0 // Реанимирует лифт из замороженного состояния.
тут на всякий пожарный чтобы команда стоп не заморозила его на мертво.
OnPressed → Lift_Compare01 → setValue 1 → 0.01 // 1 — это цифра этажа на который мы хотим поехать.
OnPressed → Lift_Compare01 → Compare → 0.02 // 0.02 — это секунды задержки, то есть мы хоти чтобы
элемент Lift_Compare01 сравнил числа через 0.01 секунды после выполнения условия!
Теперь зайдем в настройки кнопки этажа [2] и зададим почти такие же команды.
OnPressed → Lift → Resume → 0 // описание смотрите выше.
OnPressed → Lift_Compare01 → setValue 2 → 0.01 // описание смотрите выше.
OnPressed → Lift_Compare01 → Compare → 0.02 // описание смотрите выше.
посмотрим… если мы сейчас откомпилируем, то, что у нас есть, то лифт уже должен ездить вверх и вниз.
если же лифт отказывается ехать, значит, вы, где- то совершили ошибку.
Попробуйте заново создать сцену или найти эту зловредную ошибку и уничтожьте ее. >:)
так… ваш лифт катается вверх и вниз… сохраните его, что бы, не возвращаться к самому началу.
Идем дальше, не останавливаемся!
создайте где-нибудь около лифта и элемента Lift_Compare01 еще один элемент Logic_Compare
Как и всегда, назначим ему начальные настройки
name = Lift_Compare02
init Value = 1 // описание смотрите в Lift_Compare01
Compare Value = 1 // описание смотрите в Lift_Compare01
и снова заранее откройте закладку OutPut и добавьте такие команды.
OnEqualTo → Lift → Stop // тут и так все понятно
Теперь для того, чтобы эта команда сработала, зайдите в настройки все
элементов path_track по очереди и добавьте вот эту команду.
OnPass → Lift_compare02 → Compare // Когда лифт будет проезжать очередной этаж, он,
начиная с этой команды, будет проверять, надо ли ему остановиться.
Как и в прошлый раз мы соединили третье и четвертое действие воедино благо игра позволяет! :)
В очередной раз зайдите в настройки кнопку этажа [1] далее в закладку OutPut.
OnPressed → Lift_Compare02 → setValue 1 → 0.03 // 1 — это цифра этажа, на который мы хотим поехать.
Повторите эту команду в остальных кнопках, меняя цифру этажа.
и последнее заключительное действие ;)
Зайдите в настройки Path_track1 затем в закладку OutPut. вставьте эти команды
OnPass → Lift_compare01 → SetCompareValue → 1 → 0 // описание смотрите выше.
OnPass → Lift_compare02 → SetCompareValue → 1 → 0.01 // описание смотрите выше.
OnPass → Lift_compare02 → Compare → → 0.02 // Выполнение сравнения номера этажа
который проезжаем и до которого хотим добраться.
затем повторите (скопируйте) эти команды с изменением цифры этажа в каждом следующем Path_track'е.
И в заключении вы можете расставить кнопки вызова лифта.
для этого просто скопируйте кнопки с лифта и поставьте на соответствующих этажах.

ВСЕ! да да! мы закончили этот ужасный лифт! Теперь вы можете компилировать и проверять его на работа-способность.
Если он не работает то как и перед этим начните сцену (уже не сначала ;] а) с предыдущего
сохранения или найдите и аннигилируйте ту самую ошибку.
Для этого посмотрите внизу описание примитивного дебага для этого лифта.
Если же все ок, можно немного усовершенствовать этот лифт, и навести, как я говорю, некоторую косметику…
И так для беззаботной жизни нам не хватает кнопок для вызова лифта на каждом этаже, так давайте создадим их!
А так же еще можно добавить сверху показатель этажа, на котором находится лифт.
(но это в будущем и различных вариациях)
и напоследок давайте еще добавим двери, кнопку стоп, кнопку вызова диспетчера, свет в лифте,
возможность нажатия несколько кнопок этажей одновременно!
думаю пока этого достаточно =D для размышления. Все вышеперечисленное действительно можно реализовать.
но не в этот раз.
=== ДЕБАГ =================
У вас могут возникнуть проблемы различного рода, из-за которых лифт или вообще не будет работать
или работать будет, но не корректно.
все ошибки можно разделить на два класса (в данном случае с лифтом) графические и логические.
При графических ошибках, возможно, просто некорректно сделаны браши или модели.
Например, что-то или цепляется или не дает проехать. может быть ошибки другого рода когда некорректно отображаются
браши и текстуры. Такие ошибки можно найти или своими глазами :) или нажав Alt+P в редакторе.
При логических ошибках уже может быть все что угодно %)
самые частые ошибки это измененные имена то есть имя вызывается командой, но на самом деле оно уже другое
поэтому команда, как бы уходит в некуда. Далее неправильные данные… может вы просто
нажали не ту цифру при вводе и теперь команда ищет не существующий этаж или еще что ни будь в этом роде.
тут уже важно знать какие данные в какой то момент времени находятся в определенной Entity
для этого вы можете воспользоваться командами Ent_dump и Ent_fire
пример синтаксиса (то есть как правильно надо писать эту команду в консоле)
Ent_dump Lift_compare02
на экране у вас появится статистика различного плана по Entity, которую вы указали.
Команда Ent_fire «Поджигает» или включает определенную команду у определенной Entity.
Например мы хотим проверить свободно ли ездит лифт или ему что-то мешает. наберем в консоле
Ent_fire Lift StartForward (после этого лифт должен поехать вперед). Исходник и карта прилагаются.
Автор: ScorpyX.
10 февраля 2005, 20:08