UI: XML User Interface Expressions System

Материал из Oxygen Engine
Перейти к: навигация, поиск

Общее

Expression система - это возможность писать короткие скриптовые выражения прямо в XML файлах UI. С их помощью можно наполнять виджеты данными, без необходимости делать это в Lua или С++. Использование В атрибутах виджета необходимо написать тэг expression и в параметрах написать выражение. Не все виджеты пока поддерживаются, но в дальнейшем планируется полная поддержка у каждого типа виджета. У expression’ов есть все основные элементы языков программирования, а именно:

  • Константы: 2, 2.5, “Текст”
  • Переменные: fltPlayerHealth, intPDAActiveContacts, strPlayerName
  • Функции: floor, ceil
  • Операторы: '+', '-', '/', '*'

Переменные - это объекты значение которых меняются внутри движка. Каждый раз когда виджет рисуется, и соответственно выполняется expression, движок получает текущее значение этой переменной. Все переменные объявляются в С++ файле game_expression_delegates.cpp заранее.

Функции - специальные названные алгоритмы выполняющие со значениями определенные операции. Чтобы вызвать функцию, нужно написать её имя и в скобках заключить то, над чем мы будем проводить операцию (в том числе и результат другой функции). Например:

floor(20.5) 
floor(fltPlayerHealth) 
floor(fltPlayerHealth + 50.2) 
floor(ceil(fltPlayerHealth + 2.3))

Операторы - стандартные операции над объектами; прибавить, убавить, умножить, поделить.

Важно, что сейчас типы значений конфликтуют друг с другом, и нельзя смешивать целые числа с плавающими числами равно как и с текстом. Т.е. например floor(fltPlayerHealth * 55.0) / 55 не заработает, т.к. сначала идут числа с точкой, а затем цельное число. В дальнейшем это изменится.

Пример

687474703a2f2f692e696d6775722e636f6d2f6b4c4a356d76452e706e67.png

floor(fltPlayerHealth * 55.0) / 55.0

Это выражение даст нам значение, которое позволит нам покрасить прогресс бар здоровья в инвентаре, при этом выравниваясь по кубикам (коих 55 штук). То что должно у нас получится на скриншоте.

 <state_progress x="0" y="0" width="171" height="16" horz="1" min="0" max="1" pos="0" expression="floor(fltPlayerHealth * 55.0) / 55.0">

Разберем выражение в порядке его выполнения в движке:

  • 1. Сначала мы получаем из движка текущее значение жизни ГГ (главного героя), через переменную fltPlayerHealth. Мы получим значение от 0.0 (полностью мёртв) до 1.0 (абсолютно здоров).
  • 2. Затем полученное значение мы умножаем на 55.0. Т.е 55 с плавующей точкой. Напоминаю, что просто написать “55” мы не можем, т.к. обычные числа и числа с точкой пока конфликтуют между собой.
  • 3. К полученному результату применяется функция floor. floor округлит результат к ближайшему меньшему целому. Т.е. к примеру 3.8 станет 3.0, а -2.3 станет -3.0.
  • 4. Результат функции будет поделён на 55.0. Опять же, не забываем про типы чисел.

Список всех функции

floor -Функция округляет число с точкой до ближайшего наименьшего целого числа (тип числа не меняется). 
Пример: 2.9 = 2.0; 5.3 = 5.0; -2.4 = -3.0 
ceil - Функция округляет число с точкой до ближайшего наибольшего целого числа (тип числа не меняется). 
Пример: 2.9 = 3.0; 5.3 = 6.0; -2.4 = -2.0 Список всех переменных В начале переменной пишется её тип. 
flt - число с точкой, int - целое число, str - строка.

Список всех переменных

fltActorOutfitBurnProtection 			-- степень защищенности брони Актора от огня
fltActorOutfitShockProtection 			-- степень защищенности брони Актора от электричества
fltActorOutfitChemicalBurnProtection 	-- степень защищенности брони Актора от химических веществ
fltActorOutfitRadiationProtection 		-- степень защищенности брони Актора от радиации
fltActorOutfitTelepaticProtection 		-- степень защищенности брони Актора от ментального воздействия
fltActorOutfitWoundProtection
fltActorOutfitFireWoundProtection
fltActorOutfitStrikeProtection 			-- степень защищенности брони Актора от разрыва
fltActorOutfitExplosionProtection 		-- степень защищенности брони Актора от взрывчатых веществ
fltActorHelmetBurnProtection 			-- степень защищенности шлема Актора от огня
fltActorHelmetShockProtection 			-- степень защищенности шлема Актора от электричества
fltActorHelmetChemicalBurnProtection 	-- степень защищенности шлема Актора от химических веществ
fltActorHelmetRadiationProtection 		-- степень защищенности шлема Актора от радиации
fltActorHelmetTelepaticProtection 		-- степень защищенности шлема Актора от ментального воздействия
fltActorHelmetWoundProtection
fltActorHelmetFireWoundProtection
fltActorHelmetStrikeProtection 			-- степень защищенности шлема Актора от разрыва
fltActorHelmetExplosionProtection 		-- степень защищенности шлема Актора от взрывчатых веществ
fltActorBoostRadiationProtection 		-- степень бонуса к защите от радиации, даваемые различными химикатами (радиопротекторы к примеру)
fltActorBoostTelepaticProtection 		-- степерь бонуса к защите от ментального воздействия, даваемые различными химикатами.
fltActorBoostChemicalBurnProtection 	-- степень бонуса к защите от химических веществ, даваемые различными химикатами.
fltArtefactsBurnProtection 				-- степень бонуса к защите от огня, даваемый надетыми артефактами
fltArtefactsShockProtection 			-- степень бонуса к защите от электричества, даваемый надетыми артефактами
fltArtefactsChemicalBurnProtection 		-- степень бонуса к защите от химического воздействия, даваемый надетыми артефактами
fltArtefactsRadiationProtection 		-- степень бонуса к защите от радиации, даваемый надетыми артефактами
fltArtefactsTelepaticProtection 		-- степень бонуса к защите от ментального воздействия, даваемый надетыми артефактами
fltArtefactsWoundProtection
fltArtefactsFireWoundProtection
fltArtefactsStrikeProtection 			-- степень бонуса к защите от разрыва, даваемый надетыми артефактами
fltArtefactsExplosionProtection 		-- степень бонуса к защите от взрывчатых веществ, даваемый надетыми артефактами* fltZoneMaxPowerBurnProtection 	-- максимально возможная степень защиты от огня
fltZoneMaxPowerShockProtection 			-- максимально возможная степень защиты от электричества
fltZoneMaxPowerChemicalBurnProtection 	-- максимально возможная степень защиты от химического воздействия
fltZoneMaxPowerRadiationProtection 		-- максимально возможная степень защиты от радиации
fltZoneMaxPowerTelepaticProtection 		-- максимально возможная степень защиты от ментального воздействия
fltZoneMaxPowerWoundProtection
fltZoneMaxPowerFireWoundProtection
fltZoneMaxPowerStrikeProtection 		-- максимально возможная степень защиты от разрыва
fltZoneMaxPowerExplosionProtection	 	-- максимально возможная степень защиты от взрывчатых веществ
intPDAActiveContacts 					-- текущее количество контактов PDA
strPlayerName							-- Имя актора
fltPlayerHealth							-- Количество жизни актора, где 0.0 - мёртв, 1.0 - абсолютно здоров.

Если нужно добавить новую переменную

Вам нужно зайти в файл game_expression_delegates.cpp. Затем добавить там функцию результат который будет возвращать значение нужной вам переменной
(float, int, LPCSTR)
. Помните, что функция будет вызываться каждый раз когда рисуется виджет (а именно - каждый кадр). Затем в конце функции void RegisterExpressionDelegates () надо добавить строчку регистрации вашей переменной.