Просмотр
Материал из DoomDev
Страница «
Скриптовое фазированное освещение
»
Перейти к:
навигация
,
поиск
[[Изображение:Sphaslit1.jpg|frame|center|Рисунок 1: Скриптовое освещение]] Освещение в ZDoom сделано лучше, чем в любом другом порте, а фазированное (движущееся) освещение позволяет значительно улучшить вид любого уровня. Однако, оно не всегда поддается желаемой настройке. Этот урок показывает, как написать скрипт, создающий освещение, сходное с фазированным, и обеспечивающий полный контроль над освещением. На уровне-примере [http://zdoom.org/zdkb/sectlite.zip sectlite.zip] есть комната, показанная на рисунке 1. [[Изображение:Sphaslit2.gif|frame|center|/##<br> Sector1 = Сектор 1<br> Sector 17 = Сектор 17<br> Switches = Выключатели<br> ##/<br> Рисунок 2: План карты]] На рисунке 2 показан план карты. Сектора имеют значение поля tag от 1 до 17 в порядке возрастания. Использование значений tag в порядке возрастания значительно упрощает написание скриптов. В комнате находится два выключателя. Первый включает фазированное освещение, движущееся в одном направлении, другой – в противоположном. Можно сделать то же самое и при помощи одного выключателя, добавив в скрипт переменную-флаг, чтобы знать, в каком состоянии находится выключатель в каждый конкретный момент. #include “zcommon.acs” #define faderate 24 #define lowlight 120 #define highlight 200 #define lastsector 17 #define firstsector 1 #define lightdelay 5 //Выполняющийся в данный момент скрипт. int ldir; script 1 (int dir) { inti; //Завершить выполняющийся скрипт. if (ldir > 0) ACS_Terminate (ldir, 0); //Установить одинаковый уровень яркости для всех источников света. for (i=firstsector; i<lastsector; i++) Light_ChangeToValue (i, lowlight); if (dir == 0) ACS_Execute (2, 0, 0, 0, 0); else ACS_Execute (3, 0, 0, 0, 0); } script 2 (void) { int i; ldir = 2; //tag первого сектора. if (i==0) i = firstsector; //Уменьшить яркость текущего сектора. Light_Fade (i, lowlight, faderate); //Перейти к следующему tag-у. i++; //Зациклить. if (i>lastsector) i = firstsector; //Сделать ярким освещение следующего сектора. Light_ChangeToValue (i, highlight); Delay (lightdelay); Restart; } script 3 (void) { int i; ldir = 3; //tag первого сектора. if (i==0) i = lastsector; //Уменьшить текущую яркость. Light_Fade (i, lowlight, faderate); //Перейти к следующему tag-у. i--; //Зациклить. if (i<firstsector) i = lastsector; //Сделать ярким освещение следующего сектора. Light_ChangeToValue (i, highlight); Delay (lightdelay); Restart; } Рисунок 3: Скрипт Обратите внимание на использование определений в начале скрипта. Определения могут намного упростить написание скриптов и делают их намного удобнее для чтения. Если понадобится изменить одно из значений в скрипте, нужно будет лишь изменить значение в определении, а не искать его по всему скрипту. Кроме того, понять, что делает скрипт, довольно легко, читая его и видя определения, написанные обычным языком. В этом скрипте были использованы те же два спецификатора освещения, что и в других скриптах, поэтому они должны быть вам знакомы. Скрипт 1 активируется одним из выключателей. Значение параметра '''dir''' указывает, в каком направлении должен двигаться свет. Сначала скрипт 1 сбрасывает уровни освещения на текущее значение по умолчанию (120). Далее он завершает все работающие скрипты (кроме себя), используя значение, хранимое в переменной '''ldir'''. Затем в зависимости от того, какое направление указано в параметре '''dir''', запускает скрипт 2 или 3. Скрипты 2 и 3 делают совершенно тоже самое, но в противоположных направлениях. Скрипт просто проходит по секторам, постепенно приближая яркость сектора, имеющего текущее значение поля '''tag''' (i), к значению по умолчанию, а затем переходит к следующему сектору (i—или i++) и увеличивает яркость его освещения до максимального. Он создает эффект хвоста света, бегущего по секторам. И скрипт 2, и скрипт 3 работают постоянно с момента активации, пока не будут завершены скриптом 1. Почему используется два скрипта? Для того, чтобы один скрипт мог быть завершен, а другой – запущен. Я не могу завершить и запустить скрипт одной командой, хотя возможно существует неизвестный мне способ. Однако этот подход работает достаточно хорошо. Фазированное освещение, созданное при помощи приведенных скриптов, отличается от встроенного фазированного освещения (хотя реализовать его можно при помощи более сложного скрипта), но эти скрипты обеспечивают полный контроль, а созданное с их помощью фазированное освещение, выглядит, как минимум достаточно привлекательно, чтобы включить его в любой уровень ZDoom. {{RCTutorial}}
Шаблон:RCTutorial
Возврат к странице
Скриптовое фазированное освещение
.
Просмотры
Статья
Обсуждение
Просмотр
История
Личные инструменты
Представиться системе
Навигация
Заглавная страница
Сообщество
Текущие события
Свежие правки
Случайная статья
Справка
Поиск
Инструменты
Ссылки сюда
Связанные правки
Загрузить файл
Спецстраницы