Элементы
Осуществляют большинство функций, требуемых от интерфейса. Элемент обрабатывает действия пользователя и на их основе изменяется, переключая свое состояние или сообщая о взаимодействии окну. Также как и любой другой компонент, элемент отрисовывается на холсте (канвасе), но еще и может динамически изменять свое содержимое.
Жизненный цикл
Помимо стандартного обновления фоновой компановки, элементы определяют прикосновения пользователя, обрабатывают биндинги и кешируются для автоматического обновления самих себя.
Как и другие компоненты, элементы могут быть перерисованы с помощью функции invalidateElements или invalidateUIElements контейнера. Это немедленно приведет к перекешированию всех элементов, правда обычно стандартного кеширования раз в пол секунды вполне достаточно для стабильного обновления.
Некоторые элементы имеют собственные события, они напрямую связаны с взаимодействиями пользователя, практически все (за исключением слотов инвентаря) обрабатывают еще и прикосновения, объекты описания которых приведены в соответствующем параграфе.
Разновидности элементов
Компоненты в элементах определяются в свойстве elements
объекта описания окна. Любой элемент может быть получен по идентификатору, изменен или привязан к глобальному свойству окна.
new UI.Window({
...
elements: {
// объект описания компонента
some_identifier: {
type: "компонент", // необходимое свойство
...
},
...
}
})
Объектов описания компонентов может быть сколько угодно, порядок элементов в объекте сохраняется и при отрисовке.
Большинство элементов друг без друга будут выглядеть странно. К примеру, как можно представить себе обычную кнопку без текста. Что она должна делать? А может, вы хотели бы увеличить размер фона слота, не изменяя все остальное? Используйте комбинацию из нескольких элементов.
Общие свойства
В отличии от элементов фоновой компоновки, элементы основываются на общем прототипе, задающем несколько базовых свойств жизненного цикла и местоположения. Чтобы не рассматривать их в каждом элементе, выделим общие здесь.
Любой элемент, помимо необходимого свойства, описывающего вид компонента, должен содержать информацию о местоположении на экране. Для этого используется координаты из ординаты и абсциссы:
{
...
x: 0, y: 0
}
Местоположение как и прочие величины размера представлены в юнитах, напомню что это 1/1000 ширины окна. Несмотря на то что экран двухмерный, задание перекрытий позволяет перекрывать элементы позади себя. Для этого используется свойство глубины:
{
...
z: 0
}
Чем его значение больше, тем элемент ближе. Используйте это свойство если не хотите изменять порядок элементов или обновляете компонент через некоторое время.
Нажатие по элементу приводит к соответствующему событию, клику:
{
...
onClick: function(container, window, component, location) {
...
}
}
Здесь предоставляется контейнер (если есть), окно привязанное к нему, сам элемент и точка, где было произведено нажатие относительно местоположения элемента. Помимо стандартного нажатия, это действие обрабатывает удержание. Однако, существует возможность обрабатывать удержание отдельно, не вызывая событие клика:
{
...
onLongClick: function(container, window, component, location) {
...
}
}
Но чтобы еще более тонко настроить взаимодействие с компонентом, можете обработать события самостоятельно. Остальные действия все так же будут проходить, используйте только необходимые типы:
{
...
onTouchEvent: function(component, event) {
switch (event.type.name()) {
case "DOWN":
// первое прикосновение к компоненту
break;
case "MOVE":
// перемещение пальца по компоненту,
// вызывается каждый момент прикосновения
// при малейших изменениях жеста
break;
case "CLICK":
case "LONG_CLICK":
// стандартные события нажатия и удержания;
// если были вызваны, тип окончания события
// не будет вызван и перезапишется
break;
case "UP":
case "CANCEL":
// взаимодействие окончено или отменено
// (отменяется системными действиями)
break;
}
}
}
Рассмотрите ITouchEvent для получения подробностей о доступных свойствах и методах параметра event
.
Изображения
Отображает изображение из ресурсов папок интерфейса движка, используя заданные размеры, либо занимая количество пикселей в картинке. Используется для анимаций и отображения статичных элементов.
{
type: "bitmap",
x: 40, y: 0,
bitmap: "icon_menu_innercore"
}
По умолчанию, изображения отрисовываются с тем же количеством пикселей, что находятся в выбранной текстуре. Для изменения этого поведения, вручную установите ширину и высоту:
{
...
width: 128,
height: 128
}
Или измените масштаб, на который будут умножены стандартные размеры и положение:
{
...
scale: 2.0
}
Помимо прочего, изображения в элементах могут отрисовывать картинку над собой:
{
...
overlay: "icon_mod_edit"
}
Тогда, основной bitmap
станет чем-то вроде фонового изображения.
Текст
Единственный компонент для отрисовки текста, позволяет настроить цвет, размер и несколько элементов стиля. В качестве шрифта задействуется Minecraft (hy60koshk), включающий в себя основные символы и поддержку кириллицы.
{
type: "text",
x: 20, y: 40,
text: "Привет"
}
Все остальные свойства настраиваются с помощью объекта шрифта, включающего некоторое количество опций:
{
...
font: {
color: android.graphics.Color.WHITE,
// размер текста в юнитах
size: 20,
// выравнивание текста относительно его
// положения: слева сверху (0), по центру (1),
// справа снизу (2), справа по центру (3)
alignment: 0,
// смещение тени текста, значение от 0 до 1,
// где ноль означает полное отсутствие;
// чем больше смещение, тем тень темнее
shadow: 0,
bold: false, // толстый или плотный текст
cursive: false, // курсивный текст с наклоном
underline: false // подчеркнутый текст
}
}
Здесь представлены значения по умолчанию, так что просто измените нужные "под себя".
В отличии от фоновой компоновки, текст в виде элемента поддерживает переносы на новую строку. Его настройки определяют свойства:
{
...
multiline: false, // обработка переносов
// нужно ли дополнительно обработать
// текст перед отрисовкой, нужно для
// следующего свойства
format: false,
// максимальное количество символов на
// одной строке, остальные будут
// перенесены; требует multine и format
formatMaxCharsPerLine: 999
}
Кнопки
Кнопки представляют собой изображение, изменяющееся при взаимодействии с ней. Имеет два состояния — пассивное и активное; последнее вызывается вследствии наведения курсора или пальца, нажатия и удержания.
{
type: "button",
x: 120, y: 40,
bitmap: "classic_button_frame_up",
bitmap2: "classic_button_frame_hover"
}
Несмотря на то что любая кнопка представляет собой изображение, она не может быть растянута движком. Вы должны позаботиться о подготовке кнопок нужных размеров перед их отображением, параметр scale
поможет изменить масштаб если это необходимо.
Рассмотрите общие свойства для определения событий, вызываемых кнопкой и прочими элементами.
Слоты
Помимо визуальной части, этот элемент содержит в себе предмет. Привязка окна к контейнеру позволит игроку взаимодействовать со слотами, перемещая в них предметы из слотов инвентаря.
{
type: "slot",
x: 240, y: 160,
bitmap: "style:slot",
size: 60
}