- Что делать если не работает imgui
- Информация ImGui сниппеты и частые вопросы
- Double Tap Inside
- Moon ImGui — Dear ImGui for MoonLoader
- GitHub — ocornut/imgui: Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
- Moon ImGui — Dear ImGui for MoonLoader
- GitHub — ocornut/imgui: Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
Что делать если не работает imgui
Решение распространенных проблем:
———————————————————————————————————————-
— Проверьте, что ваша GTA версии 1.0 US.
— Проверьте, что у вас стоит SAMP 0.3.7 (не SAMP 0.3.7-R2 или др).
— Установите DirectX и Microsoft Visual C++ (если их нет).
— Если у вас есть при загрузке игры заставка SAMPFUNCS, то скорее всего вам помогут пункты ниже.
Чтобы помочь разработчику лучше разобраться в проблеме, пишите сюда и прикрепляйте текстовый файл moonloader.log, который находится в GTA/moonloader.
———————————————————————————————————————-
Нет окна редактирования / Не работает AutoEdit:
Введите /autoedit. Перейдите в Настройки>Общие. Нажмите на кнопку «Установить для Advance RP» и сохраните. Готовые настройки AutoEdit: https://vk.com/topic-177496337_44195419
Проблемы с загрузкой / Не работает скрипт:
— Не устанавливайте GTA на системный диск (диск C).
— Если у вас есть АНТИСТИЛЛЕР или антивирус (защитник Windows и тд), временно отключите/удалить их.
— Уберите совместимость игры и прочее.
— Запустите клиент SAMP от имени администратора.
— Помните, что работа скрипта гарантируется на чистой GTA.
— Иногда помогает создание новой учетной записи администратора с запуском GTA на ней.
— Криво-установленная Windows. Если вы докажите, что в одном скрипте загрузка файлов работает, а в MM Editor не работает — пишите в сообщения группы.
Прыгаю, когда редактирую объявления, лекции и т.д./Крашит GTA при открытии окна:
— Удалите файлы imgui.lua и MoonImGui.dll в GTA/moonloader/lib (перед этим выйдите из игры). Скрипт их переустановит.
Во время редактирования объявлений не могу ввести текст (нажимаю на поле ввода, но оно сразу становится неактивным):
— Достаточно нажать 2 раза ESC (открыть меню игры и закрыть).
Бесконечная загрузка библиотек:
— Скорее всего вы используете старую версию скрипта. Скачайте установочник заново и установите.
или
— Установите скрипт сразу со всеми библиотеками.
Источник
Информация ImGui сниппеты и частые вопросы
Double Tap Inside
Известный
Описание
Тема создана с целью сбора удачных решений и ответов на частые вопросы по ImGui интерфейсу.
В шапке темы я постараюсь их красиво организовывать, чтобы искать необходимое было легче.
Оставляйте свои варианты решений ориентируясь на такой шаблон:
- Название
- Скриншот
- Описание
- Код
- Пример использования
Элементы интерфейса
Абстрактный пример использования
Абстрактный пример использования
Абстрактный пример использования
Абстрактный пример использования
Абстрактный пример использования
Абстрактный пример использования
Описание: заменяет цвет текста форматом RRGGBB(AA).
Вернуть цвет текста на стандартный (ImGuiCol_Text) —
Абстрактный пример использования
Источник
Moon ImGui — Dear ImGui for MoonLoader
Это ImGui — самый функциональный и одновременно самый простой GUI-фреймворк из всех, что мне известны.
И теперь каждый из вас сможет использовать его в своих Lua скриптах для MoonLoader.
GitHub — ocornut/imgui: Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
Это работает, но что-то не впечатляет, согласитесь. Окно изначально маленькое, показывается сразу при старте и его нельзя закрыть.
Сделаем его побольше, добавим активацию и какое-нибудь действие:
В коде была использована переменная типа ImBool — это один из новых типов, добавленных в Moon ImGui. Такой подход неизбежен, поскольку в луа невозможна передача базовых типов по ссылке. Это не единственное изменение, есть и другие, вам потребуется о них знать. Вот их полный список:
Разница между C++ API и Lua API
| Описание | В C++ | В Lua |
|---|---|---|
| Все функции из пространства имён ImGui, как и все типы, и все перечисления находятся в таблице, возвращаемой модулем | ImGui::Text(«text»); ImVec2(0.1f, 2.3f); | imgui.Text(«text»); imgui.ImVec2(0.1, 2.3); |
| Названия перечислений (enum) и их значений лишились префиксов и символа «_» в конце | ImGuiWindowFlags_NoTitleBar | imgui.WindowFlags.NoTitleBar |
| Значения базовых типов, которые в ImGui записываются по указателю, должны быть использованы через специальные типы: ImBool для bool, ImFloat для float, ImInt для int и unsigned int, ImFloat2-4 для float2, ImInt2-4 для int2 | static bool win = false; ImGui::Begin(«window», &win); win = false; | local win = imgui.ImBool(false) imgui.Begin(«window», win) win.v = false |
| Функции с переменным количеством аргументов для форматирования текста не поддерживают форматирование, используйте string.format | ImGui::Text(«hey, %s», name) | imgui.Text(string.format(‘hey, %s’, name)) |
| Функции InputText и InputTextMultiline принимают ImBuffer вместо char* buf + size_t buf_size | char buf[256]<>; ImGui::InputText(‘input’, buf, sizeof(buf)) | local buf = imgui.ImBuffer(256); imgui.InputText(‘input’, buf) |
| Динамические массивы в виде массива указателей + количество элементов заменены таблицами | const char* items[] = <"1", "2", "3">; ImGui::ListBox(«list», &lb_cur, items, 3) | imgui.ListBox(‘list’, lb_cur, <'1', '2', '3'>) |
| Функции с аргументами const char* str_start, const char* str_end, идущими подряд, принимают обычную строку | ImGui::TextUnformatted(some_str, some_str + 24) | imgui.TextUnformatted(some_str) |
| Все функции, принимающие калбэк + user_data, принимают ImCallback | void swszCb(ImGuiSizeConstraintCallbackData*) <>; ImGui::SetNextWindowSizeConstraints(size_min, size_max, &swszCb, (void*)&my_data) | local swszCb = imgui.ImCallback(function(data) end) imgui.SetNextWindowSizeConstraints(size_min, size_max, swszCb) |
| ImFont::CalcTextSizeA, ImFontAtlas::CustomRect::CalcCustomRectUV, ImFontAtlas::GetTexDataAsRGBA32, ImFontAtlas::GetTexDataAsAlpha8, ImFontAtlas::GlyphRangesBuilder::BuildRanges, ImGui::ColorConvertRGBtoHSV и ImGui::ColorConvertHSVtoRGB возвращают значения вместо изменения по ссылке | float r, g, b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); | local r, g, b = imgui.ColorConvertHSVtoRGB(h, s, v) |
| ImGuiIO::IniFilename и ImGuiIO::LogFilename принимают ImBuffer вместо указателя на строку | const char ini_path[] = «my/path.ini»; ImGui::GetIO().IniFilename = ini_path; | local ini_path = imgui.ImBuffer(‘my/path.ini’) imgui.GetIO().IniFilename = ini_path |
| Изменение ImGuiTextEditCallbackData::Buf автоматически обновляет длину и задаёт значение BufDirty | s.copy(data.Buf, data.BufSize); data.BufTextLen = s.length(); data.BufDirty = true; | data.Buf = ‘text’ |
Остальные изменения
- Добавлено несколько дополнительных функций
- ImColor::ToU32 — преобразование ImColor в целое
- ImGui::GetStyleColorU32 вместо ImGui::GetColorU32 для цвета стиля
- ImGui::PlotLinesEx вместо callback-варианта PlotLines
- ImGui::PlotHistogramEx вместо callback-варианта PlotHistogram
- ImDrawList::AddTextEx вместо AddText с дополнительными аргументами
- Отсутствуют функции
- Функции, принимающие и возвращающие void*-идентификаторы (например, PushID(void*) и GetID(void*))
- Функции с va_list-форматированием текста (например, TextV)
Теперь, зная всё это, вы уже можете начать работать с Moon ImGui. За списком функций ImGui и примерами на C++ обращайтесь на официальную страницу.
Но это ещё не всё. Вся работа с текстом в ImGui основана на UTF-8, т.е. текст не ограничен лишь стандартным набором символов. Но т.к. GTA, SAMP и MoonLoader не поддерживают юникод, кодировки необходимо конвертировать.
Работа с другими языками на примере русского
В MoonLoader v.025 были добавлены библиотеки lua-iconv и encoding, они призваны помочь в работе с разными кодировками текста.
Следующий пример показывает как использовать текст на русском в ImGui:
Скрипт должен быть сохранён в кодировке Windows-1251
Не так уж и сложно, верно? Текст, передаваемый ImGui — кодируем, текст, получаемый из ImGui — декодируем. Если в вашем скрипте много текста на русском для ImGui, но мало текста, выводимого через MoonLoader (в лог или чат SA:MP, к примеру), то можно сделать наоборот — сохранить скрипт в кодировке UTF-8 и не кодировать текст, передаваемый ImGui, а вместо этого кодировать текст при работе с функциями мунлоадера.
Остальные особенности
В Moon ImGui есть несколько дополнительных возможностей. В частности, они реализуют взаимодействие с игрой и управление интерфейсом.
На этом всё. Во вложениях есть пример с демонстрацией использования всех этих фич, рекомендую посмотреть код и пощупать его в игре. Вот скриншот:
Источник
Moon ImGui — Dear ImGui for MoonLoader
Это ImGui — самый функциональный и одновременно самый простой GUI-фреймворк из всех, что мне известны.
И теперь каждый из вас сможет использовать его в своих Lua скриптах для MoonLoader.
GitHub — ocornut/imgui: Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
Это работает, но что-то не впечатляет, согласитесь. Окно изначально маленькое, показывается сразу при старте и его нельзя закрыть.
Сделаем его побольше, добавим активацию и какое-нибудь действие:
В коде была использована переменная типа ImBool — это один из новых типов, добавленных в Moon ImGui. Такой подход неизбежен, поскольку в луа невозможна передача базовых типов по ссылке. Это не единственное изменение, есть и другие, вам потребуется о них знать. Вот их полный список:
Разница между C++ API и Lua API
| Описание | В C++ | В Lua |
|---|---|---|
| Все функции из пространства имён ImGui, как и все типы, и все перечисления находятся в таблице, возвращаемой модулем | ImGui::Text(«text»); ImVec2(0.1f, 2.3f); | imgui.Text(«text»); imgui.ImVec2(0.1, 2.3); |
| Названия перечислений (enum) и их значений лишились префиксов и символа «_» в конце | ImGuiWindowFlags_NoTitleBar | imgui.WindowFlags.NoTitleBar |
| Значения базовых типов, которые в ImGui записываются по указателю, должны быть использованы через специальные типы: ImBool для bool, ImFloat для float, ImInt для int и unsigned int, ImFloat2-4 для float3, ImInt2-4 для int4 | static bool win = false; ImGui::Begin(«window», &win); win = false; | local win = imgui.ImBool(false) imgui.Begin(«window», win) win.v = false |
| Функции с переменным количеством аргументов для форматирования текста не поддерживают форматирование, используйте string.format | ImGui::Text(«hey, %s», name) | imgui.Text(string.format(‘hey, %s’, name)) |
| Функции InputText и InputTextMultiline принимают ImBuffer вместо char* buf + size_t buf_size | char buf[256]<>; ImGui::InputText(‘input’, buf, sizeof(buf)) | local buf = imgui.ImBuffer(256); imgui.InputText(‘input’, buf) |
| Динамические массивы в виде массива указателей + количество элементов заменены таблицами | const char* items[] = <"1", "2", "3">; ImGui::ListBox(«list», &lb_cur, items, 3) | imgui.ListBox(‘list’, lb_cur, <'1', '2', '3'>) |
| Функции с аргументами const char* str_start, const char* str_end, идущими подряд, принимают обычную строку | ImGui::TextUnformatted(some_str, some_str + 24) | imgui.TextUnformatted(some_str) |
| Все функции, принимающие калбэк + user_data, принимают ImCallback | void swszCb(ImGuiSizeConstraintCallbackData*) <>; ImGui::SetNextWindowSizeConstraints(size_min, size_max, &swszCb, (void*)&my_data) | local swszCb = imgui.ImCallback(function(data) end) imgui.SetNextWindowSizeConstraints(size_min, size_max, swszCb) |
| ImFont::CalcTextSizeA, ImFontAtlas::CustomRect::CalcCustomRectUV, ImFontAtlas::GetTexDataAsRGBA32, ImFontAtlas::GetTexDataAsAlpha8, ImFontAtlas::GlyphRangesBuilder::BuildRanges, ImGui::ColorConvertRGBtoHSV и ImGui::ColorConvertHSVtoRGB возвращают значения вместо изменения по ссылке | float r, g, b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); | local r, g, b = imgui.ColorConvertHSVtoRGB(h, s, v) |
| ImGuiIO::IniFilename и ImGuiIO::LogFilename принимают ImBuffer вместо указателя на строку | const char ini_path[] = «my/path.ini»; ImGui::GetIO().IniFilename = ini_path; | local ini_path = imgui.ImBuffer(‘my/path.ini’) imgui.GetIO().IniFilename = ini_path |
| Изменение ImGuiTextEditCallbackData::Buf автоматически обновляет длину и задаёт значение BufDirty | s.copy(data.Buf, data.BufSize); data.BufTextLen = s.length(); data.BufDirty = true; | data.Buf = ‘text’ |
Остальные изменения
- Добавлено несколько дополнительных функций
- ImColor::ToU32 — преобразование ImColor в целое
- ImGui::GetStyleColorU32 вместо ImGui::GetColorU32 для цвета стиля
- ImGui::PlotLinesEx вместо callback-варианта PlotLines
- ImGui::PlotHistogramEx вместо callback-варианта PlotHistogram
- ImDrawList::AddTextEx вместо AddText с дополнительными аргументами
- Отсутствуют функции
- Функции, принимающие и возвращающие void*-идентификаторы (например, PushID(void*) и GetID(void*))
- Функции с va_list-форматированием текста (например, TextV)
Теперь, зная всё это, вы уже можете начать работать с Moon ImGui. За списком функций ImGui и примерами на C++ обращайтесь на официальную страницу.
Но это ещё не всё. Вся работа с текстом в ImGui основана на UTF-8, т.е. текст не ограничен лишь стандартным набором символов. Но т.к. GTA, SAMP и MoonLoader не поддерживают юникод, кодировки необходимо конвертировать.
Работа с другими языками на примере русского
В MoonLoader v.025 были добавлены библиотеки lua-iconv и encoding, они призваны помочь в работе с разными кодировками текста.
Следующий пример показывает как использовать текст на русском в ImGui:
Скрипт должен быть сохранён в кодировке Windows-1251
Не так уж и сложно, верно? Текст, передаваемый ImGui — кодируем, текст, получаемый из ImGui — декодируем. Если в вашем скрипте много текста на русском для ImGui, но мало текста, выводимого через MoonLoader (в лог или чат SA:MP, к примеру), то можно сделать наоборот — сохранить скрипт в кодировке UTF-8 и не кодировать текст, передаваемый ImGui, а вместо этого кодировать текст при работе с функциями мунлоадера.
Остальные особенности
В Moon ImGui есть несколько дополнительных возможностей. В частности, они реализуют взаимодействие с игрой и управление интерфейсом.
На этом всё. Во вложениях есть пример с демонстрацией использования всех этих фич, рекомендую посмотреть код и пощупать его в игре. Вот скриншот:
Источник