Свой среди чужих, чужой среди хищников. Создание уровней для Aliens versus Predator 2, часть 2
Редактор: DEdit Где взять: С диска "Мании" Возможности: 100% игровых Сложность освоения: Выше средней Документация: Устанавливается вместе с редактором Мы продолжаем осваивать редактор уровней Aliens versus Predator 2. В прошлом номере мы научились строить элементарнейшие уровни. Если вы по какой-то причине пропустили прошлую статью, то бегом на наш компакт (в раздел "ИнфоБлок") — восполнять пробел знаний. Вот только играть в том герметичном, с позволения сказать, карцере, который мы строили в прошлой статье, — удовольствие сомнительное. И хотя некоторые садисты наверняка не упустили возможность подсадить к заключенному сокамерника-alien'а (например, королеву, как это сделал я...), все равно — веселья мало. Хочется погулять на свежем воздухе, добавить на уровень движения в виде дверей и прочих радостей, не рассмотренных в прошлой статье...
Новое строительство
Построим новый уровень, иначе на старом будет несколько тесновато. Работать с брашами вы уже умеете, так что дам лишь общие указания. Фундаментом уровня пусть будет плоский браш с размерами в длину и ширину где-то около 2048*4096 единиц. Постройте на получившейся плите некий бункер, обязательно с дверным проемом, чтобы потом приладить к нему дверь. Оставшуюся площадь можете обнести оградой, чтобы не свалиться вниз. В завершение — очень важный момент — создайте браш достаточно большой, чтобы в него уместился весь отстроенный уровень, и примените к нему процедуру Hollow (меню Brush\Hollow). Это необходимо, во-первых, потому, что уровень должен быть замкнутым (BSP, как-никак), и во-вторых, для того, чтобы сделать небо над уровнем. Чтобы было понятно, что эти браши будут отображать небо, нанесите на них текстуру Sky (папка WorldTextures на закладке Textures; здесь же располагаются остальные "пояснительные" текстуры). Вообще, текстуры Sky, Invisible, AI и прочие подобные им ни на что не влияют — они лишь напоминают создателю уровня о предназначении каких-либо брашей. Но пользоваться ими все равно не помешает, чтобы избежать путаницы на сложных уровнях. Из объектов добавьте на уровень, как обычно, WorldProperties и GameStartPoint. А вот освещению уровня посвятим отдельный абзац. Коль скоро мы собрались создать уровень под открытым небом, то на этот раз давайте сделаем не обычную "лампочку", а источник света, который будет изображать солнечный свет. Создайте объект StaticSunLight (где-нибудь над уровнем — расположение не играет большой роли) и откройте закладку Properties. Нас интересуют параметры Rotation, а также InnerColor и OuterColor. Первый управляет направлением падающего света, два последних — цветом освещения. После щелчка по кнопке параметра Rotation откроется следующее окно:
Здесь, как видно на картинке, есть еще два маленьких окошка со стрелками, а также три бегунка чуть ниже. Левое окно показывает направление в горизонтальной плоскости (ему соответствует верхний бегунок), правое — угол наклона вверх-вниз (которому соответствует средний бегунок). Окошка для третьего бегунка не предусмотрено, но он управляет "креном" объекта. Подкрутите значения так, чтобы свет падал сверху и под не слишком острым углом. На заметку: точно так же назначается направление объекта GameStartPoint (и всем остальным объектам, которым это необходимо), то есть направление, в котором будет поставлен игрок в стартовой точке. Напоследок задайте цвет освещения. Имейте в виду — параметр InnerColor задает основной цвет, который и будет освещать уровень, а параметр OuterColor — цвет, в который будут окрашиваться полигоны (те, что обращены в обратную сторону от направления света). Также имейте в виду, что такой тип источников света не будет работать, если на уровне отсутствует небо.
Небо в коробке
Для начала сделаем sky-box. Просто создайте браш со сторонами Запуск уровней
В прошлой статье мы уже описывали, как следует добавлять уровни в игру. Все бы ничего, но, думаю, вы со мной согласитесь, искать только что скомпилированный уровень и потом перемещать его в новую папку не совсем удобно. Особенно когда вы строите уровень и часто запускаете его промежуточные версии для отладки и поиска багов. Чтобы избегать этой процедуры, поступим так. В редакторе, создав или открыв свой проект, загляните на закладку Worlds. В той ее части, что содержит дерево каталогов, щелкните правой кнопкой мыши по одноименной папке — Worlds. В появившемся окне выберите единственный пункт Add Directory и задайте новой папке имя Custom. Новые уровни создавайте, открыв эту директорию, щелкнув правой кнопкой мыши по нижней части закладки и выбрав пункт Create New World. Все, теперь все скомпилированные уровни будут оказываться в "правильной" папке. Остается лишь изменить командную строку при запуске игры на -rez AVP2,если вы распаковали ресурсы игры в эту директорию и в ней же создали свой проект. В противном случае строка должна иметь вид -rez MyProject. 512*512*512 (ни больше, ни меньше) и примените процедуру Hollow. Затем в окне Perspective поместите камеру так, чтобы видеть получившуюся комнату изнутри. Нам предстоит нанести на стены комнаты текстуры, которые будут изображать небо. Такие текстуры находятся в папке WorldTextures\Sky, и у всех в названии имеются суффиксы fr, bk, rt, lf, up или dn. Они обозначают, что текстура наносится соответственно на переднюю, заднюю, правую, левую, верхнюю и нижнюю сторону sky-box'а. При нанесении текстур следите за тем, чтобы не перепутать стороны. Затем внимательно рассмотрите, сходится ли верхняя текстура с остальными — обычно она повернута в неверном направлении. Поворачивайте ее с шагом в 90 градусов, пока она не будет совпадать с боковыми текстурами. То же самое проделайте с нижней текстурой (если она есть — часто она отсутствует в наборе). Теперь выделите браши, составляющие sky-box, и перейдите на закладку Properties. Найдите параметр FulliBright и установите его на True. Параметры FlatShade, GouraudShade и LightMap установите на False. Потом выделите браши, которые ограничивают уровень, и также выключите у них параметры FlatShade, GouraudShade и LightMap и включите параметр SkyPortal. Осталось сделать последний штрих. Вернитесь к sky-box'у, затем расположите в его центре маркер, указывающий позицию для создаваемых объектов. Снова выделите браши "небесной коробки", щелкните правой кнопкой мыши и из меню выберите пункт Bind to object. Из списка выберите объект DemoSkyWorldModel. Теперь у нас на уровне имеется дополнительный объект, который, к тому же, привязан к sky-box'у. Но загвоздка в том, что его не видно (только оси координат, показывающие положение объекта). Поэтому перейдите на закладку Nodes, найдите этот объект в списке и там же выделите его (установив на нем галочку). Потом откройте закладку Properties и в параметре SkyDims установите значение "256 256 256" (без кавычек), чтобы вписать объект в созданный "ящик". Небо готово.
Движение — жизнь
Пришло время слегка оживить наш уровень — мы будем работать с движущимися брашами. Тонкости текстурирования
Рано или поздно вам захочется использовать на уровнях текстуры собственного изготовления. Они могут быть в двух форматах — PCX либо TGA. Добавить в редактор нужную картинку несложно — для этого на закладке Textures надо щелкнуть правой кнопкой мыши по списку текстур и выбрать пункт Import PCX Files... или Import TGA Files..., в зависимости от того, в каком формате вы сохранили заготовку текстуры. Но импортирование текстур — это только начало работы. Текстуры в DEdit имеют много различных свойств. Сейчас мы рассмотрим эти свойства поподробнее. Выберите любую текстуру и дважды щелкните по ней левой кнопкой мыши. Открывающееся при этом окно вы можете лицезреть на картинке. Окно разбито на четыре поля. Рассмотрим представляющие
наибольший интерес параметры в них. В поле Info это Command String — это даже не параметр, а командная строка. В ней задаются, например, параметры отображения текстуры в случае, когда вы смотрите на нее различными режимами зрения Хищника. Также в этой строке вы можете задать текстуру детализации, если она нужна (примеры написания этих команд вы можете найти в свойствах многих текстур). К текстуре детализации относятся еще два параметра (тоже расположенные в поле Info) — Detail Texture Scale и Detail Texture Angle — это масштаб и угол наклона текстуры детализации соответственно. В поле Compression вы можете переключаться между различной степенью сжатия текстуры — результат будет виден в дополнительном окне справа от основного. В поле Texture Format вы можете выбрать вид цветопередачи в 16-битном режиме. Наконец, в поле Miscellaneous есть интересный параметр Full Bright (in alpha mask). Если текстура содержит в себе альфа-канал, то при включении этого параметра участки текстуры, отмеченные в альфа-канале, не будут подвергаться затенению. Самое оно для создания текстур в виде мониторов или встроенных в стены ламп. Типичный пример такого браша — обычная дверь. Я надеюсь, вы не забыли сделать на уровне какое-нибудь строение с дверным проемом? Итак, во всех окнах обзора переместите камеру к означенному проему. Затем можете приступать к созданию двери. Это может быть как один-единственный браш, перегораживающий проход, так и довольно сложная составная конструкция, состоящая из множества брашей. Закончив делать дверь, выделите все браши, из которых она состоит, а также поместите рядом с дверью маркер для создания объектов, чтобы не искать контроллер двери по всему уровню. Щелкните правой кнопкой мыши в любом окне обзора и выберите пункт Bind to object. В списке объектов выберите Door и щелкните по кнопке OK. Выбранный объект будет создан и привязан к будущей двери. Заметим, что под объектом Door в списке объединен целый класс других объектов, многие из которых предназначены не столько для дверей, сколько для создания движущихся элементов уровня и управления ими. Выделите созданный объект и, как обычно, перейдите на закладку Properties. Зададим параметры движения двери. Основным является направление, в котором будет двигаться браш, а также расстояние, на которое он переместится. Направление задается в параметре MoveDir. Принцип почти тот же, что и у объекта StaticSunLight, за исключением того, что никаких бегунков нет и в помине, поэтому придется вписать числа вручную. Из-за того, что я не могу угадать, как будет расположена дверь на вашем уровне, я не могу и сказать, какое именно число вам следует вписать. Но можно поступить иначе. Так как три числа, задающие направления, соответствуют координатным осям X (если смотреть из окна Top, то эта ось будет идти слева направо), Y (в окне Top — снизу вверх) и Z (а это уже нормальные верх и низ), то можно задать движения строго вдоль одной из осей. Для этого нужно установить требуемой оси значение "1" либо "-1". Разобравшись с направлением, установим расстояние, на которое переместится дверь, — параметр MoveDist. Здесь никаких особых пояснений не требуется — просто впишите желаемое расстояние. Также, щелкнув по параметру Waveform, вы откроете окно еще с четырьмя параметрами. Они влияют на то, как дверь будет двигаться. Как именно — читайте в описании параметров (вызывается, напомню, щелчком левой кнопки мыши по названию параметра).
Модель — всему голова
Почти все действия, описанные выше, были связаны с брашами. Но на одной геометрии уровня далеко не уедешь. Ведь не делать же каждую пепельницу или кнопку на уровне из брашей. Да и зачем, когда
Импровизированный bounding-box для модели грузовика. разработчики игры сделали множество отличных моделей? Надо только научиться добавлять их на уровень. Для вставки моделей используется объект Prop. Создайте его и откройте закладку Properties. Здесь нас интересуют два параметра: Filename и Skin. Они определяют соответственно саму модель и ее скин. Чтобы выбрать нужную модель, щелкните по небольшой кнопке B рядом с параметром, а затем выберите файл желаемой модели (все модели находятся там, куда вы распаковали ресурсы игры, в поддиректории Models). Скины выбираются аналогичным образом, но находятся в поддиректории Skins (структура каталогов и названия файлов в них практически повторяют каталоги и файлы моделей, поэтому отыскать нужный скин не составит труда). Итак, модель вы выбрали. У меня это был грузовик (модель — truck.abc, скин — truck.dtx). В игре вы сможете, как ни в чем ни бывало, ходить сквозь добавленную модель. Конечно, если бы это была какая-нибудь мелкая деталь, то можно было бы все оставить как есть. Но если это целый грузовик, то имеет смысл пресечь все попытки игрока пройти сквозь него. Для этого нужно лишь создать несколько дополнительных брашей, так, чтобы модель смогла уместиться внутри. Пример можно увидеть на картинке. Нанесите на браши текстуру Invisible, и на закладке Properties установите параметр Invisible на True. Так они не будут видны в игре, но сквозь них (а значит — и через модель) нельзя будет пройти. Заметьте — самой модели на картинке не видно. Не потому, что она скрыта за брашами — модели просто не отображаются в редакторе. Поэтому, прежде чем создавать "ящик столкновений", запустите уровень в игре и наметьте какие-либо ориентиры, по которым вы могли бы определить габариты модели в редакторе (например, по текстурам поверхности, на которой расположена модель). Также обратите внимание на параметр DetailLevel. Он определяет не уровень детализации модели, а минимальный уровень детализации в графических настройках самой игры, при которых модель будет видна. То есть, выражаясь более популярно, если вы установите параметр на Medium, то модель сможете увидеть, лишь играя на настройках графики не ниже средних.
Искусственный? Интеллект!
Уделим немного внимания интеллекту врагов, добавленных на уровень. В прошлой статье
Браши вокруг грузовика, точнее, его bounding-box'а. мы уже создавали Чужих, но в целом тонкости создания живности совсем не затронули. Основные объекты, с помощью которых вы можете добавлять на уровень противников, это AIAlien (Чужие), AIPredator (Хищники) и AIMarine c AICorporate (люди; соответственно "свои" и солдаты Корпорации). Свойства у всех объектов почти идентичны. Важнейшие из них: CharacterType — этим параметром вы задаете тип персонажа AI (вид Хищника, вид Чужого и т.д.) и AttributeTemplate — шаблон поведения AI; желательно, чтобы этот шаблон соответствовал типу персонажа (facehugger, ведущий себя, как Королева Чужих, — это оригинально...). Еще два интересных параметра — LeashPoint и LeashLength. С их помощью можно привязать AI-персонажа к любому объекту уровня (кроме брашей) и задать расстояние, дальше которого персонаж не должен удаляться от объекта. Чтобы у противников не возникало проблем с перемещением по уровню, необходимо указать им пространство, где можно передвигаться. Для этого создайте несколько брашей, которые будут заполнять пустые места на уровне и огибать препятствия, чтобы AI не пытался пройти сквозь них. Затем привяжите к каждому такому брашу по одному объекту AIVolume и покройте их текстурой AI. Вовсе не обязательно заполнять такими брашами каждую щель уровня, достаточно обозначить ими основную часть пространства. На картинке рядом можно увидеть, как AIVolume-браши расположены вокруг препятствия — грузовика.
Еще немного объектов
Строительство уровня почти завершено, осталось добавить еще два объекта. Первый — какое-либо оружие. Главный герой, если это пехотинец, появляется на уровне с одним ножом, а в условиях постоянно растущего количества врагов такой вариант нежелателен. Поэтому создайте объект PickupObject и в параметре Pickup выберите желаемое оружие или амуницию. В этом параметре можно задавать предметы как для пехотинца, так и для Хищника. Второй объект — это триггер, который позволяет игроку закончить уровень. Создается с помощью объекта ExitTrigger. Параметр, отвечающий за концовку уровня, называется ExitData. Здесь придется слегка потрудиться, потому что вы задаете не просто уровень, на который следует перейти, а набор параметров в отдельном файле. Файл этот называется missions.txt (расположен в каталоге с распакованными ресурсами, в поддиректории Attributes). Вам надо вписать следующие строки в месте, где заканчивается перечисление параметров выхода предыдущих уровней: [Mission56] — порядковый номер уровня, должен быть последним в списке (т.е. если предыдущий уровень 55-ый, то ваш должен быть 56-ой). Name = "MyLevel" — название, которое будет отображаться в параметре ExitData. NextDesc = -1 —некритичный параметр, отвечает за название автосохранения. NextLevel = "Menu" —самое важное, уровень, на который вы перейдете. Необходимо указать полный путь к нему, например, "Worlds\Custom\NextLevel". Если же указать "Menu", то по завершении уровня вы окажетесь в главном меню игры. ScreenFadeTime = "2" — время, за которое потемнеет экран при концовке. Теперь в редакторе, в параметре ExitData,осталось лишь выбрать значение MyLevel, и можно считать уровень завершенным. Последнее: при компиляции обязательно поставьте галочку на пункте Full Optimization. Иначе вы можете столкнуться с проблемой, когда все объекты на уровне, а также браши с привязанными объектами, присутствуют и работают, но остаются невидимыми. Полученные в этой статье знания могут служить хорошим толчком для дальнейшего самостоятельного изучения редактора DEdit. Но цикл статей на этом не заканчивается — в следующем номере мы опубликуем третью статью, изучив которую, вы сможете создавать полноценные эпизоды для игры. На нашем диске, как обычно, можно обнаружить уровень, иллюстрирующий эту статью, а также его вариант для обработки в редакторе. Комплект утилит для редактирования — прилагается.
1466 Прочтений • [Свой среди чужих, чужой среди хищников. Создание уровней для Aliens versus Predator 2, часть 2] [19.05.2012] [Комментариев: 0]