Blame doc/ru/ui.html

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>