26 января 2005
Обновлено 17.05.2023

DOOMострой, часть 3. Продвинутое редактирование

DOOMострой, часть 3. Продвинутое редактирование - изображение обложка

В двух прошлых статьях мы с вами получили все необходимые знания, чтобы построить большой, детализированный уровень. Но недостаточно просто построить уровень. Необходимо задать цели миссии, добавить различные скрипты, научиться связывать уровни между собой… Все это мы сделаем сегодня. Зоны видимости В Doom 3 применяется разбиение уровней на зоны видимости порталами, чтобы не заставлять видеокарту отрисовывать все, что находится в соседних помещениях. Чтобы сделать портал, создайте обычный браш и задайте ему такой размер, чтобы он перекрывал загораживаемый им переход, коридор или дверной проем. Задайте брашу материал Textures\Common\Nodraw. Затем клавишами Ctrl+Shift+левая кнопка мыши выделите сторону браша,

DOOMострой, часть 3. Продвинутое редактирование - фото 1

Рис. 1. Порталы между зонами видимости.
направленную в одну из будущих зон видимости, и присвойте ей материал Textures\Editor\visportal. Вы можете проверить, как работают порталы, введя во время игры консольные команды r_ShowPortals 1 и r_showtris 3. Таким образом вы включите отображение самих порталов (при этом открытые порталы будут обозначаться зелеными рамками, а закрытые — красными, как на рис. 1 ) и отображение трехмерного каркаса уровня (те части уровня, которые скрыты за закрытыми порталами, не будут отображаться). Телепорты Поскольку пехотинец путешествует между мирами, то логично сделать его путешествия более комфортными — пусть перемещается через телепорты. А чтобы боец не расслаблялся, путешествие будет сопровождаться ужасными видениями. Создайте объекты info\info_player_teleport и trigger\trigger_multiple. После создания trigger_multiple сразу же выделите info_player_teleport и нажмите кнопки Ctrl+K. Это нужно сделать, потому что объект trigger_multiple станет невидимым после того, как вы снимите с него выделение, и будет очень неудобно потом искать его в списке добавленных на карту объектов (в меню Edit\Entity Info ). Фактически, телепорт готов. Игрок будет телепортироваться из области, занятой объектом trigger_multiple , в точку, указанную info_player_teleport. Чтобы сделать проносящееся перед глазами видение, вам нужно создать объекты func\func_cameraview и target\target_null. Затем соедините объекты клавишами Ctrl+K , нацелив таким образом камеру в точку, указанную объектом target_null. Если теперь выделить target_null , то камера в окне 3D-обзора будет

DOOMострой, часть 3. Продвинутое редактирование - фото 2

Рис. 2. Телепорт в редакторе и в игре.
показывать позицию объекта func_cameraview. В свойствах камеры измените значения ключа Name (имя камеры) на что-нибудь легко запоминающееся, скажем, банальное Camera. Теперь нужно присоединить созданную камеру к телепорту. Для этого выделите объект info_player_teleport , зайдите в его свойства и создайте два ключа. visualView — камера, с которой нам будут показываться наши галлюцинации. Впишите сюда имя объекта func_cameraview. visualEffect — продолжительность показа с указанной камеры в секундах. Если не создавать этот ключ или вписать в него 0 , то телепортация будет происходить мгновенно. Так как созданные объекты не отображаются в игре, то придется как-то обозначить точки телепорта (брашами или моделями телепортов из медиабиблиотеки), да и сцену видения, которое демонстрирует нам добавленная камера, также не мешает создать. Эту часть работы выполните на свое усмотрение. Скриптовые ролики Чтобы донести до игрока сюжет вашего уровня, нужно поработать над скриптовыми роликами, выполненными на движке игры. К сожалению, в редакторе нет наглядных средств для работы над роликами, поэтому придется также немного поработать над написанием скриптов. Наш первый ролик будет несложным, сделаем простой пролет камеры по заданному маршруту. Создайте объекты func_cameraview , func_mover и

DOOMострой, часть 3. Продвинутое редактирование - фото 3

Рис. 3. Теперь на панели инструментов можно использовать все кнопки.
func_static. Задайте камере, func_mover и func_static какие-нибудь несложные имена (например camera , mover и marshrut). Камеру присоедините к func_mover , добавив в ее свойствах ключ bind и указав в нем имя этого самого func_mover. Затем в свойствах объекта func_mover задайте два ключа: Cinematic равный 1 и Solid равный 0. Это нужно сделать, чтобы объект мог быть использован в скриптовых роликах и чтобы он мог проходить сквозь любые объекты. Наконец займемся объектом func_static. Вы, наверное, уже догадались, что раз этому объекту было задано имя marshrut , то он будет каким-то образом указывать путь движения камеры. Так оно и есть. Выделите этот объект, во вспомогательном окне на закладке Entity нажмите кнопку Curve , и в появившемся окне укажите тип кривой Nurbs. В результате мы получим тонкую кривую линию, привязанную к объекту func_static. Присвойте этому объекту текстуру nodraw. Все кнопки для редактирования кривых находятся на панели инструментов, но они не умещаются на экране. Чтобы сделать их видимыми, вытяните панель инструментов с ее обычного места куда-нибудь в сторонку и измените ее размер, как показано на Рис. 3. Выделите сплайн (а точнее — объект func_static , к которому тот привязан) и нажмите кнопку Edit Curve Points. После этого вершины сплайна будут отображаться как прозрачные кубики в 3D-окне и как синие точки на карте уровня. Вы можете перетаскивать точки кривой с помощью левой кнопки мыши, _

DOOMострой, часть 3. Продвинутое редактирование - фото 4

_
Рис. 4. Камера настроена и готова в любой момент прийти в движение.
изменяя форму этой кривой. Если вы нажмете кнопку Add Curve Points , то в конце кривой будет создана дополнительная точка. Чтобы добавить новую точку в произвольном месте кривой, выделите точку, перед которой должна быть добавлена новая точка кривой и нажмите кнопку Insert Curve Point. Чтобы удалить какую-либо точку, выделите ее и нажмите кнопку Delete Curve Point. Создайте какой-нибудь несложный маршрут. Теперь нужно как-то заставить все созданные объекты работать вместе. Возьмемся за написание самого скрипта. Скриптовый язык в “Думе” основан на языке программирования C , поэтому людям, знакомым с ним, разобраться в написании скриптов не составит труда. Для тех же, кто не знаком с основами программирования, приведем основные понятия “думовского” скриптинга. В общем виде скрипт выглядит так: _Void имя_скрипта() { [команды скрипта] [вызов других скритпов] } _Команды, в основном, используются двух видов: действия над объектами и действия над игроком. Действие над объектом имеет вид: $имя_объекта.команда(параметры команды); Например, поворот объекта на 90 градусов по оси Z осуществляется так: $имя_объекта.rotateOnce(0 0 90); Именем объекта в данном случае является значение ключа Name в свойствах этого объекта. При любом движении используются заранее заданные для данного объекта параметры скорости, ускорения и времени, за которое объект проделывает это движение. Действие над объектом может использовать в качестве параметров не только числовые значения, но и другие объекты. Скажем, команда “ $имя_объекта.startSpline($имя_кривой); ” заставляет объект пролететь вдоль указанного сплайна от начала и до конца.

DOOMострой, часть 3. Продвинутое редактирование - фото 5

Рис. 5. Получено новое задание — значит, все сделано правильно.
Действия над игроком имеют вид: sys.команда([необязательный _ параметр]); _Примеры таких действий вы можете видеть в написанном чуть ниже скрипте. Если вы хотите в процессе выполнения одного скрипта вызвать дополнительный, то просто напишите имя вызываемого скрипта: _имя_скрипта(); _Для объектов, что мы создали на нашей карте чуть ранее, текст скрипта будет иметь следующий вид: _void start_camera_spline() { $ move.time(10); //Сколько секунд займет пролет камеры вдоль маршрута. $ move.accelTime(1); //Время на разгон камеры. $ move.decelTime(1); //Время на торможение камеры. $ move.startSpline($ marshrut ); //Запускает объект func_mover под именем move вдоль кривой marshrut.} void camera_script() { sys.setCamera($ camera ); //Переключает на обзор с камеры camera. start_camera_spline(); //Запускает вышенаписанный скрипт. sys.wait(10): //Пауза до окончания выполнения запущенного скрипта. sys.firstPerson(); //Переключает на вид от первого лица. } Запишите этот текст в текстовый файл с расширением *.script. При этом имя файла должно быть таким же, как и имя вашего уровня. Поместите файл в той же папке, где находится уровень. Чтобы данный скрипт запускался в игре, создайте на карте объект trigger_once (для однократного исполнения скрипта) или **

DOOMострой, часть 3. Продвинутое редактирование - фото 6

_Рис. 6. Нажми кнопку — пройди уровень!trigger_multiple(для многократного исполнения) и задайте ему ключcallсо значениемcamera_script**. Скрипт будет исполнен, когда игрок войдет в область, занятую объектомtrigger_once. Приведенный пример отражает лишь малую часть возможностей и команд скриптового языка вDoom 3. Но на полное его описание потребовался бы не один десяток страниц. С другой стороны, этого примера достаточно, чтобы понять принципы написания “думских” скриптов. А все команды, используемые в скриптах, вы можете найти в файлеbase\script\doom_events.script. Команды снабжены пояснениями, поэтому разобраться с ними не составит большого труда.Цели миссии На каждом уровне должна быть какая-либо цель, пусть даже примитивная, вроде “дойти до конца уровня”. Создать цели миссии очень просто. Добавьте на карту объектыitem_objectiveиitem_objectiveComplete. Обоим объектам нужно установить следующие параметры:ObjectiveTitle— заголовок задания. Напишите здесь суть задания в одной-двух фразах.ObjectiveText— полный текст задания. Текст в параметрах должен быть только английским. Если написать на русском, объекты просто не сработают.No_touch— задайте значение1, это будет означать, что объект будет невозможно подобрать, как обычный предмет. У обоих объектов все эти параметры должны быть абсолютно идентичными, иначе игра не сможет связать их между собой. Для активации используйте объектыtrigger_once. Создайте триггер, расположите его в месте, где игрок должен получить задание, так, чтобы игрок непременно прошел сквозь объект. Затем соедините триггер и объектitem_objectiveкнопкамиCtrl+K. Точно так же сделайте активатор для объектаitem_objectiveComplete. Останется лишь одна мелочь. Игрок получает задания посредством карманного компьютера — PDA. А у игрока его наверняка нет. Чтобы исправить это, добавьте на карту объектitem_pdaи разместите его прямо в точке старта игрока.Сцепка уровней Если вы решили сделать не один уровень, а целый эпизод для игры, то вам потребуется соединить уровни вместе, чтобы по окончании одного уровня запускался следующий. Иначе придется каждый новый уровень запускать самостоятельно через консоль. Чтобы сделать переход на следующий уровень, вам нужно создать прежде всего объект сgui(т.е. оснащенный каким-либо дисплеем). Таким объектом может служить, например, лифт или какой-нибудь отдельный терминал. С терминалом мы уже возились, когда создавали открывающиеся двери, поэтому давайте сделаем лифт. Как обычно, создайте объектfunc_staticи, щелкнув по кнопкеModelна закладкеEntitiesво вспомогательном окне, присвойте ему модельmodels\mapobject\elevators\elevator.lwo. Затем нажмите кнопкуGuiи выберите подходящий интерфейс для терминала лифта (скажем,guis\transfer\exit_admin.gui). Щелкните правой кнопкой мыши по карте уровня и выберите из списка объектtarget\target_endlevel— это и будет конец уровня. Расположите его неподалеку от лифта. Теперь снимите выделение со всех объектов, затем выделите сначала лифт, а потом —target_endlevelи нажмите кнопкиCtrl+K. Переход между уровнями работает. Нужно только указать, куда именно следует переходить. Если вы хотите просто завершить игру на этом уровне, то в свойствахtarget_endlevelдобавьте ключendOfGameи задайте ему значение1. Если же требуется переход на другой уровень, создайте ключnextMapи впишите в него путь к следующей карте. Имейте в виду, что для данного параметра корневой является папкаbaseв каталоге игры. То есть если ваш уровень находится прямо в этой папке, то вам нужно лишь указать имя файла этого уровня (без расширения). Если уровень помещен в какую-либо директорию, то, разумеется, нужно указать и ее (скажем,map\game\mymap2).*** * * На этом мы завершаем цикл статей по редактированию уровней вDoom 3**. Многие возможности редактора были изучены, многие остались “за кадром”, но полученных знаний вам вполне хватит, чтобы строить профессиональные уровни.

Комментарии
Чтобы оставить комментарий, Войдите или Зарегистрируйтесь