Перейти к содержимому

Выражения

Почти везде, где указываются размеры, отступы, условия и прочие числовые значения, можно использовать выражения.

При использовании в качестве boolean проверяется value != 0.

+, -, *, / - арифметические операторы.

==, !=, <, <=, >, >= - операторы сравнения.

&&, || - логические операторы “и” и “или”.

! - логический оператор “не”.

?: - тернарный оператор, аналог if, например x > 0 ? 1 : -1.

Переменные начинаются с v., например v.a, v.b, v.selected_option. Они могут быть только числами и их не нужно объявлять. Значение переменной по умолчанию - 0. Можно использовать любой вариант написания variable.a, var.a и v.a, это все одна и та же переменная.

v.a = 5;
v.b = v.a == 5 ? 10 : 20;
v.c = min(v.a, v.b);

В большинстве случаев выражения однострочные, но также поддерживают несколько строк. Результатом выражения всегда будет число, которое было в последней строке.

Каждая строка заканчивается точкой с запятой ;. В последней строке точка с запятой не обязательна. Сам перенос строки не обязателен, но лучше для читабельности.

v.a = 5;
v.b = 10
// return 10, так как значение в последней строке было 10
v.a + v.b
// return 15, так как тут всего одна строка
v.a = 5; v.b = 10
// return 10, так как новая строка не обязательна, достаточно точки с запятой

Эти переменные доступны только в текущем выражении. Они сохраняются между вызовами, но не доступны в других выражениях. Например, если в одном выражении вы присвоили temp.a = 5, то в другом выражении temp.a будет равно 0.

Для обычных элементов они привязываются к ближайшему контейнеру с contentRoot(true), если такого нет, то к корневому контейнеру.

Для элементов 3D они все находятся в одной области видимости, то есть переменные из одного элемента 3D доступны в других элементах 3D.

Для каждого бинда на клаву или мышь создается своя область видимости, то есть переменные из одного бинда не доступны в других биндах.

Все области видимости иерархичные, то есть они могут использовать переменные, созданные в родительских элементах, но не наоборот:

global.
├── HUD (2D)
│ └── Container (contentRoot = true)
│ └── Container (contentRoot = true)
├── WORLD (3D)
│ └── Container3D
│ └── Container (contentRoot = true)
└── INPUT (бинды на клаву)

Глобальные переменные начинаются с global., например global.a, global.b, global.selected_option. Они доступны из любого элемента, 3д элемента, бинда на кнопку и т.д. Можно использовать любой вариант написания global.a или g.a, это все одна и та же переменная.

Условия начинаются с if, после которого идет условие в скобках.

if (hover) {
v.a = 5;
}
// аналогично
if (hover) v.a = 5;
// блок else тоже доступен
if (q.key_pressed(KEY_ENTER)) {
v.selected_option = 1;
v.menuOpened = false;
} else {
v.selected_option = 0;
v.menuOpened = true;
}
// Результат выражения все так же будет последней выполненной строкой
v.a = 5;
if (v.a == 5)
v.b = 10
// return 10, так как v.b = 10 было выполнено последним
if (v.a == 6)
v.b = 10;
// return 0, так как нет else
if (true) 5 else 10
// return 5, так тоже можно, не обязательно использовать переменные
if (false) 5 else if (true) 10 else 20
// return 10, и так тоже можно
  • pi - Math.PI = 3.14159
  • true - 1
  • false - 0
  • time - Возвращает текущее время в секундах, почти как System.currentTimeMillis() / 1000
  • random - Возвращает случайное число от 0 до 1.
  • q.screen_width - Ширина экрана.
  • q.screen_height - Высота экрана.
  • q.gui_scale - Масштаб интерфейса.
  • abs(x) - Возвращает абсолютное значение x.
  • cache(a) - Кэширует результат a и всегда возвращает его. Например, cache(random) всего один раз сгенерирует рандомное значение, а потом будет возвращать его.
  • cache(a, b) - Кэширует результат a и всегда возвращает его, пока b не изменится. Например, cache(q.mouse_x, visible) при каждом изменении видимости будет запоминать текущую позицию мыши.
  • transition(value, duration[, easing]) - Каждый раз когда значение value изменяется, оно будет плавно сглаживать это изменение. Пример 1: При наведении плавно изменит значение на 100 transition(hover ? 100 : 0, 255). Пример 2: То же самое, но с другим изингом transition(hover ? 100 : 0, 255, easing(linear)). Значение value считается каждый кадр, значение duration только при начале анимации.
  • ceil(x) - Возвращает x, округленное вверх до ближайшего целого числа.
  • clamp(x, min, max) - Возвращает x, ограниченное между min и max.
  • cos(x) - Возвращает косинус x (в радианах).
  • floor(x) - Возвращает x, округленное вниз до ближайшего целого числа.
  • lerp(t, a, b) - Линейная интерполяция между a и b с параметром t от 0 до 1.
  • max(a, b, ...) - Возвращает наибольшее значение среди аргументов.
  • min(a, b, ...) - Возвращает наименьшее значение среди аргументов.
  • mod(x, y) - Возвращает x % y.
  • pow(x, y) - Возвращает x в степени y.
  • random(a, b) - Возвращает случайное число от [a, b).
  • random_int(a, b) - Возвращает случайное целое число [a, b).
  • rount(x) - Возвращает x, округленное до ближайшего целого числа.
  • sin(x) - Возвращает синус x (в радианах).
  • sqrt(x) - Возвращает квадратный корень из x.
  • square(x) - Возвращает x * x.
  • q.key_pressed(key) - Возвращает 1, если клавиша key нажата, иначе 0. Все доступные имена кнопок можно найти в классе GraphenKeys. Например, q.key_pressed(BIND_PLAYER_LIST) или q.key_pressed(KEY_TAB). Также можно использовать числовые коды клавиш, например q.key_pressed(32) - пробел, полезно при использовании кастомных биндов.
  • q.alt_pressed() - Возвращает 1, если клавиша Alt нажата, иначе 0.
  • q.ctrl_pressed() - Возвращает 1, если клавиша Ctrl нажата, иначе 0.
  • q.shift_pressed() - Возвращает 1, если клавиша Shift нажата, иначе 0.
  • q.screen(type) - Возвращает 1 если открыт скрин указаного типа. Типы: chat, pause, anvil, crafting, enchantment, brewing_stand, furnace, beacon, blast_furnace, hopper, merchant, grindstone, loom, cartography_table, graphen.

% - процент от ширины/высоты родителя, например 50% - это половина ширины/высоты родителя.

%c - процент от ширины/высоты контента родителя, полезно если нужно знать всю высоту скролла. Например, 50%c - это то же самое что и cw(..) * 0.5.

vw - процент от ширины экрана, например 50vw - это половина ширины экрана.

vh - процент от высоты экрана, например 50vh - это половина высоты экрана.

  • age - Возвращает время в секундах, прошедшее с момента создания элемента.
  • focus - Возвращает 1, если элемент в фокусе, иначе 0.
  • hover - Возвращает 1, если курсор мыши над элементом, иначе 0.
  • visible - Возвращает 1, если условие Element.visibility(expr) истинно, иначе 0.
  • pressed - Возвращает 1, если элемент в нажатом состоянии, иначе 0.
  • sx - Возвращает scale по оси X элемента.
  • sy - Возвращает scale по оси Y элемента.
  • ml - Значение marginLeft элемента.
  • mt - Значение marginTop элемента.
  • mr - Значение marginRight элемента.
  • mb - Значение marginBottom элемента.
  • mx - Сокращение для ml + mr.
  • my - Сокращение для mt + mb.
  • pl - Значение paddingLeft элемента.
  • pt - Значение paddingTop элемента.
  • pr - Значение paddingRight элемента.
  • pb - Значение paddingBottom элемента.
  • px - Сокращение для pl + pr.
  • py - Сокращение для pt + pb.
  • w - Ширина элемента с учетом скейла.
  • h - Высота элемента с учетом скейла.
  • cw - Ширина контента элемента (к примеру текст, дочерние элементы).
  • ch - Высота контента элемента.
  • auto - Стандартное значение ширины или высоты элемента, может использоваться для Element.size, Element.width, Element.height. Например, чтобы ограничить минимальную ширину можно написать Element.width("max(100, auto)").
  • scroll_x - Если элемент является контейнером, то возвращает количество пикселей, на которое контент прокручен по оси X.
  • scroll_y - Если элемент является контейнером, то возвращает количество пикселей, на которое контент прокручен по оси Y.
  • scroll_x_max - Если элемент является контейнером, то возвращает максимальное количество пикселей, на которое контент может быть прокручен по оси X. scroll_x == scroll_x_max - контент прокручен до конца.
  • scroll_y_max - Если элемент является контейнером, то возвращает максимальное количество пикселей, на которое контент может быть прокручен по оси Y.
  • scroll_x_ratio - Если элемент является контейнером, то возвращает отношение scroll_x / scroll_x_max, значение от 0 до 1.
  • scroll_y_ratio - Если элемент является контейнером, то возвращает отношение scroll_y / scroll_y_max, значение от 0 до 1.
  • num_children - Если элемент является контейнером, то возвращает количество дочерних элементов.
  • slider_value - Если элемент является Slider, то возвращает текущее значение слайдера.
  • slider_min - Если элемент является Slider, то возвращает минимальное значение слайдера.
  • slider_max - Если элемент является Slider, то возвращает максимальное значение слайдера.
  • slider_ratio - Сокращение для (slider_value - slider_min) / (slider_max - slider_min), значение от 0 до 1..
  • input_empty - Если элемент является TextInput, то возвращает 1, если поле ввода пустое, иначе 0.
  • prev_prop_value - Если использовать в Edit, то в переменной будет храниться предыдущее значение свойства, которое редактируется. Например, .on(Trigger.MOUSE_CLICK_LEFT, new Edit().margin("prev_prop_value + 5")) будет увеличивать значение margin на 5 при каждом клике.
  • q.mouse_x - Возвращает координату X курсора мыши относительно родительского контейнера.
  • q.mouse_y - Возвращает координату Y курсора мыши относительно родительского контейнера.

Все переменные выше, только с аргументом id, а также дополнительные функции:

  • exists(id) - Возвращает 1, если элемент с идентификатором id существует, иначе 0.
  • x(id) - Возвращает координату X элемента с идентификатором id.
  • y(id) - Возвращает координату Y элемента с идентификатором id.
  • xw(id) - Сокращение для x(id) + w(id).
  • yh(id) - Сокращение для y(id) + h(id).
  • has_tag(tag) - Возвращает 1, если элемент имеет тег tag, иначе 0.
  • has_tag(tag, id) - Возвращает 1, если элемент с идентификатором id имеет тег tag, иначе 0.
  • tag_count(tag) - Возвращает количество соседних элементов с тегом tag.
  • tag_count(tag, id) - Возвращает количество элементов с тегом tag для контейнера с идентификатором id.
  • dynamic(value) - Помечает выражение как динамическое, чтобы предотвратить его кэширование. Например, dynamic(v.my_var). Полезно только если возникают проблемы с кешированием.
  • age - Возвращает время в секундах, прошедшее с момента создания элемента.
  • exists(id) - Возвращает 1, если элемент с идентификатором id существует, иначе 0.
  • t - Время от 0 до 1, где 0 - начало анимации, 1 - конец.
  • cubic_bezier(x1, y1, x2, y2) - Кубическая интерполяция Безье. x1, y1, x2, y2 - контрольные точки. t - время от 0 до 1.