В этом уроке мы опробуем возможности скриптового режима редактора логики. Для демонстрации возможностей будем использовать ту же карту, что и в предыдущем уроке. Как и в предыдущий раз, мы будем использовать события попадания и выхода главного персонажа в регион. Но на этот раз, заставим источник света плавно менять свой цвет.

Начнем с того, что добавим класс, надстраиваемый над объектом типа регион. Нажмем правой кнопкой на элемент Map Classes и выберем пункт Create Class.

https://c.radikal.ru/c17/1905/ef/90f84e81121b.png

В появившемся окне укажем имя класса, тип и класс, над которым будет произведена надстройка. Назовем класс Region_0. Т.к. нас интересует надстраиваемый класс, то в качестве типа выберем Entity. А классом для надстройки выберем Region.

https://c.radikal.ru/c17/1905/78/d7ade9e46790.png

Для управления источником света, нам понадобится следить за тем, находится персонаж в регионе или нет. Заведем соответствующую переменную. Нажмем правой кнопкой на класс Region_0 и выберем пункт Create Variable.

https://d.radikal.ru/d30/1905/8a/647035a69d40.png

Зададим тип переменной - Boolean (логический тип, имеющий два значения: True (истина) и False (ложь)). А также укажем имя переменной - characterInRegion.

https://b.radikal.ru/b20/1905/1d/46d79a5034a6.png
Переменная создана. А значит нужно добавить контроль ее значения. При попадании персонажа в регион, вызывается событие ObjectIn. Добавим соответствующую функцию к классу Region_0. Нажмем правой кнопкой на класс и выберем меню Create Method. Затем выберем событие ObjectIn и способ записи алгоритма - Script Type.

https://b.radikal.ru/b38/1905/15/dfd5affa9a20.png

При попадании персонажа в регион, необходимо менять значение нашей переменной characterInRegion на значение True. В рабочем окне напишем следующий код:

Код:
characterInRegion = true;

Теперь нам необходимо отследить обратное событие - выход персонажа из региона. В нем мы должны поменять значение нашей переменной на значение False, а также потушить наш источник света. Добавим функцию ObjectOut к классу Region_0 и напишем в рабочем окне следующий код.

Код:
characterInRegion = false;
((Light) Entities.Instance.GetByName( "Light_0" )).DiffuseColor = new ColorValue(0, 0, 0);

А сейчас к перейдем самому интересному! Будем каждый кадр тик менять цвет источника света. Если персонаж находится внутри региона, то заставим источник плавно менять свой цвет с зеленого на красный. Событие, вызываемое каждый тик - это метод Tick. Добавим его к нашему классу Region_0. Ниже приведен код метода.

Код:
if(characterInRegion)
{
	float t = (((int)(EngineApp.Instance.Time * 1000)) % 3000) / 3000.0f;
	float r = -4 * t * t + 4 * t;
	float g =  4 * t * t - 4 * t + 1;
	((Light) Entities.Instance.GetByName( "Light_0" )).DiffuseColor = new ColorValue(r, g, 0);
}

Цвет источника меняется циклично. Число 3000 здесь - это период смены цвета в миллисекундах.

Сохраним логику карты через меню File -> Save Map.

https://a.radikal.ru/a42/1905/9b/3bfb55278bad.png

Нам осталось лишь задать логический класс для объекта регион. Для этого перейдем в редактор карт, выделим регион и укажем ему параметр LogicClass.

https://b.radikal.ru/b26/1905/0f/babcad11e282.png

В появившемся окне выберем класс Region_0 и нажмем кнопку Ok.

https://c.radikal.ru/c10/1905/28/c9a8cc5f1dbb.png

Запустим нашу карту в режиме симуляции.

https://d.radikal.ru/d10/1905/ab/c01f97682df6.png

Зайдя в область региона, увидим, что источник света начинает плавно менять свой цвет.

https://d.radikal.ru/d09/1905/ed/70168bea5e0b.png