Голливуд отдыхает! Редактор MaxEd, часть 2
В прошлом номере “Мании” мы начали знакомство с редактором MaxEd , позволяющим создавать уровни к Max Payne. Если вы пропустили ту статью, советую вам найти ее и изучить (материал имеется на нашем компакте ), иначе вы рискуете чего-нибудь не понять в нашем сегодняшнем уроке. Цель последнего — углубить ваши познания в области работы в редакторе, чтобы вы смогли научиться делать такие карты, на которых будет по-настоящему интересно играть и на которые будет приятно смотреть. Много-много текстур Думаю, во время создания своего первого уровня вы не раз испытывали Объекты быстрого приготовления
Те, кто не хотят возиться с рисованием различных объектов, типа дверей, огнетушителей, телевизоров, бочек и т.п., но хотят оборудовать ими свой уровень, могут воспользоваться предоставленными авторами заготовками, которые были выложены в Сеть для свободного скачивания (их можно позаимствовать с нашего диска ). Последние представлены в виде *.lvl-файлов , и могут быть вставлены в ваш уровень посредством клика на основное окно программы, выбора пункта меню File/Insert document… и последующего указания *.lvl-файла с нужным вам объектом. Вставленные объекты можно свободно таскать по уровню, пользуясь услугами режима Transform. Не забудьте также сделать их дочерними по отношению к той комнате, где они пребывают.
нехватку различных текстур, так как последние с редактором, к сожалению, не поставляются. Конечно, можно позаимствовать текстуры из уровня-примера BasicRoom , но там их — кот наплакал. Куда лучше повытаскивать текстуры из уровней игры при помощи утилиты LDBRip , которая лежит на нашем компакте. Что касается самих карт, то их, в виде *.ldb-файлов (уровни находятся в откомпилированном виде, так что редактор с ними работать не станет), можно получить путем распаковки архивов игры x_level1.ras , x_level2.ras и x_level3.ras. Первый из них посвящен уровням из первой части игры, второй — картам из второй части и третий — из третьей. Архивы лежат прямо в игровой директории. Вытащить же их можно с помощью утилиты RasMaker , входящей в состав пакета MAX-FX Tools (о том, как работать с *.ras-архивами игры, подробно рассказано в октябрьском номере журнала, в статье по вскрытию Max Payne ). Утилита LDBRip проста в обращении. Поместите нужный *.ldb-файл в папку с ней и наберите в командной строке следующую команду: *ldbrip <имя .ldb-файла> (например, ldbrip part1_level1.ldb). После непродолжительного процесса по “выдиранию” текстур из файла в директории с утилитой появятся соответствующие текстуры форматов *.pcx , *.jpg и *.bmp , которые затем можно с легкостью импортировать в ваш уровень, используя пункт меню Material/Insert bitmaps… Уровень под открытым небом Первым делом научимся создавать открытые пространства. Если вам нравится эта идея, добавьте в ваш уровень группу текстур Skybox , пользуясь пунктом меню Material/Add category. Теперь добавьте в категорию Skybox текстуру (или несколько текстур), которую вы хотели бы использовать в качестве неба. Только учтите, что для неба годятся только те текстуры, которые с виду представляют собой зеленоватый прямоугольник с надписью Skybox в центре. Такие текстуры можно вытащить практически из любого *.ldb-файла. **__**После этого перейдите в режим Texture и, выбрав на панели текстур созданную вами категорию Skybox и отыскав в ней добавленную ранее “небесную” текстуру, наложите последнюю на потолок помещения, которые вы хотите сделать “открытым”. Координатная сетка Теперь, когда вы уже владеете основными навыками картостроения в MaxEd, пора научиться применять режим Move grid и работать в нем. Нужен он, как уже упоминалось в предыдущей статье, для перемещения поля (координатной сетки). Оно осуществляется посредством клика левой кнопкой мыши на поле и дальнейшего его перетаскивания с помощью курсора, если вы хотите двигать его в горизонтальном направлении; если же вам надо переместить координатную сетку по вертикали, кликаете правой кнопкой мыши. При желании можно перетаскивать поле при помощи клавиш Page Up (вверх) и Page Down (вниз). Чтобы установить поле в вертикальное положение (удобно в том случае, если вам, например, нужно поместить на стену комнаты какой-либо объект), используется режим Extrude. Перейдя в него, зажмите клавишу A и подвиньте курсор мыши вдоль той стены вашей комнаты, по которой, по замыслу, должна проходить координатная сетка. Разберем еще несколько операций, которые вы можете проделать над полем. Если вам нужно временно убрать поле с экрана (это бывает полезно, когда вы осматриваете вашу карту, а поле загромождает экран), нажмите на клавишу " * ". Чтобы вернуть координатную сетку на экран, используйте эту же клавишу. Чтобы уменьшить размер клеток координатной сетки (это пригодится при рисовании объекта небольшой величины — к примеру, двери), используйте клавишу " + " для увеличения клетки и " - " — для уменьшения. При желании можно также уменьшать/увеличивать величину поля с помощью комбинаций клавиш Alt + " + " (для увеличения размеров сетки) и Alt + " - " (для уменьшения). Создаем объекты Загрузите уровень, который мы создавали в прошлый раз (если его уже нет в живых, ничего страшного — просто сделайте комнату побольше со стартовой точкой внутри). Вам не кажется, что ваша карта немного пустынна? Думаю, не будет лишним оформить ее получше, украсить объектами вроде шкафов, столов, колонн и т.д. Для начала разместим
Вот такой симпатичный шкафчик вышел.
в нашем уровне шкаф небольшой величины. Рисуется он так же, как и комната, вот только размерами должен быть поменьше. Следующим этапом является подбор подходящих текстур. В нашем случае можно использовать в качестве источника текстур файл ldbrip part1_level1.ldb , соответствующий первому уровню игры, и взять оттуда текстуры LOCKERBENCH1.jpg (для нижней и верхней стенок шкафа), LOCKERS_DIRTY.jpg (для передней и задней стенок шкафа) и Lockers02_64x128.jpg (для боковых стенок его же). Перед тем как накладывать на шкаф текстуры (текстурируется он так же, как и комната), выберите сначала одну из них на панели и кликните по ней правой кнопкой мыши. В появившемся списке поставьте галочку рядом с пунктом Dualsided. Затем проделайте то же самое со всеми текстурами, которые пойдут на нужды шкафа. И не забудьте сделать его дочерним объектом комнаты. __ Все объекты украшательного плана, имеющие прямоугольную (или близкую к ней) форму, создаются по рассмотренному выше принципу. Если же вы хотите создать объект более сложной формы, от вас требуется нарисовать его по частям, а затем совместить их. Скажем, стол должен состоять из пяти частей, каждая из которых подготавливается отдельно: четыре ножки и доска. Чтобы красиво нарисовать мелкие части объекта, типа ножек для стола, предварительно уменьшите величину клеток координатной сетки. Вы также можете украсить свой уровень различными 2D-объектами вроде плакатов, картин, вывесок. Чтобы повесить на стену какую-нибудь картину или, скажем, постер, первым делом установите поле в вертикальное положение. А вообще двухмерные объекты рисуются (и текстурируются) так же, как и трехмерные, только при заключительном клике правой кнопкой мыши следует держать нажатой клавишу Shift. Если рисунок, что красуется на используемой вами текстуре, плохо поместился на поверхности вашего 2D-объекта, можете подвигать его курсором мыши, находясь при этом в режиме Texture и зажав правую кнопку мыши. Чтобы отрезать часть от какого-либо предмета (назовем этот предмет основным), создайте объект (обзовем его вспомогательным), который по форме будет напоминать область, которую вы хотите вырезать из основного объекта. Разместите созданный только что объект по отношению к основному так, чтобы вспомогательный при совмещении с основным и последующем удалении первого отсекал бы нужную вам область. ****После этого активизируйте режим Transform. Наведя курсор мыши на вспомогательный объект и нажав клавишу U , кликните на основной предмет. Вам останется только выбрать в появившемся меню пункт Subtract из группы Boolean type и нажать на кнопку OK. ****При помощи данной операции можно создавать объекты причудливой формы, а также самые обычные дверные проемы и окна (правда, окно желательно еще застеклить подходящей текстурой), вырезая в стене прямоугольную область. Триггеры Мы еще не говорили о триггерах… Без их помощи невозможно создать нормальную дверь, кнопку, рычаг, переключатель. Правда, и триггер, в свою очередь, является пустым местом, если ему не задавать никаких команд. Впрочем, о командах ниже. Установить триггер не составляет труда. Просто наведите курсор на отведенное ему место, вызовите окно New entity (напомню, что данное окно вызывается нажатием клавиши N , когда вы находитесь в режиме Model ) и выберите нужный вид триггера. Вот полный список последних: Player collide trigger — триггер, активизирующийся в том случае, когда Макс дотрагивается до него. Character collide trigger — триггер, который срабатывает тогда, когда какой-либо субъект (Макс к таковым тоже относится) его касается. Projectile collide trigger — триггер, активизирующийся при попадании в него из какого-либо оружия (попадания врагов также засчитываются). Action button trigger — триггер, срабатывающий в том случае, когда играющий на него нажимает, используя для этого клавишу Enter (такой тип триггера, как несложно догадаться, используется для создания кнопок). Look-at trigger — триггер, который активизируется, если на его центральную часть падает взор Макса, стоящего в радиусе этого же триггера. Подтвердив выбор и дождавшись появления нового окна, кликните на вкладку Trigger и настройте радиус триггера, изменив значение характеристики Radius. Динамические объекты Под динамическими подразумеваются объекты, которые могут иметь анимацию или совершать какие-либо действия. Практически любой игровой объект можно сделать динамическим, вот только не каждый имеет смысл делать таковым. Скажем, столб, который стоит себе на месте и всегда будет так стоять, динамическим делать попросту бессмысленно. А вот тот же шкаф совсем даже не помешает сделать динамическим и “научить” его с помощью соответствующих команд открывать/закрывать дверцы — не говоря уже о двери, которая вообще не может не быть динамической (если только она не задумана вечно запертой). Чтобы сделать какой-либо объект динамическим, перейдите в режим Transform и, наведя курсор на свою жертву, нажмите на клавишу D и подтвердите свой выбор. Как видите, создание “подвижного” объекта — дело минутное, если не сказать секундное. А вот присвоение ему должной анимации — достаточно трудоемкая работа, требующая определенных навыков. Двери и все, что с ними связано Чтобы приобрести навыки, о которых говорилось чуть выше, создадим функциональную дверь. Нарисуйте трехмерную фигуру (это должен быть прямоугольный параллелепипед), которая задаст форму вашей будущей двери, и поместите ее в нужное вам место. Наложите на дверь подходящие текстуры (у всех этих текстур должна быть включена опция Dualsided ) и сделайте ее дочерним объектом помещения, в котором она располагается. Сделайте дверь динамической и, используя панель объектов, зайдите в свойства вашей двери, придумайте ей достойное имя и, кликнув на вкладку Statistics , поставьте галочки рядом со всеми местными характеристиками, кроме Export lights и Pointlights affect. Keyframe’ы Поскольку наша дверь должна нормально
В центре экрана — окно keyframe’ов.
функционировать, то есть открываться/закрываться, нам нужно ее анимировать. Но чтобы это сделать, вам следует сначала задать для двери начальную и конечную позиции, которые она будет занимать во время процесса открытия/закрытия. Такие позиции задаются с помощью keyframe’ов. Зададим подходящие для нашей двери keyframe’ы. Для этого активизируйте режим Transform. Далее выделите дверь, наведя на нее курсор мыши, и нажмите Tab. Появится окно keyframe’ов, внутри которого слева располагается список последних, а справа — ряд кнопок, с помощью которых можно проделать различные операции над самими keyframe’ами. ****Выделите уже имеющийся keyframe под номером 0 и, нажав на кнопку Rename , присвойте ему для удобства имя Сlosed. Данный keyframe будет определять позицию двери, когда та находится в закрытом виде. Нажав на кнопку Add , создайте новый keyframe и обзовите его словом Open (этот keyframe будет определять месторасположение двери, когда она открыта). Выберите из списка только что созданный keyframe и нажмите на кнопку Goto , расположенную в нижней части окна. Наконец, закройте окошко keyframe’ов. Точка вращения Затем вам нужно установить точку вращения двери. Чтобы сделать это, перейдите в режим Move grid и поместите центр координатной сетки (центр поля — это точка, в которой соприкасаются белая, желтая и красная линии) в то место, которое по вашему замыслу должно стать точкой вращения вашей двери. После этого смените режим работы редактора на Transform , выделите дверь и нажмите на клавиатуре кнопку P. В вылезшем окошке просто кликните на Yes. Далее вы должны указать, в каком положении будет находиться ваша дверь, если ее полностью открыть. Для этого, находясь в режиме Transform , нажмите на клавишу W или A. Только теперь вы можете устанавливать предел вращения двери, зажав правую кнопку мыши и нажимая на клавиатуре кнопки 1 , 2 и 3 (1 — вращение двери по оси X, 2 — по оси Y и 3 — по оси Z). Пользуясь перечисленными клавишами, установите вашу дверь в то положение, которое она будет занимать в открытом виде. Анимация Следующим шагом является задание анимации для нашей двери, для чего вам нужно войти в режим Transform и, указав курсором мыши на дверь, воспользоваться комбинацией клавиш Shift + Tab. На экране появится окно анимации, оформленное по принципу окна keyframe’ов. ****Создадим три анимации для двери: первая — для ее открытия, вторая — для закрытия и третья — для “ожидания” (эта анимация используется затем, чтобы дверь после открытия оставалась открытой на протяжении нескольких секунд). Сначала создадим анимацию для открытия двери. Для этого кликните на кнопку с надписью Add. В новом окошке из верхнего списка, названного Start keyframe , выберите начальное положение двери для данной анимации — keyframe Closed , а из нижнего списка ( End keyframe ) — конечное положение двери при данной анимации, keyframe Open. Пользуясь услугами кнопочки Rename , поменяйте имя анимации на Open. Затем сделайте еще две анимации. Для первой из них, а именно анимации закрытия двери, начальным keyframe’ом должен быть Open , а конечным — Closed. Назовите эту анимацию Closed. Что касается последней анимации, то она должна использовать для обоих положений двери один и тот же keyframe — Open , а называть эту анимацию лучше всего не иначе как Stop. Теперь, когда все три анимации готовы, осталось только выбрать продолжительность для каждой из них. Для этого кликните на название интересующей вас анимации и нажмите на расположенную снизу кнопку, именуемую словом Length. В появившемся окошке небольшой величины просто укажите продолжительность анимации (в секундах). Если же вы желаете просмотреть какую-либо анимацию, дважды кликните на ее название. Теперь окно анимации можно смело закрывать. Команды Переходим к следующей части нашей работы по созданию функциональной двери — написанию для нее команд или сообщений, что, в общем-то, одно и тоже (в MaxEd они зовутся FSM или просто Messages ). Если вы помните, мы уже занимались этим в предыдущей статье, только по отношению к врагам. Первым делом активизируйте режим Transform и, выбрав дверь, нажмите на клавиатуре клавишу 4. В вылезшем окошке жмите на кнопку Messages , расположенную в правом нижнем углу окна. Последнее уступит место новому большому окну, вверху которого расположен ряд вкладок (с их помощью можно переключаться между различными разделами команд), а под ними — рабочая область, разбитая на три блока. Каждому из них соответствуют свой заголовок (у верхнего раздела — Leaving 1st keyframe , у среднего — Returning to 1st keyframe и у нижнего — Reaching 2nd keyframe ), своя кнопка с надписью Add и свой список команд (располагается под надписью Message ). На данный момент нас интересует раздел Animation(open) ; чтобы попасть в него, щелкните левой кнопкой мыши на одноименную вкладку. Добавьте, пользуясь соответствующей кнопкой с надписью Add , в список команд нижнего блока следующее: this- >do_animate(stop);. Это “заставит” дверь после ее открытия какое-то время находиться в открытом состоянии. Далее воспользуйтесь услугами вкладки Animation(stop) и вставьте в нижний блок местного раздела следующую команду: this- >do_animate(close);. Этим самым вы “обучите” вашу дверь по окончании процесса “ожидания” начинать процесс закрытия. Если вы хотите, чтобы ваша дверь вела себя корректно в случае, когда Макс мешает ее закрытию, используйте две следующие команды, которые “заставят” вашу дверь начинать открываться всякий раз, когда Макс не дает ей закрыться. В разделе Do_MovedToInvalidPostion добавьте в верхний блок сообщение: this- >Do_invertanimation();. После этого щелкните левой кнопкой мыши на вкладку Animation(close) и, работая со средним блоком, поместите внутри него команду this- >do_animate(stop);. Связь с триггером Создайте нужный вид триггера, установите его в нужную точку (можете установить триггер прямо на двери, если хотите, чтобы она открывалась без помощи каких-либо кнопок или посторонних действий или событий) и переключитесь в режим Transform. Выделите созданный вами триггер, нажмите на клавиатуре клавишу 4 и активизируйте окно сообщений для выбранного триггера. Кликните на вкладку T_activate и в верхний блок припишите сообщение parent::X- >do_animate(open);, где X — название вашей двери (эта команда нужна для того, чтобы дверь начинала открываться сразу после активизации триггера). Для того чтобы игрок мог неоднократно пользоваться услугами триггера, вставьте сюда же команду this- >t_enable(false);. Теперь нам нужно снова добавить две команды для нашей двери, которые закрепят связи между последней и триггером. Активизируйте окно сообщений для вашей двери и перейдите в раздел Animation(close). В нем нас интересует нижний блок, список сообщений которого вы должны обогатить следующей командой: parent::Y- >T_enable(true);, где Y — название триггера. Напоследок посетите раздел Animation(open) и добавьте в его средний блок то же самое сообщение. Поздравляю! Дверь готова. Многоэтажные этажи Настало время немного усложнить архитектуру нашего уровня. Согласитесь, один этаж — это слишком примитивно… Итак, приступаем. Если созданный вами зал недостаточно велик, увеличьте его размеры, пользуясь услугами режима Extrude. Также включите опцию Dualsided для всех текстур, использующихся при строительстве новых этажей. Прежде всего научимся создавать подъемы, представляющие собой бесступенчатые лестницы и связывающие этажи друг с другом. Чтобы сделать это, постройте высокий параллелепипед и, активизировав режим Extrude , кликните правой кнопкой мыши на одну из боковых граней этого параллелепипеда. Затем наклоните ее таким образом, чтобы она находилась под нужным вам углом, образуя подъем. Когда последний будет готов, можно приступать к строительству второго этажа. При желании можно отказаться от использования подъемов, заменив их на полноценные лестницы. Каждая такая лестница в идеале представляет собой множество соединенных в ряд параллелепипедов одинаковой длины и ширины, каждый из которых должен быть ниже следующего (и выше предыдущего) на небольшую величину — высоту ступеньки. Создайте большой параллелепипед той же высоты, что и самый высокий участок вашей лестницы (или подъема), и расположите их так, чтобы они подходили вплотную друг к другу. Верхнее основание построенного параллелепипеда является полом второго этажа. Если вам нужно увеличить площадь последнего, постройте рядом с первым параллелепипедом еще один или даже несколько. После этого, находясь в режиме Transform , сделайте единым целым подъем и все составляющие второго этажа, и не забудьте все затекстурировать. Получившийся в итоге объект громадных размеров сделайте дочерним по отношению к основному помещению. Далее вы можете продолжать увеличивать число этажей в вашей постройке. Для этого делайте все то же самое, что и при строительстве второго этажа. Только теперь вам придется либо перетащить поле, используя режим Move grid , на уровень пола второго этажа, и только потом заниматься дальнейшим строительством, либо создавать объекты на уровне пола первого этажа, а потом переносить их выше с помощью режима Transform. __Напутствия Напоследок дам пару советов. В случае, когда вам нужно много раз рисовать одинаковые объекты, после создания одного из них скопируйте его в буфер (для этого выберите пункт меню Edit/Copy или воспользуйтесь комбинацией клавиш Ctrl + C ) и затем вставляйьте его в нужных вам местах (в этом вам поможет команда Edit/Paste или комбинация клавиш Ctrl + V ). При рисовании объекта, все составные части которого покрыты одной и той же текстурой (или при создании 2D-объекта), просто выберите на панели текстур подходящую текстуру и, находясь в режиме Model , рисуйте объект. В результате вы получите нужный вам предмет в затекстурированном виде. Вот и наступила та торжественная минута, когда вы обучились в должной мере пользованию редактором MaxEd, и мне остается только пожелать вам удачи. Что я и делаю. Удачи!