diff --git a/doc/helianthus-doc-ru.odt b/doc/helianthus-doc-ru.odt index 827d549..d55e0d7 100644 Binary files a/doc/helianthus-doc-ru.odt and b/doc/helianthus-doc-ru.odt differ diff --git a/doc/nuklear.png b/doc/nuklear.png new file mode 100644 index 0000000..6c2baed Binary files /dev/null and b/doc/nuklear.png differ diff --git a/doc/ru/animation.html b/doc/ru/animation.html index 8e72527..b3baff8 100644 --- a/doc/ru/animation.html +++ b/doc/ru/animation.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

diff --git a/doc/ru/common.html b/doc/ru/common.html index d4df932..49dc8a5 100644 --- a/doc/ru/common.html +++ b/doc/ru/common.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

@@ -63,10 +64,12 @@ int main() {

Изначально окно имеет фиксированный размер, который вы можете менять только из программы, командами указанными выше. Однако, вы можете это изменить и разрешить пользователю изменять размер окна, смотрите функцию windowSetResizable.

-

Окно программы непрерывно перерисовывается с частотой 24 кадра в секунду. Частоту перерисовки вы можете поменять при помощи функции windowSetFrameRate.

+

Окно программы непрерывно перерисовывается с частотой 24 кадра в секунду. Частоту перерисовки вы можете поменять при помощи функции windowSetFrameRate. Рекомендуем также ознакомиться с функцией windowSetVariableFrameRate.

Программа ведёт отсчёт времени и кадров с момента запуска вы можете получить значение этих счётчиков при помощи функций windowGetSeconds и windowGetFrameCount. Длительность одного кадра (длительность предыдущего отрисованного кадра) можно узнать вызвав функцию windowGetFrameTime.

+

Для получения доступа к буферу обмена (того самого с которым связаны клавиши Ctrl+C, Ctrl+V) используйте функции windowGetClipboardText и windowSetClipboardText.

+

Также Helianthus предоставляет некоторые общие функции которые не представлены в стандартном я зыке C:
- помощники в генерации случайных чисел (randomNumber, randomFloat);
- функция поворота вектора rotateVector;
@@ -229,6 +232,27 @@ void draw() {

Возвращает количество миллисекунд прошедшее с момента запуска программы (с момента вызова функции windowRun. Это время не зависит от частоты перерисовки кадров и мощности компьютера. См. также windowGetMonotonicSeconds.

+

const char* windowGetClipboardText();

+ +

Данная функция позволяет получить текст из системного буфера обмена. Это тот буфер в который помещается текст при нажатии Ctrl+C. См. также windowSetClipboardText.

+ +

void windowSetClipboardText(const char *text);

+ +

Функция помещает текст в системный буфер обмена. См. также windowSetClipboardTextEx и windowGetClipboardText.

+ +

Параметры:

+ +

text — текст, который будет скопирован в буфер.

+ +

void windowSetClipboardTextEx(const char *text, int len);

+ +

Точно так же как и windowSetClipboardText, данная функция помещает текст в системный буфер обмена. С той лишь разницей, что в данном случае в буфер помещается не весь текст, а только указанное количество его байтов. См. также windowSetClipboardText и windowGetClipboardText.

+ +

Параметры:

+ +

text — текст, который будет скопирован в буфер;
+len — количество байтов текста, которые необходимо скопировать.

+

int randomNumber(int min, int max);

Возвращает случайное целое число от min до max включительно. Используется стандартная функция rand() из <stdlib.h>.

diff --git a/doc/ru/drawing.html b/doc/ru/drawing.html index cbd6f89..7db992c 100644 --- a/doc/ru/drawing.html +++ b/doc/ru/drawing.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

diff --git a/doc/ru/font.html b/doc/ru/font.html index 99b49b1..e1e3633 100644 --- a/doc/ru/font.html +++ b/doc/ru/font.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

@@ -122,6 +123,12 @@

Создать разметку для заданного текста. Разметка определяет координаты и размер каждого символа текста. Разметка запоминает действующий на момент её создания шрифт (textFont) и выравнивание (textAlign), и, рисование данной разметки будет производиться только этим шрифтом. Однако, вы можете менять размер шрифта (textSize) и его цвет (stroke) непосредственно перед выводом данной разметки на экран. Вы можете узнать ширину (textLayoutGetWidth) и высоту (textLayoutGetHeight) текстового блока, а также выводить на экран весь текст (textLayoutDraw) или отдельные его части (textLayoutDrawSubstr) с применением разных способов заливки.

+

См. также createTextLayoutEx, createTextLayoutf, textLayoutDestroy.

+ +

TextLayout createTextLayoutEx(const char *text, int length);

+ +

Создать разметку для заданного текста, точно так же как и createTextLayout. Разница лишь в том, что данная функция создаёт разметку не для всего текста, а только для указанного количества его байтов.

+

См. также createTextLayoutf, textLayoutDestroy.

TextLayout createTextLayoutf(const char *format, ...);

diff --git a/doc/ru/framebuffer.html b/doc/ru/framebuffer.html index ca323a0..778ff00 100644 --- a/doc/ru/framebuffer.html +++ b/doc/ru/framebuffer.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

diff --git a/doc/ru/functions.html b/doc/ru/functions.html index 29cfa96..c0def16 100644 --- a/doc/ru/functions.html +++ b/doc/ru/functions.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

@@ -49,6 +50,9 @@ windowGetSeconds
windowGetMonotonicSeconds
windowGetMonotonicMilliseconds
+windowGetClipboardText
+windowSetClipboardText
+windowSetClipboardTextEx
randomNumber
randomFloat
rotateVector
@@ -70,6 +74,10 @@ keyDown
keyWentDown
keyWentUp
+textInputBegin
+textInputEnd
+textInputGet
+textInputClear
mouseDown
mouseWentDown
mouseWentUp
@@ -156,6 +164,7 @@ textFont
textFontDefault
createTextLayout
+createTextLayoutEx
createTextLayoutf
textLayoutDestroy
textLayoutDraw
@@ -404,6 +413,15 @@ soundClone
soundPlay
soundStop
+

Пользовательский интерфейс

+nk_heli_init
+nk_heli_deinit
+nk_heli_input
+nk_heli_draw
+nk_heli_process
+nk_heli_image
+nk_color_to_heli
+nk_color_from_heli
diff --git a/doc/ru/groups.html b/doc/ru/groups.html index 1e43bab..05f46ae 100644 --- a/doc/ru/groups.html +++ b/doc/ru/groups.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

diff --git a/doc/ru/image/figure6.png b/doc/ru/image/figure6.png new file mode 100644 index 0000000..de33a92 Binary files /dev/null and b/doc/ru/image/figure6.png differ diff --git a/doc/ru/index.html b/doc/ru/index.html index ceb90ed..46eda88 100644 --- a/doc/ru/index.html +++ b/doc/ru/index.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

diff --git a/doc/ru/input.html b/doc/ru/input.html index b700c71..d86c735 100644 --- a/doc/ru/input.html +++ b/doc/ru/input.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

@@ -56,6 +57,8 @@ void draw() { +

Если вам нужно не просто узнать названия нажатых клавиш, но и определить какой они образуют текст, то воспользуйтесь набором функций textInputBegin, textInputGet, textInputClear и textInputEnd.

+

Функции:

int keyDown(const char *code);

@@ -84,6 +87,22 @@ void draw() {

code — текстовое наименование клавиши.

+

void textInputBegin();

+ +

Включить режим ввода текста. С момента запуска этой функции Helianthus будет запоминать все нажатые клавиши и формировать из них текст. См. также: textInputGet и textInputEnd.

+ +

void textInputEnd();

+ +

Отключить режим ввода текста и прекратить записывать вводимый пользователем текст. Раннее введённый текст останется в памяти и всё ещё будет доступен через функцию textInputGet. См. также: textInputBegin.

+ +

const char* textInputGet();

+ +

Получить введённый с клавиатуры текст. Вводимый текст накапливается с момента вызова функции textInputBegin. Функция textInputEnd останавливает запись текста, но при этом ранее накопленные символы остаются в памяти. Чтобы их стереть и начать копить текст заново используйте функцию textInputClear.

+ +

void textInputClear();

+ +

Очистить буфер вводимого с клавиатуры текста. См. также: textInputBegin и textInputGet.

+

int mouseDown(const char *code);

Функция возвращает TRUE (число 1) если указанная кнопка мыши в нажата (и удерживается) в данный момент и FALSE (число 0) если кнопка отпущена.

diff --git a/doc/ru/install.html b/doc/ru/install.html index aa5b78a..bdf13fc 100644 --- a/doc/ru/install.html +++ b/doc/ru/install.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

@@ -68,10 +69,10 @@ cc `pkg-config --cflags --libs helianthus` myprogram.c -o myprogram

Установка под Windows:

Для Windows вы можете скачать, распаковать и использовать скомпилированные файлы библиотеки:
-    https://coolbug.org/downloads/bw/helianthus/helianthus-bin-latest.zip

+    https://coolbug.org/downloads/bw/helianthus/helianthus-bin-latest.zip

В качестве компилятора используйте Mingw-w64:
-    https://mingw-w64.org

+    https://mingw-w64.org

Для компиляции вам необходимо указать путь к папке include/helianthus, например:

@@ -93,7 +94,7 @@ cc `pkg-config --cflags --libs helianthus` myprogram.c -o myprogram

Будьте внимательны здесь вам необходимо правильно указать путь к своей папке с файлами Helianthus, а также выбрать архитектуру (win32 или win64) для библиотеки.

-

В качестве среды разработки можете попробовать CodeBlocks (https://codeblocks.org). Возможно, это не самая лучшая среда разработки, но она позволяет быстро скомпилировать любой выбранный вами *.c файл без создания проекта. Выбирайте версию со встроенным Mingw-w64, тогда вам не придётся устанавливать его отдельно и настраивать под него CodeBlocks.

+

В качестве среды разработки можете попробовать CodeBlocks (https://codeblocks.org). Возможно, это не самая лучшая среда разработки, но она позволяет быстро скомпилировать любой выбранный вами *.c файл без создания проекта. Выбирайте версию со встроенным Mingw-w64, тогда вам не придётся устанавливать его отдельно и настраивать под него CodeBlocks.

Проверена работа с версией codeblocks-20.03mingw:
    http://sourceforge.net/projects/codeblocks/files/Binaries/20.03/Windows/codeblocks-20.03mingw-setup.exe

diff --git a/doc/ru/sound.html b/doc/ru/sound.html index 5a5fd0e..e6d043e 100644 --- a/doc/ru/sound.html +++ b/doc/ru/sound.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

diff --git a/doc/ru/sprites.html b/doc/ru/sprites.html index ba9cbd1..bfcade4 100644 --- a/doc/ru/sprites.html +++ b/doc/ru/sprites.html @@ -19,6 +19,7 @@

Спрайты

Группы спрайтов

Звук

+

Пользовательский интерфейс


Все функции

diff --git a/doc/ru/ui.html b/doc/ru/ui.html new file mode 100644 index 0000000..8f8c73c --- /dev/null +++ b/doc/ru/ui.html @@ -0,0 +1,173 @@ + + + + +Пользовательский интерфейс - Helianthus + + + +
+ +

Пользовательский интерфейс

+ + +

Библиотека Helianthus позволяет вам легко создавать элементы пользовательского интерфейса, такие как кнопки, поля для ввода текста, выпадающие списки и многое другое.

+ +

Для этого в проект включена библиотека Nuklear UI. Данная библиотека предоставляет большой набор функции и нам здесь будет затруднительно описать их все. Поэтому отправляем вас на сайт Nukear чтобы ознакомиться со всей документацией из первых рук:

+ +

https://immediate-mode-ui.github.io/Nuklear/doc/index.html

+ +

Здесь мы лишь дадим небольшой пример и опишем функции связывающие Nuklear с Helianthus. И вот пример простой программы:

+ +
+#include <helianthus-nk.h> // обратите внимание на -nk.h
+
+nk_heli hnk;           // контекст Helianthus-Nuklear
+struct nk_context *nk; // контекст непосредственно Nuklear
+
+void init() {
+    nk_heli_init(&hnk, 12); // инициальзоровать Nuklear
+    nk = &hnk.context;      // получить контекст
+}
+
+void draw() {
+    // Создаём окно Nuklear и заполняем его кнопками
+    if (nk_begin(nk, "My Window", nk_rect(10, 10, 200, 300),
+        NK_WINDOW_BORDER|NK_WINDOW_TITLE|NK_WINDOW_MOVABLE))
+    {
+        // если окно создано и его видно, то продолжаем:
+        
+        // создаём новую строку в интерфейсе
+        nk_layout_row_dynamic(nk, 30, 1);
+        
+        // Добавляем кнопку в строку и, одновременно с этим,
+        // проверяем нажата ли она.
+        // Если нажата то печатаем текст в консоль
+        if (nk_button_label(nk, "hello"))
+            printf("hello\n");
+        
+        // следующая строка
+        nk_layout_row_dynamic(nk, 30, 1);
+
+        // и следующая кнопка
+        if (nk_button_label(nk, "world"))
+            printf("world\n");
+    }
+
+    // независимо от того было ли видно окно, нужно сообщить
+    // Nuklear, что c этим окном мы работу закончили:
+    nk_end(nk);
+
+    // После того как все окна созданы и заполнены
+    // нужно, чтобы Nuklear проанализировал нажатые
+    // клавиши и движения мыши и в итоге нарисовал
+    // сформированный нами интерфейс на экране.
+    // Это делается одной командой:
+    nk_heli_process(&hnk);
+}
+
+void deinit() {
+    nk_heli_deinit(&hnk); // завершить работу с Nuklear
+}
+
+int main() {
+    windowSetVariableFrameRate(); // для более плавной анимации
+    windowSetInit(&init);
+    windowSetDraw(&draw);
+    windowSetDeinit(&deinit);
+    windowRun();
+    return 0;
+}
+
+ + +

Обратите внимание, что для работы с Nuklear вам нужно подключить файл <helianthus-hk.h> вместо обычного <helianthus.h>. Это сделано для того, чтобы у вас была возможность не загромождать пространство имён Си обширным набором функций Nuklear, тогда когда они вам не нужны.

+ +

Для работы с Nuklear вам нужно создать переменную типа nk_heli и инициализировать её с помощью функции nk_heli_init. И, соответственно, после завершения работы с Nuklear нужно ей деинициализировать, вызвав функцию nk_heli_deinit. Если одновременно с этим вы заканчиваете и работу всей программы, то деинициализировать переменную не обязательно. Вот в нашем примере как раз деинициальзацию можно было и не делать — она там только для примера...

+ +

Структура nk_heli содержит в себе поле context — это указатель на контекст Nuklear, он нужен при обращении к любой фукнции Nuklear. Для удобства в нашем примере мы скопировали его в отдельную переменную.

+ +

Функция nk_begin открывает работу с новым окном Nuklear. После заполнения окна нужно обязательно вызвать nk_end. Нельзя оставлять nk_begin без пары (nk_end) — это может привести к ошибкам в работе программы (и обязательно приведёт). Подробнее об этих функциях вы можете почитать в документации на сайте Nuklear.

+ +

Функции семейства nk_layout_xxxxx управляют размещением элементов в окне. Мы использовали один из самых простых методов разметки — nk_layout_row_dynamic. Он создаёт новую строку элементов в окне качестве аргументов принимает высоту строки и количество элементов в ней. Точнее количество элементов которое будет в строке — изначально строка создаётся незаполненной. Подробнее о разметке смотрите в оригинальной документации Nuklear.

+ +

Функция nk_button_label создаёт кнопку и сразу же проверяет была ли она нажата. Это кажется странным, так как на этом этапе Nuklear толком не знает где должна находиться кнопка и к тому же ещё и не проанализированы движения мыши и нажатия клавиш. Дело в том, что Nuklear запоминает какие элементы интерфейса были созданы на предыдущем кадре, и, если порядок создания элементов не изменился, можно легко связать старые и новые элементы и вычислить, была ли кнопка нажата на предыдущем кадре. Так в общем Nuklear и работает. Если вам это не очень понятно — не волнуйтесь, Nuklear всё равно делает всю работу за вас, а для вас оставляет простой в использовании функционал. Подробнее про nk_button_xxxxx и другие элементы читайте в оригинальной документации Nuklear.

+ +

После того как интерфейс сформирован и работа с окном завершена (nk_end) необходимо вызвать функцию nk_heli_process. Она проанализирует пользовательский ввод (мышь и клавиатуру) и затем нарисует интерфейс на экране. Как вы можете видеть функция делает сразу две операции: анализ ввода и рисование. Если вы хотите вы можете запустить их по отдельности используя функции nk_heli_input и nk_heli_draw, соответсвенно.

+ +

Некоторые элементы Nuklear работают с изображениями. Чтобы создать изображение для Nuklear используйте функцию nk_heli_image.

+ +

Также Helianthus включает в себя ещё две полезные функции: nk_color_from_heli и nk_color_to_heli. Они преобразуют цвет из формата Helianthus в формат Nuklear и наоборот.

+ +

Функции:

+ +

nk_bool nk_heli_init(nk_heli *n, double fontSize);

+ +

Инициализирует контекст Helianthus-Nuklear. Функция возвращает TRUE если инициализация прошла успешно. После успешной инициализации указатель на чистый контекст Nuklear можно получить из поля context структуры nk_heli (n->context). См. также nk_heli_deinit, nk_heli_process.

+ +

Параметры:

+ +

n — указатель на переменную типа nk_heli;
+fontSize — размер шрифта, который будет использоваться во всех элементах Nuklear.

+ +

void nk_heli_deinit(nk_heli *n);

+ +

Деинициализирует ранее инициализированный контекст Helianthus-Nuklear. После этой операции все внутренние структуры Nuklear будут очищены и их память освобождена. Контекст больше нельзя использовать (но можно повторно инициализировать, см. nk_heli_init).

+ +

void nk_heli_input(nk_heli *n);

+ +

Данная функция анализирует нажатия клавиш и движения мыши и выполняет соответствующие действия в интерфейсе. См. также nk_heli_init, nk_heli_draw и nk_heli_process.

+ +

void nk_heli_draw(nk_heli *n);

+ +

Рисует элементы интерфейса на экране. См. также nk_heli_init, nk_heli_input и nk_heli_process.

+ +

void nk_heli_process(nk_heli *n);

+ +

Анализирует нажатия клавиш и движения мыши и рисует элементы интерфейса на экране. Данная функция вызывает последовательно nk_heli_input и nk_heli_draw, ничего от себя не добавляя. То есть вместо nk_heli_process вы можете вызвать указанные функции по отдельности самостоятельно, если вам это будет удобнее. См. также nk_heli_init, nk_heli_input и nk_heli_draw.

+ +

struct nk_image nk_heli_image(Animation anim, int width, int height);

+ +

Функция преобразует указатель на анимацию в формат понятные Nuklear. Полученную в результате структуру можно свободно копировать в другие переменные (того же типа. естественно) и передавать в Nuklear там где требуется изображение.

+ +

Как либо удалять или деинициализировать структуру после завершения работы с ней не требуется. Однако нельзя удалять изначальную анимацию до тех пор пока она привязана к элементам Nuklear.

+ +

Функция принимает в качестве аргументов размеры изображения. Эти параметры указывают в каком размере следует рисовать картинку Nuklear. Они могут не совпадать с оригинальными размерами картинки, в этом случае картинка будет просто смасштабирована при рисовании до указанных здесь размеров.

+ +

См. также nk_heli_init и createAnimation.

+ +

Параметры:

+ +

anim — указатель на анимацию;
+width — ширина изображения в пикселях;
+height — высота изображения в пикселях.

+ +

unsigned int nk_color_to_heli(struct nk_color c);

+ +

Преобразует цвет из формата Nuklear в формат Helianthus. См. также nk_heli_init и nk_color_from_heli.

+ +

struct nk_color nk_color_from_heli(unsigned int c);

+ +

Преобразует цвет из формата Helianthus в формат Nuklear. См. также nk_heli_init и nk_color_to_heli.

+ + +
+ +