|
|
q3:работа_с_entities [29.08.2009 14:26] Nt-kop4ik |
q3:работа_с_entities [06.07.2020 03:50] |
===== Введение ===== | |
| |
| |
В данной статье будет рассказано, как работать с //entity// в редакторе уровней типа GtkRadiant на примере версии 1.5.0. | |
| |
//Map//-файл, который как раз редактируется с помощью Radiant'a, описывает следущие составляющие уровня: | |
| |
* //worldspawn// - множество всех брашей и патчей уровня, не задействованных в //trigger//'ах и //func//'ах; | |
| |
* //entity// - этити (к примеру, target_give, item_haste и др.); | |
| |
* //trigger// - триггер, который можно определить как симбиоз множества из брашей и/или патчей с //entity//; | |
| |
* //func// - особая группа брашей или патчей; | |
| |
* //model// - модель. | |
| |
===== Создание и выделение объектов ===== | |
| |
Для помещения на уровень //entity//, //trigger//'а, //модели//'и или //func//'а (далее - //объект//) кликнуть правой кнопкой мыши на рабочее пространство редактора (неважно, в какой проекции) и выбрать нужный пункт. Следует помнить, что при создании //trigger//'a или //func//'a должен быть выделен как минимум один браш или патч, иначе создастся "пустой" //trigger// или //func//, и откомпилированный с такой "пустышкой" уровень не запустится в q3. При помещении же //entity// и //модели//'и наоборот все выделения в редакторе необходимо снять, иначе то, что было выделено, исчезнет (впрочем, иногда так и надо). | |
| |
{{:q3:entity_menu.png|}} | |
| |
* **entity меню** | |
| |
===== Entity list ===== | |
| |
| |
Для управления установленными объектами редактор содержит мощные инструменты: //**entity list**// и **//entity inspector//**. | |
| |
**//Entity list//** - удобный список всех //entity// на уровне, в котором легко находить нужные из них для последующего вызова **//entity// inspector** или других целей (например, копирования). Для вызова **//entity list//** нужно выбрать соответствующую строчку меню **//view//**, либо использовать горячую клавишу **L**. | |
| |
| |
* Примечание: горячие клавиши (в WinXP для GtkRadiant 1.5.0) можно посмотреть/поменять с помощью файла | |
| |
//SYSTEM_SECTION:\USER_NAME\Documents and Settings\Application Data\RadiantSettings\1.5.0\q3.game\shortcuts.ini// | |
| |
{{:q3:view_menu.png|}} | |
| |
* **меню view** | |
| |
В появившемся окне можно искать нужный //объект//, а затем копировать его (клавиша **SPACE**), перемещать с помощью мыши, либо вызывать для ее редактирования **//entity inspector//**. Единственным недостатком этого инструмента является то, что в нем отображаются абсолютно все источники света, которых может быть не одна тысяча (да, бывают и такие чудовища), что очень мешает навигации в //**entity list**//. | |
| |
{{:q3:entity_list2.png|}} | |
| |
* **entity list** | |
| |
| |
===== Entity inspector ===== | |
| |
| |
Логически следующий за //**entity list**//, но хронологически вызываемый раньше инструмент //**entity inspector**// вызывается горячей клавишей **N** при условии выделенного в редакторе объекта. Если //объект// создан только что и больше действий с выделением произведено не было, то можно вызывать //**entity inspector**// сразу, т.к. после создания любого объекта (в том числе браша или патча) выделение автоматически переходит на него. Если же надо выделить //объект// уже после, нужно выделить его с помощью левой кнопки мыши и клавиши **SHIFT**. | |
| |
Для этого находим на рабочем пространстве нужный //объект// (пользуясь, если нужно, правой кнопкой мыши для промотки и колесом мыши для масштабирования), зажимаем **SHIFT** и кликаем на //объект//. Если зажать левую кнопку мыши, то можно выделить несколько //объектов//. | |
| |
Так как описанный способ в точности повторяет алгоритм выделения брашей и патчей, для выделить так же //trigger// или //func// не выйдет. Для этого надо вместе с **SHIFT** зажимать **CRTL** (//entity// и //модели// тоже можно выделять с **CTRL**). | |
| |
Итак, после выделения нужного //объекта// нажатие горячей клавиши **N** приведет к открытию //**entity inspector**//. | |
| |
{{:q3:entity_inspector.png|}} | |
| |
* **entity inspector** | |
| |
Две верхних области инструмента представляют собой мощную справочную систему по всем доступным //объектам//. Выбирая в верхнем окошке нужный (по умолчанию выбран тот, который был выделен при запуске //**inspector**//'а, а если не было выделено ничего - то последний использованный) можно найти все (практически) ключи для его настройки. | |
Собственно говоря //entity// или //модель// в map-файле представляет собой список параметров, среди которых: | |
| |
* Главный (свойственен всем //entity//) | |
* //classname// - определяет, чем собственно выделенная //entity// является; | |
| |
* Второстепенные (могут быть определены для всех //entity//) | |
* //origin// - местоположение //entity// в формате "X Y Z"; | |
* //target// - метка, указывающая //entity//, следующую после данной в связи (//connection//); | |
* //targetname// - метка данной //entity// для ссылания на нее другой; | |
| |
* Специфические (могут быть определены для некоторых классов //entity//) | |
* //spawnflags// - десятичное число, в котором кодируются булевые (да/нет) параметры //entity// (флаги); | |
* //wait// - время в секундах, через которое //entity// может быть использована снова ("перезарядка"); | |
* //другие...// | |
| |
//Trigger//'ам, //func//'ам свойственно все вышесказанное, только в их состав также входят браши или патчи. | |
| |
Итак, вводя в поле //**Key**// любой параметр, описанный здесь или другой, найденный в справка Radiant'a или где-то еще, в поле //**Value**// его значение, и нажав **ENTER** (нажимать, находясь на поле //**Value**//) создастся параметр с заданным значение. Кнопками **delete key** и **clear all** можно соответственно удалить выделенную строчку с параметром или удалить все парамерты (кроме //classname//). | |
| |
Так и происходит управление //объектами// (кстати, менять можно даже //classname//, но после этого с //объекта// спадет выделение) | |
| |
Правда, в случае //target// и //targetname// существует "быстрый механизм", минующий //**entity inspector**// (если в друх словах, то надо выделить два //объекта// в том порядке, в котором они соединяются и нажать **CTRL+K**), но использовать такой метод лично автор статьи настоятельно не рекомендует. Кроме того, что таким способом не сделать многих возможных в //**entity inspector**// вещей (например, соединение одного //объекта// с несколькими), но и теряется понимание сути маппинга, его красота и логичность (немного помпезно, но зато правда). | |
| |
Так что //target// и //targetname// вам в руки, и вперед ;-) | |
| |
=== Свойства объектов === | |
| |
* При обычном копировании или импортировании //объектов// из других //map//-файлов параметры //target// и //targetname// снабжаются индексами. К примеру, при копировании //объекта// (//trigger//'а, к примеру) с параметром //target// равным //give_rocket//, создастся такой же //объект// с параметром //target// равным //give_rocket1//, а если значение равно //give_rocket1//, то получим значение //give_rocket2// и т.д. | |
| |
* Важная особенность: при копировании //объекта// выделение __**не переходит**__ на новый //объект//. | |
| |
* Не имеет значение, каково значение параметра //origin// у //entity//, за исключением: | |
* //entity// пересекается с твердым брашем ; | |
* //entity// находится в "открытом пространстве"; | |
* В обоих случаях уровень при компиляции (//BSP -meta//) выдаст "утечку" (//leak//). | |
| |
=== Некоторые "фишки" в работе с entity inspector === | |
* При выделении некоторой строчки **Key:Value** в соответствующих полях появятся соответствующие значения; при этом если выделить другой //объект// и зайти в //**entity inspector**//, то поля будут содержать те же значения, которые там были во время закрытия. Таким образом можно удобно и быстро копировать строчки с параметрами из одного места в другое (к примеру, //_remap// от //модели// к //модели//). | |
| |
* Если нужно для тестирования уровня передвинуть на некоторое время //info_player_start// (или аналог), но двигать обратно его потом будет лень, а наличие двух таких //entity// мешает стабильно спауниться, то можно установить в первом //info_player_start// параметр //classname// равным, к примеру, //info_player_start2//. Тогда он не будет никак отображаться на уровне и даст спокойно спауниться другому //info_player_start//'у. | |
| |
* Кто чем может, помогайте :-) | |
| |
| |
--- //[[k47@email.com|Nt-kop4ik]] 26.08.2009// | |