Введение в GUI — различия между версиями

 
(не показаны 22 промежуточные версии 4 участников)
Строка 1: Строка 1:
  
Для создания GUI (графический интерфейс пользователя) в Core Engine предусмотрены огромные возможности, которые позволяют не только создавать сложный интерфейс в стиле MCPE (и не только), но и эффективно интегрировать его с остальными игровыми элементами, которые добавляются модами с помощью контейнеров.
+
Для создания GUI (графический интерфейс пользователя) в Inner Core предусмотрены огромные возможности, которые позволяют не только создавать сложный интерфейс в стиле MCPE (и не только), но и эффективно интегрировать его с остальными игровыми элементами, которые добавляются модами с помощью контейнеров.
  
 
=== Единицы измерения ===
 
=== Единицы измерения ===
  
 
Все размеры и координаты в интерфейсе задаются в юнитах, где 1 юнит это 1/1000 от ширины окна, в котором создается интерфейс. Если юниты используются для задания позиции и размера окна, то 1 юнит составляет 1/1000 от ширины экрана (как и в случае, когда окно открыто на весь экран).
 
Все размеры и координаты в интерфейсе задаются в юнитах, где 1 юнит это 1/1000 от ширины окна, в котором создается интерфейс. Если юниты используются для задания позиции и размера окна, то 1 юнит составляет 1/1000 от ширины экрана (как и в случае, когда окно открыто на весь экран).
 +
=== Параметры Элементов ===
 +
<syntaxhighlight lang="Javascript">
 +
//Частые параметры
 +
type: "тип_элемента" - задает тип элемента.
 +
x: число - положение элемента по горизонтали.
 +
y: число - положение элемента по вертикали.
 +
scale: число - сколько юнитов приходится на 1 пиксель текстуры, если этот параметр не указан, он будет равен 1.
 +
bitmap: "текстура" - задает текстуру элементу.
 +
//Для других элементов(частный случай)
 +
text: "текст"- задает текст элементу.
 +
color: цвет - задает цвет,
 +
font: шрифт_текста- задает параметры шрифта, имеет следующий вид:
 +
{color: цвет, shadow: тень(число от 0 до 1), size: размер(в юнитах)}
 +
bg: "текстура" - задает текстуру фона
 +
bitmap2: "текстура" - аналогично.
 +
width: число - ширина элемента.
 +
height: число - высота элемента.
 +
 +
</syntaxhighlight>
  
 
=== Текстуры и цвет ===
 
=== Текстуры и цвет ===
  
Текстуры интерфейса, которые находятся в папке gui вашего мода, будут загруженны и доступны под именем файла без расширения: "gui/slot.png" будет загружен как "slot".
+
Текстуры интерфейса, которые находятся в папке gui вашего мода, будут загруженны и доступны под именем файла без расширения: "gui/slot.png" будет загружен как "slot". Если в папке gui у вас есть папка и в ней картинка к который вы хотите обратиться то вместо / надо использовать точку, например: папка gui/gui1/image.png - обращение gui1.image
 
+
Также возможно использование объекта [https://developer.android.com/reference/android/graphics/Bitmap Bitmap ]вместо имени файла, если возникает такая необходимость.
Цвет задается с помощью метода класса android api android.graphics.Color.rgb(r, g, b) - где r, g и b - красная, зеленая и синяя составляющие цвета от 0 до 255 каждая.
 
  
Фонт текста задается как объект с 3 значениями: {size: ..., color: ..., shadow: ...}, где size - размер текста, color - цвет, shadow - тень со значением от 0 до 1.&nbsp;
+
Цвет задается с помощью метода класса android.api.android.graphics.Color.rgb(r, g, b) - где r, g и b - красная, зеленая и синяя составляющие цвета от 0 до 255 каждая.
  
 
Текстурой рамки является текстура размера 16x16, изображающая нужную рамку самого маленького размера, которая будет потом растянута до любых размеров.
 
Текстурой рамки является текстура размера 16x16, изображающая нужную рамку самого маленького размера, которая будет потом растянута до любых размеров.
 +
</div>
  
 
=== Объект описания ===
 
=== Объект описания ===
  
Любой интерфейс имеет объект описания, позволяющий задать данный интерфейс и динамично изменять его, меняя этот объект, пока интерфейс открыт. Объект описания любого типа имеет значения drawing (массив) и elements (объект), которые задают отрисовку фона и элементы соответственно. Их изменение из любого места ведет к динамичному изменению интерфейса, если он открыт. Т.е если вы изменените параметры какого-то элемента или команды отрисовки, то интерфейс изменится в соответствии с вашими изменениями.&nbsp;
+
Любой интерфейс имеет объект описания, позволяющий задать данный интерфейс и динамично изменять его, меняя этот объект, пока интерфейс открыт. Объект описания любого типа имеет значения drawing (массив) и elements (объект), которые задают отрисовку фона и элементы соответственно. Их изменение из любого места ведет к динамичному изменению интерфейса, если он открыт. Т.е если вы изменените параметры какого-то элемента или команды отрисовки, то интерфейс изменится в соответствии с вашими изменениями.
 
 
=== Команды рисования ===
 
  
Команды рисования задаются в объекте описания в массиве drawing и отвечают за отрисовку фона интерфейса.
+
=== Отрисовка элементов на фоне ===
 +
Элементы отрисовки задаются в объекте описания в массиве drawing и отвечают за отрисовку фона интерфейса.
 +
Стоит учесть что каждый элемент будет накладываться послойно(т.е 2й элемент будет сверху 1го и тд).
  
 
==== Формат: ====
 
==== Формат: ====
<pre>drawing: [
+
<syntaxhighlight lang="Javascript">drawing: [
     {/* команда 1 */},
+
     {/* параметры элемента 1 */},
     {/* команда 2 */},
+
     {/* параметры элемента 2 */},
     {/* команда 3 */},
+
     {/* параметры элемента 3 */},
     ....
+
     //....
]
+
]</syntaxhighlight>
</pre>
 
  
==== Стардартные команды: ====
+
==== Элементы отрисовки: ====
 
+
<syntaxhighlight lang="Javascript">
*{type: "background", color: цвет} - заполняет весь фон указанным цветом.
+
/*Background*/ {type: "background", color: цвет}
*{type: "bitmap", bitmap: "текстура", x: число, y: число, scale: число} - отрисовывает данную текстуру на данных координатах. Параметр scale отвечает за то, сколько юнитов приходится на 1 пиксель текстуры, если этот параметр не указан, он будет равен 1.
+
/*Bitmap*/ {type: "bitmap", bitmap: "текстура", x: число, y: число, scale: число}
*{type: "frame", x: число, y: число, width: число, height: число, bitmap: "текстура рамки", bg: цвет, scale: число} - отрисовывает рамку данного размера на данных координатах, bitmap - текстура рамки, если не указана, будет использовать стандартная, bg - определите, если хотите, чтобы у рамки был фон какого-то цвета, scale - во сколько раз будет увеличена текстура рамки (толщина рамки), если не указана, то принята за 1.
+
/*Frame*/ {type: "frame", x: число, y: число, width: число, height: число, bitmap: "текстура_рамки", color: цвет, sides: bool,  scale: число}
*{type: "text", text: "текст", x: число, y: число, font: фонт текста} - отрисовывает данный текст на данных координатах с данным фонтом.
+
/*Text*/ {type: "text", text: "текст", x: число, y: число, font: шрифт_текста}
*{type: "line, x1: число, y1: число, x2: число, y2: число, width: число, color: цвет} - отрисовывает линию между заданными координатами. width - толщина линии в юнитах, по-умолчанию 1, color - цвет линии, по-умолчанию черный.  
+
/*Line*/ {type: "line", x1: число, y1: число, x2: число, y2: число, width: число, color: цвет}
 +
</syntaxhighlight>
 +
'''''Background''''' Заполняет весь фон указанным цветом.<br>
 +
'''''Bitmap''''' Отрисовывает данную текстуру на данных координатах.<br>
 +
'''''Frame''''' Отрисовывает рамку данного размера на данных координатах.<br>
 +
'''''Text''''' Отрисовывает данный текст на данных координатах с данным шрифтом.<br>
 +
'''''Line''''' Отрисовывает линию от x1 и y1 до x2 и y2. width - толщина линии в юнитах, по-умолчанию 1, color - цвет линии, по-умолчанию черный.<br>
  
 
=== Элементы ===
 
=== Элементы ===
  
Элементы задаются в объекте описания в объекте elements, каждый элемент должен иметь уникальное имя. По этим именам с ними можно будет взаимодействовать из других частей кода.
+
Элементы задаются в объекте описания в объекте elements, каждый элемент должен иметь уникальное имя. По этим именам с ними можно будет взаимодействовать позже.
  
 
==== Формат: ====
 
==== Формат: ====
<pre>elements: {
+
<syntaxhighlight lang="Javascript">elements: {
 
     "name1": {/* элемент 1 */},
 
     "name1": {/* элемент 1 */},
 
     "name2": {/* элемент 2 */},
 
     "name2": {/* элемент 2 */},
 
     "name3": {/* элемент 3 */},
 
     "name3": {/* элемент 3 */},
     ....
+
     //....
}</pre>
+
}</syntaxhighlight>
 
 
 
==== Объект функций клика ====
 
==== Объект функций клика ====
<div>Такой объект используется в некоторых элементах, например в кнопках, чтобы определить действие при нажатии.&nbsp;</div>  
+
<div>Такой объект используется в некоторых элементах, например в кнопках, чтобы определить действие при нажатии.</div>  
 
Формат объекта:
 
Формат объекта:
<pre>{
+
<syntaxhighlight lang="Javascript">{
     onClick: function(position, container, tileEntity, window, canvas, scale){ // если определен, задает функцию короткого нажатия
+
     onClick: function(position, container, tileEntity, window, canvas, scale){  
          // container - контейнер, для которого открыт данный интерфейс
+
          // если задан, задает функцию короткого нажатия
          // tileEntity - если интерфейс открыт для какого то tile entity, то передаст его, иначе null
 
          // остальные параметры будут рассмотрены в других уроках
 
 
     },
 
     },
 
+
     onLongClick: function(position, container, tileEntity, window, canvas, scale){
     onLongClick: function(position, container, tileEntity, window, canvas, scale){ // если определен, задает функцию долгого нажатия
+
          // если задан, задает функцию долгого нажатия
          // container - контейнер, для которого открыт данный интерфейс
 
          // tileEntity - если интерфейс открыт для какого то tile entity, то передаст его, иначе null
 
          // остальные параметры будут рассмотрены в других уроках
 
 
     }
 
     }
}
+
    //возвращаемые параметры
</pre>
+
    //position - возвращает позицию касания
 +
    // container - контейнер, для которого открыт данный интерфейс
 +
    // tileEntity - если интерфейс открыт для какого то tile entity, то передаст его, иначе null
 +
    //window - возвращает окно с которого было воспроизведено нажатие
 +
    //canvas - возвращает канвас ??
 +
    //scale размер элемента ??
 +
}</syntaxhighlight>
  
 +
<h4>Стандартные элементы:</h4>
  
==== Стандартные элементы: ====
+
<ul>
 +
<li><syntaxhighlight lang="Javascript">{type: "slot", x: число, y: число, size: число, isValid: function, visual: bool, bitmap: "текстура", clicker: объект функций клика, needClean: bool, isTransparentBackground: bool}</syntaxhighlight>- создает слот размера size, если параметр visual задан и равен true, то слот не может быть выделен и из него ничего нельзя забрать, если clicker задан, то стандартные функции клика будут заменены на определенные в нем, если isTransparentBackground или needClean равняется true, то включается прозрачность текстуры слота. isValid - проверка соответствия фильтру который вы создаете, содержит id, count, data. функция isValid: function(id, count, data){}</li>
 +
<li><syntaxhighlight lang="Javascript">{type: "invSlot", x: число, y: число, size: число, index: число, bitmap: "текстура"}</syntaxhighlight> - создает слот с привзякой к слоту инвентаря - слот инвентаря размера size, синхронизированный со слотом инвентаря с индексом index (от 9 до 45, слоты 0-8 - хотбар)</li>
 +
<li><syntaxhighlight lang="Javascript">{type: "button", x: число, y: число, bitmap: "текстура", bitmap2: "текстура", scale: число, clicker: объект функций клика}</syntaxhighlight> - создает кнопку, функции клика будут вызываться при нажатии на кнопку, если задан bitmap2, то при нажатии кнопку изменит временно текстуру на него. <br /></li>
 +
<li><syntaxhighlight lang="Javascript">{type: "closeButton", x: число, y: число, global: лог.значение, bitmap: "текстура", bitmap2: "текстура", scale: число}</syntaxhighlight> - создает кнопку закрытия окна, если параметр global равен true, то кнопка закроет всю группу окон, а не только данное окно.</li>
 +
<li><syntaxhighlight lang="Javascript">{type: "scale", x: число, y: число, direction: число, bitmap: "текстура", scale: число, invert: bool, overlay: "текстура", overlayScale: число, overlayOffset: {x: число, y: число}}</syntaxhighlight> - создает шкалу в направлении direction, value значение от 0 до 1 - заполненность шкалы(для тестов). Если invert задан и равен true, то позиция вырезки из текстуры будет инвертирована, что создаст видимость того, что шкала как бы выдвигается, а не заполняется.
 +
overlay - если задан, накладывает на шкалу дополнительную текстуру, которая перекрывает ее.
 +
overlayScale - параметр scale для перекрытия.
 +
overlayOffset: {x: , y: } - если задан, задает позицию перекрытия, относительно позиции шкалы.
  
*{type: "slot", x: число, y: число, size: число, visual: лог.значение, bitmap: "текстура", clicker: объект функций клика} - создает слот на данных координатах данного размера в юнитах, если параметр visual опреден и равен true, то слот не может быть выделен и из него ничего нельзя забрать, если bitmap определена, то стандартная текстура слота будет изменена на данную, если clicker определен, то стандартные функции клика будут заменены на определенные в нем.  
+
Направления:
*{type: "invSlot", x: число, y: число, size: число, index: число, bitmap: "текстура"} - создает частный случай слота - слот инвентаря на данных координатах данного размера в юнитах, синхронизированный со слотом инвентаря с индексом index (от 0 до 45, слоты 0-8 - хотбар), если bitmap определена, то стандартная текстура слота будет изменена на данную.
+
<ul>
*{type: "button", x: число, y: число, bitmap: "текстура", bitmap2: "текстура", scale: число, clicker: объект функций клика} - создает кнопку на данных координатах с данной текстурой bitmap, функции клика будут вызываться при нажатии на кнопку, если bitmap2 определена, то при нажатии кнопку изменит текстуру на нее. Параметр scale отвечает за то, сколько юнитов приходится на 1 пиксель текстуры, если этот параметр не указан, он будет равен 1.&nbsp;<br/> Параметры функций объекта клика имеют тут другой порядок:
+
<li>0 - право</li>
<pre>{
+
<li>1 - верх</li>
    onClick: function(container, tileEntity, position, window, canvas, scale){/* ... */},
+
<li>2 - лево</li>
    onLongClick: function(container, tileEntity, position, window, canvas, scale){/* ... */}
+
<li>3 - низ</li>
}</pre>
+
</ul>
 +
</li>
 +
<li><syntaxhighlight lang="Javascript">{type: "text", x: число, y: число, width: число, height: число, multiline: bool, format: bool, formatMaxCharsPerLine: число, text: "текст", font: шрифт_текста}</syntaxhighlight> - создает динамичный текст.</li>
 +
<li><syntaxhighlight lang="Javascript">{type: "image", x: число, y: число, bitmap: "текстура", scale: число, overlay: "текстура", overlayScale: число, overlayOffset: {x: число, y: число}, clicker: объект функций клика}</syntaxhighlight> - создает динамичную картинку.</li>
 +
        <li><syntaxhighlight lang="Javascript">{type: "scroll", x: число, y: число, length: число, min: число, max: число, isInt: true, value: число}</syntaxhighlight> - создает динамичный слайдер с минимальным значением и максимальным, также текущим значением по умолчанию равное value.</li>
 +
</ul>
  
*{type: "closeButton", x: число, y: число, global: лог.значение, bitmap: "текстура", bitmap2: "текстура", scale: число} - создает кнопку закрытия окна на данных координатах, если bitmap и bitmap2 не определены, кнопка имеет стандартную текстуру, если параметр global определен и равен true, то кнопка закроет всю группу окон, а не только данное окно. Параметр scale отвечает за то, сколько юнитов приходится на 1 пиксель текстуры, если этот параметр не указан, он будет равен 1.
+
=== Стилизация ===
*{type: "scale", x: число, y: число, direction: число, bitmap: "текстура", scale: число, invert: лог.значение, overlay: "текстура", overlayScale: число, overlayOffset: {x: число, y: число}} - создает шкалу на данных координатах с текстурой bitmap и в направлении direction. Параметр scale отвечает за то, сколько юнитов приходится на 1 пиксель текстуры, если этот параметр не указан, он будет равен 1.<br/> Направления:
 
**0 - право
 
**1 - верх
 
**2 - лево
 
**3 - низ 
 
 
 
Если invert определен и равен true, то позиция вырезки из текстуры будет инвертирована, что создаст видимость того, что шкала как бы выдвигается, а не заполняется.<br/> overlay - если определен, накладывает на шкалу дополнительную текстуру, которая перекрывает шкалу.<br/> overlayScale - параметр scale для перекрытия.<br/> overlayOffset: {x: , y: } - если определен, задает позицию перекрытия, относительно позиции шкалы в юнитах.
 
 
 
*{type: "text", x: число, y: число, width: число, height: число, text: "текст", font: фонт текста} - создает динамичный текст на заданных координатах, width и height задают длину и ширину области, которая будет очищаться перед отрисовкой текста. text задает начальный текст, font - фонт текста.
 
*{type: "image", x: число, y: число, bitmap: "текстура", scale: число, overlay: "текстура", overlayScale: число, overlayOffset: {x: число, y: число}, clicker: объект функций клика} - создает динамичную картинку на заданых координатах с текстурой bitmap. Параметр scale отвечает за то, сколько юнитов приходится на 1 пиксель текстуры, если этот параметр не указан, он будет равен 1.<br/> Если clicker определен, то функции клика из него будут вызываться при нажатии на элемент.<br/> overlay - если определен, накладывает на шкалу дополнительную текстуру, которая перекрывает шкалу.<br/> overlayScale - параметр scale для перекрытия.<br/> overlayOffset: {x: , y: } - если определен, задает позицию перекрытия, относительно позиции шкалы в юнитах.
 
 
 
=== Стилизация&nbsp; ===
 
  
 
Кроме drawing и elements в объекте описания можно определить объект стилизации интерфейса для изменения стандартных текстур элементов.
 
Кроме drawing и elements в объекте описания можно определить объект стилизации интерфейса для изменения стандартных текстур элементов.
  
 
Если какое-то из нижеприведённых значений будет указано в объекте стилизации, оно заменит стандартый параметр.
 
Если какое-то из нижеприведённых значений будет указано в объекте стилизации, оно заменит стандартый параметр.
<pre>params: {
+
<syntaxhighlight lang="Javascript">params: {
 
     slot: "текстура слота",
 
     slot: "текстура слота",
 
     invSlot: "текстура слота инвентаря",
 
     invSlot: "текстура слота инвентаря",
Строка 106: Строка 132:
 
     closeButton: "текстура кнопки закрытия",
 
     closeButton: "текстура кнопки закрытия",
 
     closeButton2: "текстура нажатой кнопки закрытия",
 
     closeButton2: "текстура нажатой кнопки закрытия",
}</pre>
+
}</syntaxhighlight>
  
 +
<div class="mw-parser-output">
 
=== Типы интерфейса ===
 
=== Типы интерфейса ===
  
Интерфейс бывает 3 типов: однооконный, многооконный и стандартный. В данной главе будет рассмотрен только последний, как самый простой в использовании и при этом эффективный и применимый в большинстве случаев. Объект интерфейса во всех этих случаев создается как объект класса одного из типов, после создания такой объект класса может быть настроен и открыт для любого контейнера.
+
Интерфейсы бывают 3 типов: [[InnerCore/Введение_в_GUI/Стандартный_интерфейс|Стандартный]], [[InnerCore/Введение_в_GUI/Однооконный_интерфейс|Однооконный]] и [[InnerCore/Введение_в_GUI/Многооконный_интерфейс|Многооконный]]. Объект интерфейса во всех этих случаев создается как объект класса одного из типов, после создания такой объект класса может быть настроен и открыт для любого контейнера.
  
 
Любой интерфейс может быть протестирован с помощью функции UI.testUI(объект интерфейса);
 
Любой интерфейс может быть протестирован с помощью функции UI.testUI(объект интерфейса);
 
+
</div>
=== Стандартный интерфейс ===
 
 
 
Создается как объект класса UI.StandartWindow, которому может быть передан объект описания.&nbsp;
 
 
 
Пример использования:
 
<pre>var testUiScreen = UI.StandartWindow({/* ... пустой объект описания ... */});
 
​​​​​​​UI.testUI(testUiScreen); // откроет полностью пустой интерфейс</pre>
 
 
 
&nbsp;
 
 
 
Формат объекта описания стандартного типа интерфейса:
 
<pre>{
 
    standart: { // стандартные параметы, поддерживаемые данным типом интерфейса, позволяют быстро задавать базовые элементы, такие как заголовок, фон и инвентарь
 
          // если хотите определить какой то стандартный элемент, но оставить его без изменений, то пропишите там единственное значение - standart: true, например inventory: {standart: true}
 
          header: { // определите, если вам нужен заголовок, заголовок содержит кнопку закрытия
 
              text: { // обязательный параметр, если заголовок определен
 
                    text: "текст заголовка", // содержание текста, обязательный параметр
 
              },
 
​​​​​​​              font: {...}, // фонт текста, определите, если хотите изменить стандартный
 
              color: цвет, // нужен только, если вы хотите изменить цвет заголовка
 
              frame: "текстура рамки", // нужно только, если вы хотите изменить текстуру рамки заголовка
 
              width: 80, // высота заголовка в юнитах,
 
              hideButton: true, // определите и установите значение на true, чтобы убрать кнопку закрытия
 
          },
 
          inventory: { // для определения стандартного инвентаря используйте inventory: {standart: true}
 
              width: 300, // ширина окна инвентаря
 
              padding: 20, // паддинг окна инвентаря
 
          },
 
          background: { // для определения стандартного фона используйте background: {standart: true}
 
              color: цвет, // определите, если хотите изменить цвет фона
 
              bitmap: "текстура фона", // определите, если хотите добавить текстуру фона
 
              frame: "текстура рамки" // определите, если хотите добавить рамку
 
          },
 
          minHeight: 650, // если высота окна в юнитах меньше этого параметра, окно будет прокручиваться так, чтобы его внутренний размер составлял по высоте minHeight юнитов
 
    },
 
    params: {
 
          // стилизация (изменение стандартных текстур)
 
    },
 
    drawing: [/* команды отрисовки фона */],
 
    elements: {/* описание элементов */}
 
}</pre>
 
 
 
=== Пример ===
 
 
 
Как пример использован реальный интерфейс из таумкрафта (реактор аспектов).
 
 
 
'''Для того, чтобы пример работал, установите таумкрафт или скопируйте оттуда нужные текстуры интерфейса''' (которые используются в объекте описания интерфейса).
 
<pre>var aspectReactorGui = new UI.StandartWindow({
 
    standart: {
 
          header: {
 
              text: {
 
                    text: "Aspect reactor"
 
              },
 
              color: android.graphics.Color.rgb(0x47, 0x26, 0x0c),
 
              frame: "thaum_frame_header"
 
          },
 
          inventory: {
 
              standart: true
 
          },
 
          background: {
 
              bitmap: "thaum_background"
 
          },
 
          minHeight: 600
 
    },
 
    params: {
 
          textures: {
 
              slot: "thaum_slot",
 
              invSlot: "thaum_inv_slot",
 
              selection: "thaum_selection",
 
              closeButton: "thaum_close_button_up",
 
              closeButton2: "thaum_close_button_down",
 
              frame: "thaum_frame_default"
 
          }
 
    },
 
    drawing: [
 
          {type: "bitmap", x: 842, y: 104, bitmap: "aspect_scale_background", scale: 4},
 
          {type: "bitmap", x: 560, y: 100, bitmap: "aspect_reactor_background", scale: 360 / 128},
 
    ],
 
    elements: {
 
          "slot1": {type: "slot", x: 400, y: 100, size: 160},
 
          "slot2": {type: "slot", x: 400, y: 300, size: 160},
 
          "aspectScale": {type: "scale", x: 850, y: 120, direction: 1, scale: 8, value: 1, bitmap: "aspectScale_nitor", overlay: "aspect_scale_overlay_1", overlayScale: 4},
 
          "stateText": {type: "text", x: 625, y: 227, width: 90, height: 100, text: "", font: {color: android.graphics.Color.WHITE, shadow: .6, size: 25}}
 
    }
 
});
 
UI.testUI(aspectReactorGui); // тестовое открытие после создания
 
// добавляем созданный интерфейс нашему tile entity из прошлых глав
 
IDRegistry.genBlockID("testBlock");
 
 
 
// ...
 
// создаем блок
 
TileEntity.registerPrototype(BlockID.testBlock, {
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultValues: {
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;someValue: 0 // сохраняемое значение someValue, по умолчанию 0
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
 
 
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tick: function(){
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// что то сделать каждый тик, к примеру выводим someValue
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.message(this.data.someValue);
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
 
 
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;click: function(id, count, data, coords){
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.data.someValue = 1; // установить значение someValue на 1
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
 
&nbsp;&nbsp;&nbsp;&nbsp;
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getGuiScreen: function(){
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return aspectReactorGui; // при попытке открыть интерфейс, возвращаем наш объект интерфейса
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
 
&nbsp;&nbsp;&nbsp;&nbsp;
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// остальные события не трогаем
 
});</pre>
 

Текущая версия на 18:46, 2 декабря 2019

Для создания GUI (графический интерфейс пользователя) в Inner Core предусмотрены огромные возможности, которые позволяют не только создавать сложный интерфейс в стиле MCPE (и не только), но и эффективно интегрировать его с остальными игровыми элементами, которые добавляются модами с помощью контейнеров.

Единицы измерения[править]

Все размеры и координаты в интерфейсе задаются в юнитах, где 1 юнит это 1/1000 от ширины окна, в котором создается интерфейс. Если юниты используются для задания позиции и размера окна, то 1 юнит составляет 1/1000 от ширины экрана (как и в случае, когда окно открыто на весь экран).

Параметры Элементов[править]

//Частые параметры
type: "тип_элемента" - задает тип элемента.
x: число - положение элемента по горизонтали.
y: число - положение элемента по вертикали.
scale: число - сколько юнитов приходится на 1 пиксель текстуры, если этот параметр не указан, он будет равен 1.
bitmap: "текстура" - задает текстуру элементу.
//Для других элементов(частный случай)
text: "текст"- задает текст элементу.
color: цвет - задает цвет,
 font: шрифт_текста- задает параметры шрифта, имеет следующий вид:
 {color: цвет, shadow: тень(число от 0 до 1), size: размер(в юнитах)}
bg: "текстура" - задает текстуру фона
bitmap2: "текстура" - аналогично.
width: число - ширина элемента.
height: число - высота элемента.

Текстуры и цвет[править]

Текстуры интерфейса, которые находятся в папке gui вашего мода, будут загруженны и доступны под именем файла без расширения: "gui/slot.png" будет загружен как "slot". Если в папке gui у вас есть папка и в ней картинка к который вы хотите обратиться то вместо / надо использовать точку, например: папка gui/gui1/image.png - обращение gui1.image Также возможно использование объекта Bitmap вместо имени файла, если возникает такая необходимость.

Цвет задается с помощью метода класса android.api.android.graphics.Color.rgb(r, g, b) - где r, g и b - красная, зеленая и синяя составляющие цвета от 0 до 255 каждая.

Текстурой рамки является текстура размера 16x16, изображающая нужную рамку самого маленького размера, которая будет потом растянута до любых размеров. </div>

Объект описания[править]

Любой интерфейс имеет объект описания, позволяющий задать данный интерфейс и динамично изменять его, меняя этот объект, пока интерфейс открыт. Объект описания любого типа имеет значения drawing (массив) и elements (объект), которые задают отрисовку фона и элементы соответственно. Их изменение из любого места ведет к динамичному изменению интерфейса, если он открыт. Т.е если вы изменените параметры какого-то элемента или команды отрисовки, то интерфейс изменится в соответствии с вашими изменениями.

Отрисовка элементов на фоне[править]

Элементы отрисовки задаются в объекте описания в массиве drawing и отвечают за отрисовку фона интерфейса. Стоит учесть что каждый элемент будет накладываться послойно(т.е 2й элемент будет сверху 1го и тд).

Формат:[править]

drawing: [
     {/* параметры элемента 1 */},
     {/* параметры элемента 2 */},
     {/* параметры элемента 3 */},
     //....
]

Элементы отрисовки:[править]

 /*Background*/ {type: "background", color: цвет}
 /*Bitmap*/ {type: "bitmap", bitmap: "текстура", x: число, y: число, scale: число}
 /*Frame*/ {type: "frame", x: число, y: число, width: число, height: число, bitmap: "текстура_рамки", color: цвет, sides: bool,  scale: число}
 /*Text*/ {type: "text", text: "текст", x: число, y: число, font: шрифт_текста}
 /*Line*/ {type: "line", x1: число, y1: число, x2: число, y2: число, width: число, color: цвет}

Background Заполняет весь фон указанным цветом.
Bitmap Отрисовывает данную текстуру на данных координатах.
Frame Отрисовывает рамку данного размера на данных координатах.
Text Отрисовывает данный текст на данных координатах с данным шрифтом.
Line Отрисовывает линию от x1 и y1 до x2 и y2. width - толщина линии в юнитах, по-умолчанию 1, color - цвет линии, по-умолчанию черный.

Элементы[править]

Элементы задаются в объекте описания в объекте elements, каждый элемент должен иметь уникальное имя. По этим именам с ними можно будет взаимодействовать позже.

Формат:[править]

elements: {
     "name1": {/* элемент 1 */},
     "name2": {/* элемент 2 */},
     "name3": {/* элемент 3 */},
     //....
}

Объект функций клика[править]

Такой объект используется в некоторых элементах, например в кнопках, чтобы определить действие при нажатии.

Формат объекта:

{
     onClick: function(position, container, tileEntity, window, canvas, scale){ 
          // если задан, задает функцию короткого нажатия
     },
     onLongClick: function(position, container, tileEntity, window, canvas, scale){
          // если задан, задает функцию долгого нажатия
     }
     //возвращаемые параметры
     //position - возвращает позицию касания
     // container - контейнер, для которого открыт данный интерфейс
     // tileEntity - если интерфейс открыт для какого то tile entity, то передаст его, иначе null
     //window - возвращает окно с которого было воспроизведено нажатие
     //canvas - возвращает канвас ??
     //scale размер элемента ??
}

Стандартные элементы:

  • {type: "slot", x: число, y: число, size: число, isValid: function, visual: bool, bitmap: "текстура", clicker: объект функций клика, needClean: bool, isTransparentBackground: bool}
    
    - создает слот размера size, если параметр visual задан и равен true, то слот не может быть выделен и из него ничего нельзя забрать, если clicker задан, то стандартные функции клика будут заменены на определенные в нем, если isTransparentBackground или needClean равняется true, то включается прозрачность текстуры слота. isValid - проверка соответствия фильтру который вы создаете, содержит id, count, data. функция isValid: function(id, count, data){}
  • {type: "invSlot", x: число, y: число, size: число, index: число, bitmap: "текстура"}
    
    - создает слот с привзякой к слоту инвентаря - слот инвентаря размера size, синхронизированный со слотом инвентаря с индексом index (от 9 до 45, слоты 0-8 - хотбар)
  • {type: "button", x: число, y: число, bitmap: "текстура", bitmap2: "текстура", scale: число, clicker: объект функций клика}
    
    - создает кнопку, функции клика будут вызываться при нажатии на кнопку, если задан bitmap2, то при нажатии кнопку изменит временно текстуру на него.
  • {type: "closeButton", x: число, y: число, global: лог.значение, bitmap: "текстура", bitmap2: "текстура", scale: число}
    
    - создает кнопку закрытия окна, если параметр global равен true, то кнопка закроет всю группу окон, а не только данное окно.
  • {type: "scale", x: число, y: число, direction: число, bitmap: "текстура", scale: число, invert: bool, overlay: "текстура", overlayScale: число, overlayOffset: {x: число, y: число}}
    
    - создает шкалу в направлении direction, value значение от 0 до 1 - заполненность шкалы(для тестов). Если invert задан и равен true, то позиция вырезки из текстуры будет инвертирована, что создаст видимость того, что шкала как бы выдвигается, а не заполняется.

    overlay - если задан, накладывает на шкалу дополнительную текстуру, которая перекрывает ее. overlayScale - параметр scale для перекрытия. overlayOffset: {x: , y: } - если задан, задает позицию перекрытия, относительно позиции шкалы.

    Направления:

    • 0 - право
    • 1 - верх
    • 2 - лево
    • 3 - низ
  • {type: "text", x: число, y: число, width: число, height: число, multiline: bool, format: bool, formatMaxCharsPerLine: число, text: "текст", font: шрифт_текста}
    
    - создает динамичный текст.
  • {type: "image", x: число, y: число, bitmap: "текстура", scale: число, overlay: "текстура", overlayScale: число, overlayOffset: {x: число, y: число}, clicker: объект функций клика}
    
    - создает динамичную картинку.
  • {type: "scroll", x: число, y: число, length: число, min: число, max: число, isInt: true, value: число}
    
    - создает динамичный слайдер с минимальным значением и максимальным, также текущим значением по умолчанию равное value.

Стилизация[править]

Кроме drawing и elements в объекте описания можно определить объект стилизации интерфейса для изменения стандартных текстур элементов.

Если какое-то из нижеприведённых значений будет указано в объекте стилизации, оно заменит стандартый параметр.

params: {
     slot: "текстура слота",
     invSlot: "текстура слота инвентаря",
     frame: "текстура обычной рамки",
     selection: "текстура выделения слота",
     closeButton: "текстура кнопки закрытия",
     closeButton2: "текстура нажатой кнопки закрытия",
}

Типы интерфейса[править]

Интерфейсы бывают 3 типов: Стандартный, Однооконный и Многооконный. Объект интерфейса во всех этих случаев создается как объект класса одного из типов, после создания такой объект класса может быть настроен и открыт для любого контейнера.

Любой интерфейс может быть протестирован с помощью функции UI.testUI(объект интерфейса);