|
Ivan Mahonin |
e9aada |
<html>
|
|
Ivan Mahonin |
e9aada |
<head>
|
|
Ivan Mahonin |
e9aada |
<meta charset="UTF-8" />
|
|
Ivan Mahonin |
e9aada |
<link rel="stylesheet" type="text/css" href="style.css" />
|
|
Ivan Mahonin |
e9aada |
<title>Пользовательский интерфейс - Helianthus</title>
|
|
Ivan Mahonin |
e9aada |
</head>
|
|
Ivan Mahonin |
e9aada |
<body>
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Helianthus
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Helianthus: Документация
|
|
Ivan Mahonin |
e9aada |
Установка
|
|
Ivan Mahonin |
e9aada |
Запуск и общие функции
|
|
Ivan Mahonin |
e9aada |
Клавиатура и мышь
|
|
Ivan Mahonin |
e9aada |
Рисование
|
|
Ivan Mahonin |
e9aada |
Шрифты и текст
|
|
Ivan Mahonin |
e9aada |
Текстуры и анимация
|
|
Ivan Mahonin |
e9aada |
Буфер кадра
|
|
Ivan Mahonin |
e9aada |
Спрайты
|
|
Ivan Mahonin |
e9aada |
Группы спрайтов
|
|
Ivan Mahonin |
e9aada |
Звук
|
|
Ivan Mahonin |
e9aada |
Пользовательский интерфейс
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Все функции
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Пользовательский интерфейс
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |

|
|
Ivan Mahonin |
e9aada |
Библиотека Helianthus позволяет вам легко создавать элементы пользовательского интерфейса, такие как кнопки, поля для ввода текста, выпадающие списки и многое другое.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Для этого в проект включена библиотека Nuklear UI. Данная библиотека предоставляет большой набор функции и нам здесь будет затруднительно описать их все. Поэтому отправляем вас на сайт Nukear чтобы ознакомиться со всей документацией из первых рук:
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
https://immediate-mode-ui.github.io/Nuklear/doc/index.html
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Здесь мы лишь дадим небольшой пример и опишем функции связывающие Nuklear с Helianthus. И вот пример простой программы:
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
#include <helianthus-nk.h> // обратите внимание на -nk.h
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
nk_heli hnk; // контекст Helianthus-Nuklear
|
|
Ivan Mahonin |
e9aada |
struct nk_context *nk; // контекст непосредственно Nuklear
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
void init() {
|
|
Ivan Mahonin |
e9aada |
nk_heli_init(&hnk, 12); // инициальзоровать Nuklear
|
|
Ivan Mahonin |
e9aada |
nk = &hnk.context; // получить контекст
|
|
Ivan Mahonin |
e9aada |
}
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
void draw() {
|
|
Ivan Mahonin |
e9aada |
// Создаём окно Nuklear и заполняем его кнопками
|
|
Ivan Mahonin |
e9aada |
if (nk_begin(nk, "My Window", nk_rect(10, 10, 200, 300),
|
|
Ivan Mahonin |
e9aada |
NK_WINDOW_BORDER|NK_WINDOW_TITLE|NK_WINDOW_MOVABLE))
|
|
Ivan Mahonin |
e9aada |
{
|
|
Ivan Mahonin |
e9aada |
// если окно создано и его видно, то продолжаем:
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
// создаём новую строку в интерфейсе
|
|
Ivan Mahonin |
e9aada |
nk_layout_row_dynamic(nk, 30, 1);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
// Добавляем кнопку в строку и, одновременно с этим,
|
|
Ivan Mahonin |
e9aada |
// проверяем нажата ли она.
|
|
Ivan Mahonin |
e9aada |
// Если нажата то печатаем текст в консоль
|
|
Ivan Mahonin |
e9aada |
if (nk_button_label(nk, "hello"))
|
|
Ivan Mahonin |
e9aada |
printf("hello\n");
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
// следующая строка
|
|
Ivan Mahonin |
e9aada |
nk_layout_row_dynamic(nk, 30, 1);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
// и следующая кнопка
|
|
Ivan Mahonin |
e9aada |
if (nk_button_label(nk, "world"))
|
|
Ivan Mahonin |
e9aada |
printf("world\n");
|
|
Ivan Mahonin |
e9aada |
}
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
// независимо от того было ли видно окно, нужно сообщить
|
|
Ivan Mahonin |
e9aada |
// Nuklear, что c этим окном мы работу закончили:
|
|
Ivan Mahonin |
e9aada |
nk_end(nk);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
// После того как все окна созданы и заполнены
|
|
Ivan Mahonin |
e9aada |
// нужно, чтобы Nuklear проанализировал нажатые
|
|
Ivan Mahonin |
e9aada |
// клавиши и движения мыши и в итоге нарисовал
|
|
Ivan Mahonin |
e9aada |
// сформированный нами интерфейс на экране.
|
|
Ivan Mahonin |
e9aada |
// Это делается одной командой:
|
|
Ivan Mahonin |
e9aada |
nk_heli_process(&hnk);
|
|
Ivan Mahonin |
e9aada |
}
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
void deinit() {
|
|
Ivan Mahonin |
e9aada |
nk_heli_deinit(&hnk); // завершить работу с Nuklear
|
|
Ivan Mahonin |
e9aada |
}
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
int main() {
|
|
Ivan Mahonin |
e9aada |
windowSetVariableFrameRate(); // для более плавной анимации
|
|
Ivan Mahonin |
e9aada |
windowSetInit(&init);
|
|
Ivan Mahonin |
e9aada |
windowSetDraw(&draw);
|
|
Ivan Mahonin |
e9aada |
windowSetDeinit(&deinit);
|
|
Ivan Mahonin |
e9aada |
windowRun();
|
|
Ivan Mahonin |
e9aada |
return 0;
|
|
Ivan Mahonin |
e9aada |
}
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Обратите внимание, что для работы с Nuklear вам нужно подключить файл <helianthus-hk.h> вместо обычного <helianthus.h>. Это сделано для того, чтобы у вас была возможность не загромождать пространство имён Си обширным набором функций Nuklear, тогда когда они вам не нужны.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Для работы с Nuklear вам нужно создать переменную типа nk_heli и инициализировать её с помощью функции nk_heli_init. И, соответственно, после завершения работы с Nuklear нужно ей деинициализировать, вызвав функцию nk_heli_deinit. Если одновременно с этим вы заканчиваете и работу всей программы, то деинициализировать переменную не обязательно. Вот в нашем примере как раз деинициальзацию можно было и не делать — она там только для примера...
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Структура nk_heli содержит в себе поле context — это указатель на контекст Nuklear, он нужен при обращении к любой фукнции Nuklear. Для удобства в нашем примере мы скопировали его в отдельную переменную.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Функция nk_begin открывает работу с новым окном Nuklear. После заполнения окна нужно обязательно вызвать nk_end. Нельзя оставлять nk_begin без пары (nk_end) — это может привести к ошибкам в работе программы (и обязательно приведёт). Подробнее об этих функциях вы можете почитать в документации на сайте Nuklear.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Функции семейства nk_layout_xxxxx управляют размещением элементов в окне. Мы использовали один из самых простых методов разметки — nk_layout_row_dynamic. Он создаёт новую строку элементов в окне качестве аргументов принимает высоту строки и количество элементов в ней. Точнее количество элементов которое будет в строке — изначально строка создаётся незаполненной. Подробнее о разметке смотрите в оригинальной документации Nuklear.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Функция nk_button_label создаёт кнопку и сразу же проверяет была ли она нажата. Это кажется странным, так как на этом этапе Nuklear толком не знает где должна находиться кнопка и к тому же ещё и не проанализированы движения мыши и нажатия клавиш. Дело в том, что Nuklear запоминает какие элементы интерфейса были созданы на предыдущем кадре, и, если порядок создания элементов не изменился, можно легко связать старые и новые элементы и вычислить, была ли кнопка нажата на предыдущем кадре. Так в общем Nuklear и работает. Если вам это не очень понятно — не волнуйтесь, Nuklear всё равно делает всю работу за вас, а для вас оставляет простой в использовании функционал. Подробнее про nk_button_xxxxx и другие элементы читайте в оригинальной документации Nuklear.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
После того как интерфейс сформирован и работа с окном завершена (nk_end) необходимо вызвать функцию nk_heli_process. Она проанализирует пользовательский ввод (мышь и клавиатуру) и затем нарисует интерфейс на экране. Как вы можете видеть функция делает сразу две операции: анализ ввода и рисование. Если вы хотите вы можете запустить их по отдельности используя функции nk_heli_input и nk_heli_draw, соответсвенно.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Некоторые элементы Nuklear работают с изображениями. Чтобы создать изображение для Nuklear используйте функцию nk_heli_image.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Также Helianthus включает в себя ещё две полезные функции: nk_color_from_heli и nk_color_to_heli. Они преобразуют цвет из формата Helianthus в формат Nuklear и наоборот.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Функции:
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
nk_bool nk_heli_init(nk_heli *n, double fontSize);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Инициализирует контекст Helianthus-Nuklear. Функция возвращает TRUE если инициализация прошла успешно. После успешной инициализации указатель на чистый контекст Nuklear можно получить из поля context структуры nk_heli (n->context). См. также nk_heli_deinit, nk_heli_process.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Параметры:
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
n — указатель на переменную типа nk_heli;
|
|
Ivan Mahonin |
e9aada |
fontSize — размер шрифта, который будет использоваться во всех элементах Nuklear.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
void nk_heli_deinit(nk_heli *n);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Деинициализирует ранее инициализированный контекст Helianthus-Nuklear. После этой операции все внутренние структуры Nuklear будут очищены и их память освобождена. Контекст больше нельзя использовать (но можно повторно инициализировать, см. nk_heli_init).
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
void nk_heli_input(nk_heli *n);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Данная функция анализирует нажатия клавиш и движения мыши и выполняет соответствующие действия в интерфейсе. См. также nk_heli_init, nk_heli_draw и nk_heli_process.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
void nk_heli_draw(nk_heli *n);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Рисует элементы интерфейса на экране. См. также nk_heli_init, nk_heli_input и nk_heli_process.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
void nk_heli_process(nk_heli *n);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Анализирует нажатия клавиш и движения мыши и рисует элементы интерфейса на экране. Данная функция вызывает последовательно nk_heli_input и nk_heli_draw, ничего от себя не добавляя. То есть вместо nk_heli_process вы можете вызвать указанные функции по отдельности самостоятельно, если вам это будет удобнее. См. также nk_heli_init, nk_heli_input и nk_heli_draw.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
struct nk_image nk_heli_image(Animation anim, int width, int height);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Функция преобразует указатель на анимацию в формат понятные Nuklear. Полученную в результате структуру можно свободно копировать в другие переменные (того же типа. естественно) и передавать в Nuklear там где требуется изображение.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Как либо удалять или деинициализировать структуру после завершения работы с ней не требуется. Однако нельзя удалять изначальную анимацию до тех пор пока она привязана к элементам Nuklear.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Функция принимает в качестве аргументов размеры изображения. Эти параметры указывают в каком размере следует рисовать картинку Nuklear. Они могут не совпадать с оригинальными размерами картинки, в этом случае картинка будет просто смасштабирована при рисовании до указанных здесь размеров.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
См. также nk_heli_init и createAnimation.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Параметры:
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
anim — указатель на анимацию;
|
|
Ivan Mahonin |
e9aada |
width — ширина изображения в пикселях;
|
|
Ivan Mahonin |
e9aada |
height — высота изображения в пикселях.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
unsigned int nk_color_to_heli(struct nk_color c);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Преобразует цвет из формата Nuklear в формат Helianthus. См. также nk_heli_init и nk_color_from_heli.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
struct nk_color nk_color_from_heli(unsigned int c);
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
Преобразует цвет из формата Helianthus в формат Nuklear. См. также nk_heli_init и nk_color_to_heli.
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
|
|
Ivan Mahonin |
e9aada |
</body>
|
|
Ivan Mahonin |
e9aada |
</html>
|