Содержание статьи
В октябре 2025 года вышла финальная версия игрового движка Ultra Engine (предыдущие пару лет он находился в раннем доступе). Но речь пойдет не о нем. Побочным продуктом его разработки стала библиотека визуальных компонентов Ultra App Kit, используемая в самом движке для построения пользовательского интерфейса.
Я давно слежу за разработкой этого движка и творчеством ее ведущего разработчика Джоша Клинта. Сначала библиотека стоила денег, но теперь игровую составляющую продали, а Ultra App Kit сделали бесплатной. Ultra Engine же, судя по инсайдерской информации, переименуют в Leadwerks 5.
Ultra App Kit — это простой в использовании SDK для создания новомодного интерфейса в темных тонах.
info
После того как Apple прекратила поддержку бинарного формата исполняемых файлов x86-64 в macOS, лаунчер SDK перестал запускаться, так что в данный момент фреймворк кросс‑платформенный не в полной мере. Однако SDK можно самостоятельно прикрутить к компилятору и все же использовать в новых версиях macOS на процессорах серии M.
Перед накатыванием SDK позаботься о том, чтобы у тебя был Visual Studio, — чтобы было на что накатывать. Я буду использовать версию 2022, но с тем же успехом можно взять Visual Studio 2019 или 2026, если тебя соблазнил Copilot.
Сама Ultra App Kit ставится из Steam (сказывается игровое прошлое). В Windows и macOS Catalina установщик автоматом прописывает пути компилятора к библиотекам и заголовочным файлам. Дальше работу SDK буду демонстрировать в Windows.

Создаем приложение на Ultra App Kit
После запуска установленной программы на экране появится окно лаунчера. На вкладке Projects ты можешь создать проект, открыть имеющийся или импортировать. На вкладке Learn можно получить доступ к документации на сайте разработчика.

info
Если вместо лаунчера ты видишь окно для ввода логина и пароля, проверь, не заблокирован ли каким‑либо образом доступ в интернет.
Создание проекта происходит обычно, надо лишь указать имя и расположение нового приложения.

После этого дополнительный пункт, связанный с созданным проектом, будет добавлен в список в окне лаунчера. Вместе с этим откроется окно проводника, в нем отобразится содержимое папки сгенерированного проекта, откуда в Visual Studio можно открыть файл решения.
Разбираем код типового приложения
Типичное приложение, не считая внешних зависимостей, состоит из двух файлов: main. и UltraEngine.. В последнем — лишь включение заголовочного файла UltraEngine.. Все действо разворачивается в первом. По своей структуре и принципам исполнения содержимое похоже на классическое приложение для Windows: в точке входа — функции wWinMain запускается бесконечный цикл для обработки поступающих от операционной системы сообщений.

Код Ultra App:
#include "UltraEngine.h"using namespace UltraEngine;int main(int argc, const char* argv[]){ // Получить от системы все подключенные мониторы auto displays = GetDisplays(); // Создание окна приложения auto window = CreateWindow("Ultra Engine", 0, 0, 800, 600, displays[0], WINDOW_TITLEBAR | WINDOW_RESIZABLE | WINDOW_CENTER); // Создать пользовательский интерфейс auto ui = CreateInterface(window); // Получить размер области для размещения виджетов auto sz = ui->root->GetSize(); // Создать виджет — вертикальный список auto listbox = CreateListBox(20, 20, sz.x - 40, sz.y - 40, ui->root); // Добавить первый элемент и сделать его активным listbox->AddItem("Item 1", true); // Добавить остальные пять элементов listbox->AddItem("Item 2"); listbox->AddItem("Item 3"); listbox->AddItem("Item 4"); listbox->AddItem("Item 5"); listbox->AddItem("Item 6"); // Закрепить края списка listbox->SetLayout(1,1,1,1); // Бесконечный цикл обработки событий while (true) { const Event ev = WaitEvent(); switch (ev.id) { // Событие вызывается при двойном нажатии case EVENT_WIDGETACTION: Print("Item " + String(ev.data) + " action"); break; // Событие вызывается при одиночном нажатии case EVENT_WIDGETSELECT: Print("Item " + String(ev.data) +" selected"); break; // Событие происходит при выходе из приложения case EVENT_QUIT: // Событие происходит при закрытии окна приложения case EVENT_WINDOWCLOSE: return 0; break; default: break; } } return 0;}
Код приложения очень прямолинейный: все элементы, составляющие окно, описываются (создаются) сверху вниз, а в конце крутится бесконечный цикл.
После запуска и инициализации приложения вызывается функция GetDisplays, которая возвращает вектор объектов класса Display. Объект этого класса предоставляет параметры монитора. К компьютеру в наше время их может быть подключено несколько.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
