Читать первую часть: GUI. Часть 1. Общее представление.
Эта статья будет довольно сухая.
Только конкретная выжимка практической информации.
Я уже озвучивал, что делю GUI (далее диалог) на 3 составляющие.
Начнем с визуальной части.
Открываем редактор Арма 3. Ставим любого юнита, и нажимаем играть в одиночную игру.
Теперь нажимаем ESC, а затем кнопку «редактор«.
У нас открылся графический редактор, в котором мы можем нарисовать наш интерфейс.
Нажимаем правой кнопкой, и открывается список элементов.
Все эти элементы являются довольно примитивными.
Теперь выбираем IGUIBack. Это будет наш «бэкграунд». Нажимаем ОК.
У вас должен появиться маленький прямоугольник.

Нажимаем на него правой кнопкой, в открывшемся окошке, в самом низу в выпадающем меню выбираем absolute (абсолютный размер, не зависящий от соотношения сторон экрана).
Нажимаем ОК.

Теперь, зажав левую кнопку мыши на нашем новом объекте, перемещаем его в нужную область. Затем зажимаем alt и левой кнопкой мыши растягиваем его до нужных размеров.
Таким же образом создаем рамку (RscFrame), текст (RsctText) и кнопки (RscButton).
В итоге у меня получилось следующее:

На этом визуализация закончена, и мы можем переводить ее в код.
Начнем с файла defines.hpp
Создаем его в корне нашей миссии.
Далее в игре, там же, в редакторе, где мы создали наш первый интерфейс, нажимаем сочетание клавиш «ctrl+P«. Открываем файл defines.hpp и вставляем в него код (ctrl+V).
Этот файл отвечает за базовые классы элементов. Их цвет, рамку, фон, шрифт и тп.
Создаем файл с понятным нам названием и разрешением .hpp
Например dialog.hpp
Далее в игре, там же, в редакторе, где мы создали наш первый интерфейс, нажимаем сочетание клавиш «ctrl+shift+S«. (окошко закрыть)
Открываем файл dialog.hpp и вставляем в него код (ctrl+V).
Этот файл отвечает за то, какие элементы у нас будут в диалоге, их размер, расположение и тп.
Сейчас это просто список, который мы должны обернуть в класс диалога.
Вот пример моего диалога:
class dialog_1
{
idd = 5555;
class controls {
//выше создал кдасс диалога "dialog_1", задал идентификатор 5555, создал класс controls, в который уже поместил все контролы, созданные в редакторе Армы.
class IGUIBack_2200: IGUIBack
{
idc = 2200;
x = 0;
y = 0;
w = 0;
h = 0.8;
};
class IGUIBack_2201: IGUIBack
{
idc = 2201;
x = -1.0875;
y = 1.02;
w = 1.05;
h = 0.36;
colorText[] = {0,0,0,0.8};
};
class RscFrame_1800: RscFrame
{
idc = 1800;
x = -1.075;
y = 1.04;
w = 1.025;
h = 0.1;
colorText[] = {0,1,0,1};
};
class RscText_1000: RscText
{
idc = 1000;
text = "Хочешь перевооружиться?"; //здесь задаем текст
x = -1.0625;
y = 1.06;
w = 0.95;
h = 0.06;
};
class RscButton_1600: RscButton
{
text = "Да"; //здесь задаем текст
idc = 1600;
x = -1.075;
y = 1.18;
w = 1.025;
h = 0.06;
action = "execVM 'yes.sqf'"; //здесь действие при нажатии кнопки
};
class RscButton_1601: RscButton
{
text = "Нет"; //здесь задаем текст
idc = 1601;
x = -1.075;
y = 1.26;
w = 1.025;
h = 0.06;
action = "execVM 'no.sqf'"; //здесь действие при нажатии кнопки
};
//ниже добавил закрытие скобок
};
};
Заодно отредактировал текст, добавил строку «action» для кнопок.
На этом файл dialog.hpp готов, его можно закрывать.
Перейдем теперь к файлу defines.hpp.
Находим в нем class RscButton.
Этот класс содержит параметры наших кнопок. Вот мой код, с комментариями:
class RscButton
{
deletable = 0;
fade = 0;
access = 0;
type = 1;
text = "";
default = false; //добавил эту строку, для того, чтобы изначально кнопки не были выделены. По умолчанию true и первая кнопка выделена (мигает)
colorText[] =
{
1,
1,
1,
1
};
colorDisabled[] = //альфа канал в 0, чтобы текст отключенной кнопки не выделялся
{
0,
1,
0,
0
};
colorBackground[] = //альфа канал фона в 0
{
0,
1,
0,
0
};
colorBackgroundDisabled[] =
{
0,
0,
0,
0.5
};
colorBackgroundActive[] = //при наведение мышки на кнопку она выделяется цветом. В моем случае темно-зеленым
{
0,
0.3,
0,
1
};
colorFocused[] =
{
0,
1,
0,
0
};
colorShadow[] =
{
0,
0,
0,
0
};
colorBorder[] =
{
0,
0,
0,
0
};
soundEnter[] =
{
"\A3\ui_f\data\sound\RscButton\soundEnter",
0.09,
1
};
soundPush[] =
{
"\A3\ui_f\data\sound\RscButton\soundPush",
0.09,
1
};
soundClick[] =
{
"\A3\ui_f\data\sound\RscButton\soundClick",
0.09,
1
};
soundEscape[] =
{
"\A3\ui_f\data\sound\RscButton\soundEscape",
0.09,
1
};
idc = -1;
style = 0; //здесь 0, для выравнивания текста по левому краю
x = 0;
y = 0;
w = 0.095589;
h = 0.039216;
shadow = 2;
font = "RobotoCondensed";
sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
url = "";
offsetX = 0;
offsetY = 0;
offsetPressedX = 0;
offsetPressedY = 0;
borderSize = 0;
};
Изменений тут не много. Вы можете этого не делать, тут дело вкуса и необходимости в каждом конкретном случае.
Вот и все! Наш интерфейс готов. Теперь осталось написать скрипты.
Вот пример:
создаем бота добавляем ему action:
player addAction ["Открыть диалог",{
disableSerialization;
createDialog "dialog_1";
}];
Далее сам диалог.
В dialog.hpp я добавлял кнопкам action. Теперь, при нажатии кнопки «Да«, будет запускаться скрипт yes.sqf, а при нажатии «Нет» — no.sqf.
Теперь сами скрипты!
yes.sqf:
disableSerialization; _display = findDisplay 5555; //присваиваем наш диалог переменной _display _text = _display displayCtrl 1000; //присваиваем контрол с текстои переменной _text ctrlShow [1600,false]; //скрываем кнопку "Да" ctrlShow [1601,false]; //скрываем кнопку "Нет" ctrlEnable [1600,false]; //отключаем кнопку "Да" ctrlEnable [1601,false]; //отключаем кнопку "Нет" _text ctrlSetText "Перевооружайся."; //меняем текст uiSleep 2; closeDialog 5555; //выключаем диалог uiSleep 1; ["Open",true] spawn BIS_fnc_arsenal; //запускаем арсенал
no.sqf по аналогии с предыдущим скриптом:
disableSerialization; _display = findDisplay 5555; _text = _display displayCtrl 1000; ctrlShow [1600,false]; ctrlShow [1601,false]; ctrlEnable [1600,false]; ctrlEnable [1601,false]; _text ctrlSetText "Тогда счастливо!"; uiSleep 3; closeDialog 5555;
Теперь осталось подключить наш интерфейс. Для этого в description.ext пишем:
#include "defines.hpp" #include "dialog.hpp"
По сути, тут можно хоть диалоги с выбором ответов создавать.
НО! для этого есть более рациональный способ, который будет описан в расширенном курсе по GUI.
Демо миссия (от BETEP3526) — скачать.
Что-то не поняли? Заходите в наш Discord, там вам всегда помогут.