Moon ImGui — Dear ImGui for MoonLoader

29072770-aef614e2-7c7b-11e7-8861-212c2c416439.png


Это ImGui - самый функциональный и одновременно самый простой GUI-фреймворк из всех, что мне известны.
И теперь каждый из вас сможет использовать его в своих Lua скриптах для MoonLoader.

Представляю вам Moon ImGui - Lua биндинг ImGui для MoonLoader. Он включает все основные возможности фреймворка, а API максимально приближен к оригинальному по мере возможного.
Тут не будут подробно рассматриваться возможности и особенности ImGui, в этой теме будет рассказано и показано как использовать Moon ImGui в Lua. За информацией по самому ImGui сюда:

Начнём с самого элементарного:
Lua:
local imgui = require 'imgui' -- загружаем библиотеку

-- в этой функции осуществляется вся работа с ImGui
-- она вызывается каждый кадр, но только если imgui.Process равен true
function imgui.OnDrawFrame()
  imgui.Begin('My window') -- новое окно с заголовком 'My window'
  imgui.Text('Hello world') -- простой текст внутри этого окна
  imgui.End() -- конец окна
end

function main()
  imgui.Process = true -- ImGui будет обрабатываться, пока imgui.Process равен true
  -- в этом примере мы просто активируем ImGui сразу же после загрузки игры
end
Результат:
upload_2017-11-25_18-29-2.png


Это работает, но что-то не впечатляет, согласитесь. Окно изначально маленькое, показывается сразу при старте и его нельзя закрыть.
Сделаем его побольше, добавим активацию и какое-нибудь действие:
Lua:
local imgui = require 'imgui'
local key = require 'vkeys'

-- одно из основных отличий от оригинального апи
-- все переменные, значения которых записываются в ImGui по указателю, могут использоваться только через специальные типы
local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
  if main_window_state.v then -- чтение и запись значения такой переменной осуществляется через поле v (или Value)
    imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver) -- меняем размер
    -- но для передачи значения по указателю - обязательно напрямую
    -- тут main_window_state передаётся функции imgui.Begin, чтобы можно было отследить закрытие окна нажатием на крестик
    imgui.Begin('My window', main_window_state)
    imgui.Text('Hello world')
    if imgui.Button('Press me') then -- а вот и кнопка с действием
      -- условие будет выполнено при нажатии на неё
      printStringNow('Button pressed!', 1000)
    end
    imgui.End()
  end
end

function main()
  while true do
    wait(0)
    if wasKeyPressed(key.VK_X) then -- активация по нажатию клавиши X
        main_window_state.v = not main_window_state.v -- переключаем статус активности окна, не забываем про .v
    end
    imgui.Process = main_window_state.v -- теперь значение imgui.Process всегда будет задаваться в зависимости от активности основного окна
  end
end
Теперь окно выглядит так и его можно скрыть:
upload_2017-11-25_18-29-17.png


В коде была использована переменная типа 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_NoTitleBarimgui.WindowFlags.NoTitleBar
Значения базовых типов, которые в ImGui записываются по указателю, должны быть использованы через специальные типы: ImBool для bool, ImFloat для float, ImInt для int и unsigned int, ImFloat2-4 для float[2-4], ImInt2-4 для int[2-4]static bool win = false; ImGui::Begin("window", &win);
win = false;
local win = imgui.ImBool(false) imgui.Begin("window", win)
win.v = false
Функции с переменным количеством аргументов для форматирования текста не поддерживают форматирование, используйте string.formatImGui::Text("hey, %s", name)imgui.Text(string.format('hey, %s', name))
Функции InputText и InputTextMultiline принимают ImBuffer вместо char* buf + size_t buf_sizechar 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, принимают ImCallbackvoid 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 автоматически обновляет длину и задаёт значение BufDirtys.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
Lua:
local imgui = require 'imgui'
local encoding = require 'encoding' -- загружаем библиотеку
encoding.default = 'CP1251' -- указываем кодировку по умолчанию, она должна совпадать с кодировкой файла. CP1251 - это Windows-1251
u8 = encoding.UTF8 -- и создаём короткий псевдоним для кодировщика UTF-8

local test_text_buffer = imgui.ImBuffer(256)
function imgui.OnDrawFrame()
  imgui.Begin(u8'Основное окно') -- обратите внимание на u8 перед текстом, это и есть преобразование кодировки
  if imgui.InputText(u8'Вводить текст сюда', test_text_buffer) then -- условие будет срабатывать при изменении текста
    -- здесь первая строка передаётся по-обычному, без u8
    -- но введённый текст при выводе преобразуется обратно из UTF-8 в кодировку по умолчанию, т.е. в Windows-1251
    print('Введённый текст:', u8:decode(test_text_buffer.v)) -- при работе с ImBuffer тоже не забывайте о .v
  end
  imgui.Text(u8'Введённый текст: ' .. test_text_buffer.v) -- но тут обратное преобразование введённого текста не требуется, т.к. текст буфера и так в UTF-8
  imgui.Text(u8(string.format('Текущая дата: %s', os.date()))) -- u8 - это функция, её можно использовать и с неконстантными строками
  imgui.End()
end

function main()
  imgui.Process = true
end
Результат:
upload_2017-11-25_18-29-37.png


Не так уж и сложно, верно? Текст, передаваемый ImGui - кодируем, текст, получаемый из ImGui - декодируем. Если в вашем скрипте много текста на русском для ImGui, но мало текста, выводимого через MoonLoader (в лог или чат SA:MP, к примеру), то можно сделать наоборот - сохранить скрипт в кодировке UTF-8 и не кодировать текст, передаваемый ImGui, а вместо этого кодировать текст при работе с функциями мунлоадера.

Остальные особенности
В Moon ImGui есть несколько дополнительных возможностей. В частности, они реализуют взаимодействие с игрой и управление интерфейсом.
Код:
Параметры
imgui.BeforeDrawFrame = nil  -  опциональный калбэк. Если он задан, будет вызываться каждый кадр перед OnDrawFrame и NewFrame самого ImGui. Его можно использовать для загрузки шрифтов и текстур (будьте осторожны, он вызывается каждый кадр)
imgui.OnDrawFrame = nil  -  основной калбэк для рендера, о нём вы уже знаете
imgui.Process = false  -  только если задано true, имгуи будет обрабатываться и выводиться
imgui.RenderInMenu = false  -  показывать интерфейс в меню паузы, по умолчанию отключено
imgui.ShowCursor = true  -  показывать курсор, по умолчанию включен. Отключение может пригодиться, если нужно рисовать только какой-то оверлей без взаимодействия с ним
imgui.LockPlayer = false  -  отключить управление игроком, пока ImGui активен. Если не задано, то управление игроком будет отключаться только когда ImGui требуется обработать ввод с клавиатуры

Функции
после загрузки новых шрифтов и обязательно вне OnDrawFrame
function imgui.CreateTextureFromFile(path)  -  загрузить текстуру из файла. Возвращает загруженную текстуру или nil в случае неудачи
function imgui.CreateTextureFromMemory(address, size)  -  загрузить текстуру из изображения, хранящегося по указанному адресу в памяти. Возвращает загруженную текстуру или nil в случае неудачи
function imgui.GetTextureFromAddress(address)  -  получить ImGui-совместимую текстуру по адресу памяти
function imgui.ReleaseTexture(texture)  -  выгрузить текстуру, загруженную с помощью CreateTextureFromFile или CreateTextureFromMemory\
function imgui.RebuildFonts()  -  пересобрать внутреннюю текстуру шрифтов. Необходимо использовать
function imgui.SwitchContext()  -  переключить ImGui-контекст на принадлежащий скрипту. В BeforeDrawFrame и OnDrawFrame контекст переключается автоматически, так что в них эту функцию использовать нет нужды.

На этом всё. Во вложениях есть пример с демонстрацией использования всех этих фич, рекомендую посмотреть код и пощупать его в игре. Вот скриншот:

upload_2017-11-25_18-28-12.png

Полезные штуки для разработчиков
FontAwesome 4: https://blast.hk/threads/19292/post-168990
FontAwesome 5: https://blast.hk/threads/19292/post-335148
ImGui Pie: https://blast.hk/threads/19648/post-226145
Внутриигровая песочница: https://blast.hk/threads/19292/post-219453
ImGui Custom (хоткеи и ещё чет): https://blast.hk/threads/22080/
Global notification: https://blast.hk/threads/21619/
Стили:
https://blast.hk/threads/19292/post-260462

Ссылки
Скачать Moon ImGui (Download)
Установка:
распаковать содержимое архива в корневую папку игры.
Требуется MoonLoader v.026 или выше
Официальная страница ImGui
Пример на C++ с применением большинства возможностей (imgui_demo.cpp)
Все функции ImGui (imgui.h. Список поддерживаемых также есть в imgui.lua)
 

Вложения

  • moon imgui demo.lua
    9.2 KB · Просмотры: 122,295
Последнее редактирование:

AnWu

Известный
Всефорумный модератор
4,777
5,402
В этом коде какие-то траблы, САМПФУНКС говорит что функция не закрыта, но чота я не пойму где
Lua:
require 'lib.moonloader'
local imgui = require 'imgui'
local key = require 'vkeys'
local lib = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local toggle = false
local ImBool1 = imgui.ImBool(false)
local ImBool2 = imgui.ImBool(false)
local ImBool3 = imgui.ImBool(false)
local wind = imgui.ImBool(false)
local settings_window = imgui.ImBool(false)

function imgui.OnDrawFrame()
          imgui.ShowCursor = wind.v
  if wind.v then
        local sw, sh = getScreenResolution()
    if wind.v then
      imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) --положение
      imgui.SetNextWindowSize(imgui.ImVec2(596, 460), imgui.Cond.FirstUseEver)--размер
      imgui.Begin('DanielsHelper', wind)
        imgui.PushItemWidth(150)
        imgui.SetCursorPos(imgui.ImVec2(435, 25))
    end imgui.PopItemWidth()
       imgui.SetCursorPos (imgui.ImVec2(7, 85))
       imgui.BeginChild('##1', imgui.ImVec2(190, 180), true)
        local btn_size = imgui.ImVec2(-0.1, 0)
        imgui.Text(u8'Разное')
        imgui.Separator()
          if imgui.Button(u8'Приветствие в чате семьи', btn_size) then
              sampSendChat("/fam Привет!")
          end
          if imgui.Button(u8'Приветствие нового члена!', btn_size) then
              sampSendChat('/fam Добро пожаловать в гей клуб!')
          end
          if imgui.Button(u8'Поздравить с ДР', btn_size) then
             sampSendChat('/fam Поздравляю с ДР! Счастья, здоровья!')
          end
       imgui.EndChild()
       imgui.BeginChild('##2', imgui.Imvec2(190, 180), true)
       imgui.Text(u8'Разное')
       imgui.Separator()
          if imgui.Button(u8'Приветствие в чате семьи', btn_size) then
              sampSendChat("/fam Привет!")
          end
          if imgui.Button(u8'Приветствие нового члена!', btn_size) then
              sampSendChat('/fam Добро пожаловать в гей клуб!')
          end
          if imgui.Button(u8'Поздравить с ДР', btn_size) then
              sampSendChat('/fam Поздравляю с ДР! Счастья, здоровья!')
       imgui.EndChild()
      imgui.End()
  end
end

function main()
  while true do
    wait(0)
    if wasKeyPressed(key.VK_X) then -- активация
        wind.v = not wind.v
    end
    imgui.Process = wind.v
  end
end

function apply_custom_style()

imgui.SwitchContext()
local style = imgui.GetStyle()
local colors = style.Colors
local clr = imgui.Col
local ImVec4 = imgui.ImVec4

colors[clr.Text]   = ImVec4(0.00, 0.00, 0.00, 0.51)
colors[clr.TextDisabled]   = ImVec4(0.24, 0.24, 0.24, 1.00)
colors[clr.WindowBg]              = ImVec4(1.00, 1.00, 1.00, 1.00)
colors[clr.ChildWindowBg]         = ImVec4(0.96, 0.96, 0.96, 1.00)
colors[clr.PopupBg]               = ImVec4(0.92, 0.92, 0.92, 1.00)
colors[clr.Border]                = ImVec4(0.86, 0.86, 0.86, 1.00)
colors[clr.BorderShadow]          = ImVec4(0.00, 0.00, 0.00, 0.00)
colors[clr.FrameBg]               = ImVec4(0.88, 0.88, 0.88, 1.00)
colors[clr.FrameBgHovered]        = ImVec4(0.82, 0.82, 0.82, 1.00)
colors[clr.FrameBgActive]         = ImVec4(0.76, 0.76, 0.76, 1.00)
colors[clr.TitleBg]               = ImVec4(0.00, 0.45, 1.00, 0.82)
colors[clr.TitleBgCollapsed]      = ImVec4(0.00, 0.45, 1.00, 0.82)
colors[clr.TitleBgActive]         = ImVec4(0.00, 0.45, 1.00, 0.82)
colors[clr.MenuBarBg]             = ImVec4(0.00, 0.37, 0.78, 1.00)
colors[clr.ScrollbarBg]           = ImVec4(0.00, 0.00, 0.00, 0.00)
colors[clr.ScrollbarGrab]         = ImVec4(0.00, 0.35, 1.00, 0.78)
colors[clr.ScrollbarGrabHovered]  = ImVec4(0.00, 0.33, 1.00, 0.84)
colors[clr.ScrollbarGrabActive]   = ImVec4(0.00, 0.31, 1.00, 0.88)
colors[clr.ComboBg]               = ImVec4(0.92, 0.92, 0.92, 1.00)
colors[clr.CheckMark]             = ImVec4(0.00, 0.49, 1.00, 0.59)
colors[clr.SliderGrab]            = ImVec4(0.00, 0.49, 1.00, 0.59)
colors[clr.SliderGrabActive]      = ImVec4(0.00, 0.39, 1.00, 0.71)
colors[clr.Button]                = ImVec4(0.00, 0.49, 1.00, 0.59)
colors[clr.ButtonHovered]         = ImVec4(0.00, 0.49, 1.00, 0.71)
colors[clr.ButtonActive]          = ImVec4(0.00, 0.49, 1.00, 0.78)
colors[clr.Header]                = ImVec4(0.00, 0.49, 1.00, 0.78)
colors[clr.HeaderHovered]         = ImVec4(0.00, 0.49, 1.00, 0.71)
colors[clr.HeaderActive]          = ImVec4(0.00, 0.49, 1.00, 0.78)
colors[clr.ResizeGrip]            = ImVec4(0.00, 0.39, 1.00, 0.59)
colors[clr.ResizeGripHovered]     = ImVec4(0.00, 0.27, 1.00, 0.59)
colors[clr.ResizeGripActive]      = ImVec4(0.00, 0.25, 1.00, 0.63)
colors[clr.CloseButton]           = ImVec4(0.00, 0.35, 0.96, 0.71)
colors[clr.CloseButtonHovered]    = ImVec4(0.00, 0.31, 0.88, 0.69)
colors[clr.CloseButtonActive]     = ImVec4(0.00, 0.25, 0.88, 0.67)
colors[clr.PlotLines]             = ImVec4(0.00, 0.39, 1.00, 0.75)
colors[clr.PlotLinesHovered]      = ImVec4(0.00, 0.39, 1.00, 0.75)
colors[clr.PlotHistogram]         = ImVec4(0.00, 0.39, 1.00, 0.75)
colors[clr.PlotHistogramHovered]  = ImVec4(0.00, 0.35, 0.92, 0.78)
colors[clr.TextSelectedBg]        = ImVec4(0.00, 0.47, 1.00, 0.59)
colors[clr.ModalWindowDarkening]  = ImVec4(0.20, 0.20, 0.20, 0.35)
в конце нет end
 
  • Нравится
Реакции: JLCUHA

JLCUHA

Участник
28
7
Ставил, всё равно не работает
САМПФУНКС -
[ML] (error) Daniel's Helper.lua: I:\Awesome GTA by Dapo Show\moonloader\Daniel's Helper.lua:115: 'end' expected (to close 'function' at line 16) near '<eof>'
[ML] (error) Daniel's Helper.lua: Script died due to an error. (085027EC)
Lua:
require 'lib.moonloader'
local imgui = require 'imgui'
local key = require 'vkeys'
local lib = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local toggle = false
local ImBool1 = imgui.ImBool(false)
local ImBool2 = imgui.ImBool(false)
local ImBool3 = imgui.ImBool(false)
local wind = imgui.ImBool(false)
local settings_window = imgui.ImBool(false)

function imgui.OnDrawFrame()
          imgui.ShowCursor = wind.v
  if wind.v then
        local sw, sh = getScreenResolution()
    if wind.v then
      imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) --положение основного окна
      imgui.SetNextWindowSize(imgui.ImVec2(596, 460), imgui.Cond.FirstUseEver)--размер основного окна
      imgui.Begin('DanielsHelper', wind)
        imgui.PushItemWidth(150)
        imgui.SetCursorPos(imgui.ImVec2(435, 25))
    end imgui.PopItemWidth()
       imgui.SetCursorPos (imgui.ImVec2(7, 85))
       imgui.BeginChild('##1', imgui.ImVec2(190, 180), true)
        local btn_size = imgui.ImVec2(-0.1, 0)
        imgui.Text(u8'Разное')
        imgui.Separator()
          if imgui.Button(u8'Приветствие в чате семьи', btn_size) then
              sampSendChat("/fam Привет!")
          end
          if imgui.Button(u8'Приветствие нового члена!', btn_size) then
              sampSendChat('/fam Добро пожаловать в гей клуб!')
          end
          if imgui.Button(u8'Поздравить с ДР', btn_size) then
             sampSendChat('/fam Поздравляю с ДР! Счастья, здоровья!')
          end
       imgui.EndChild()
       imgui.BeginChild('##2', imgui.Imvec2(190, 180), true)
       imgui.Text(u8'Разное')
       imgui.Separator()
          if imgui.Button(u8'Приветствие в чате семьи', btn_size) then
              sampSendChat("/fam Привет!")
          end
          if imgui.Button(u8'Приветствие нового члена!', btn_size) then
              sampSendChat('/fam Добро пожаловать в гей клуб!')
          end
          if imgui.Button(u8'Поздравить с ДР', btn_size) then
              sampSendChat('/fam Поздравляю с ДР! Счастья, здоровья!')
       imgui.EndChild()
      imgui.End()
  end
end
function main()
  while true do
    wait(0)
    if wasKeyPressed(key.VK_X) then -- активация
        wind.v = not wind.v
    end
    imgui.Process = wind.v
  end
end

function apply_custom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    colors[clr.Text]   = ImVec4(0.00, 0.00, 0.00, 0.51)
    colors[clr.TextDisabled]   = ImVec4(0.24, 0.24, 0.24, 1.00)
    colors[clr.WindowBg]              = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.ChildWindowBg]         = ImVec4(0.96, 0.96, 0.96, 1.00)
    colors[clr.PopupBg]               = ImVec4(0.92, 0.92, 0.92, 1.00)
    colors[clr.Border]                = ImVec4(0.86, 0.86, 0.86, 1.00)
    colors[clr.BorderShadow]          = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.FrameBg]               = ImVec4(0.88, 0.88, 0.88, 1.00)
    colors[clr.FrameBgHovered]        = ImVec4(0.82, 0.82, 0.82, 1.00)
    colors[clr.FrameBgActive]         = ImVec4(0.76, 0.76, 0.76, 1.00)
    colors[clr.TitleBg]               = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.TitleBgCollapsed]      = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.TitleBgActive]         = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.MenuBarBg]             = ImVec4(0.00, 0.37, 0.78, 1.00)
    colors[clr.ScrollbarBg]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.ScrollbarGrab]         = ImVec4(0.00, 0.35, 1.00, 0.78)
    colors[clr.ScrollbarGrabHovered]  = ImVec4(0.00, 0.33, 1.00, 0.84)
    colors[clr.ScrollbarGrabActive]   = ImVec4(0.00, 0.31, 1.00, 0.88)
    colors[clr.ComboBg]               = ImVec4(0.92, 0.92, 0.92, 1.00)
    colors[clr.CheckMark]             = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.SliderGrab]            = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.SliderGrabActive]      = ImVec4(0.00, 0.39, 1.00, 0.71)
    colors[clr.Button]                = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.ButtonHovered]         = ImVec4(0.00, 0.49, 1.00, 0.71)
    colors[clr.ButtonActive]          = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.Header]                = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.HeaderHovered]         = ImVec4(0.00, 0.49, 1.00, 0.71)
    colors[clr.HeaderActive]          = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.ResizeGrip]            = ImVec4(0.00, 0.39, 1.00, 0.59)
    colors[clr.ResizeGripHovered]     = ImVec4(0.00, 0.27, 1.00, 0.59)
    colors[clr.ResizeGripActive]      = ImVec4(0.00, 0.25, 1.00, 0.63)
    colors[clr.CloseButton]           = ImVec4(0.00, 0.35, 0.96, 0.71)
    colors[clr.CloseButtonHovered]    = ImVec4(0.00, 0.31, 0.88, 0.69)
    colors[clr.CloseButtonActive]     = ImVec4(0.00, 0.25, 0.88, 0.67)
    colors[clr.PlotLines]             = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotLinesHovered]      = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotHistogram]         = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotHistogramHovered]  = ImVec4(0.00, 0.35, 0.92, 0.78)
    colors[clr.TextSelectedBg]        = ImVec4(0.00, 0.47, 1.00, 0.59)
    colors[clr.ModalWindowDarkening]  = ImVec4(0.20, 0.20, 0.20, 0.35)
end
 
Последнее редактирование:

BARRY BRADLEY

Известный
711
176
Ставил, всё равно не работает
САМПФУНКС -
[ML] (error) Daniel's Helper.lua: I:\Awesome GTA by Dapo Show\moonloader\Daniel's Helper.lua:115: 'end' expected (to close 'function' at line 16) near '<eof>'
[ML] (error) Daniel's Helper.lua: Script died due to an error. (085027EC)
Lua:
require 'lib.moonloader'
local imgui = require 'imgui'
local key = require 'vkeys'
local lib = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local toggle = false
local ImBool1 = imgui.ImBool(false)
local ImBool2 = imgui.ImBool(false)
local ImBool3 = imgui.ImBool(false)
local wind = imgui.ImBool(false)
local settings_window = imgui.ImBool(false)

function imgui.OnDrawFrame()
          imgui.ShowCursor = wind.v
  if wind.v then
        local sw, sh = getScreenResolution()
    if wind.v then
      imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) --положение основного окна
      imgui.SetNextWindowSize(imgui.ImVec2(596, 460), imgui.Cond.FirstUseEver)--размер основного окна
      imgui.Begin('DanielsHelper', wind)
        imgui.PushItemWidth(150)
        imgui.SetCursorPos(imgui.ImVec2(435, 25))
    end imgui.PopItemWidth()
       imgui.SetCursorPos (imgui.ImVec2(7, 85))
       imgui.BeginChild('##1', imgui.ImVec2(190, 180), true)
        local btn_size = imgui.ImVec2(-0.1, 0)
        imgui.Text(u8'Разное')
        imgui.Separator()
          if imgui.Button(u8'Приветствие в чате семьи', btn_size) then
              sampSendChat("/fam Привет!")
          end
          if imgui.Button(u8'Приветствие нового члена!', btn_size) then
              sampSendChat('/fam Добро пожаловать в гей клуб!')
          end
          if imgui.Button(u8'Поздравить с ДР', btn_size) then
             sampSendChat('/fam Поздравляю с ДР! Счастья, здоровья!')
          end
       imgui.EndChild()
       imgui.BeginChild('##2', imgui.Imvec2(190, 180), true)
       imgui.Text(u8'Разное')
       imgui.Separator()
          if imgui.Button(u8'Приветствие в чате семьи', btn_size) then
              sampSendChat("/fam Привет!")
          end
          if imgui.Button(u8'Приветствие нового члена!', btn_size) then
              sampSendChat('/fam Добро пожаловать в гей клуб!')
          end
          if imgui.Button(u8'Поздравить с ДР', btn_size) then
              sampSendChat('/fam Поздравляю с ДР! Счастья, здоровья!')
       imgui.EndChild()
      imgui.End()
  end
end
function main()
  while true do
    wait(0)
    if wasKeyPressed(key.VK_X) then -- активация
        wind.v = not wind.v
    end
    imgui.Process = wind.v
  end
end

function apply_custom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    colors[clr.Text]   = ImVec4(0.00, 0.00, 0.00, 0.51)
    colors[clr.TextDisabled]   = ImVec4(0.24, 0.24, 0.24, 1.00)
    colors[clr.WindowBg]              = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.ChildWindowBg]         = ImVec4(0.96, 0.96, 0.96, 1.00)
    colors[clr.PopupBg]               = ImVec4(0.92, 0.92, 0.92, 1.00)
    colors[clr.Border]                = ImVec4(0.86, 0.86, 0.86, 1.00)
    colors[clr.BorderShadow]          = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.FrameBg]               = ImVec4(0.88, 0.88, 0.88, 1.00)
    colors[clr.FrameBgHovered]        = ImVec4(0.82, 0.82, 0.82, 1.00)
    colors[clr.FrameBgActive]         = ImVec4(0.76, 0.76, 0.76, 1.00)
    colors[clr.TitleBg]               = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.TitleBgCollapsed]      = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.TitleBgActive]         = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.MenuBarBg]             = ImVec4(0.00, 0.37, 0.78, 1.00)
    colors[clr.ScrollbarBg]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.ScrollbarGrab]         = ImVec4(0.00, 0.35, 1.00, 0.78)
    colors[clr.ScrollbarGrabHovered]  = ImVec4(0.00, 0.33, 1.00, 0.84)
    colors[clr.ScrollbarGrabActive]   = ImVec4(0.00, 0.31, 1.00, 0.88)
    colors[clr.ComboBg]               = ImVec4(0.92, 0.92, 0.92, 1.00)
    colors[clr.CheckMark]             = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.SliderGrab]            = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.SliderGrabActive]      = ImVec4(0.00, 0.39, 1.00, 0.71)
    colors[clr.Button]                = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.ButtonHovered]         = ImVec4(0.00, 0.49, 1.00, 0.71)
    colors[clr.ButtonActive]          = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.Header]                = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.HeaderHovered]         = ImVec4(0.00, 0.49, 1.00, 0.71)
    colors[clr.HeaderActive]          = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.ResizeGrip]            = ImVec4(0.00, 0.39, 1.00, 0.59)
    colors[clr.ResizeGripHovered]     = ImVec4(0.00, 0.27, 1.00, 0.59)
    colors[clr.ResizeGripActive]      = ImVec4(0.00, 0.25, 1.00, 0.63)
    colors[clr.CloseButton]           = ImVec4(0.00, 0.35, 0.96, 0.71)
    colors[clr.CloseButtonHovered]    = ImVec4(0.00, 0.31, 0.88, 0.69)
    colors[clr.CloseButtonActive]     = ImVec4(0.00, 0.25, 0.88, 0.67)
    colors[clr.PlotLines]             = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotLinesHovered]      = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotHistogram]         = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotHistogramHovered]  = ImVec4(0.00, 0.35, 0.92, 0.78)
    colors[clr.TextSelectedBg]        = ImVec4(0.00, 0.47, 1.00, 0.59)
    colors[clr.ModalWindowDarkening]  = ImVec4(0.20, 0.20, 0.20, 0.35)
end
В 115 строку добавь
Код:
apply_custom_style()
ибо у тебя стиль не подключен.
После 52 строки нету end, условие со строки 51 не закрыто, а так же убери 18 строку ибо ты используешь 2 одинаковых условия, одно с которых не закрыто.
 
  • Нравится
Реакции: JLCUHA

JLCUHA

Участник
28
7
Есть код -
Код:
require 'lib.moonloader'
local imgui = require 'imgui'
local key = require 'vkeys'
local lib = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local toggle = false
local ImBool1 = imgui.ImBool(false)
local ImBool2 = imgui.ImBool(false)
local ImBool3 = imgui.ImBool(false)
local wind = imgui.ImBool(false)
local settings_window = imgui.ImBool(false)

function imgui.OnDrawFrame()
      imgui.ShowCursor = wind.v
        local sw, sh = getScreenResolution()
    if wind.v then
      imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) --положение основного окна
      imgui.SetNextWindowSize(imgui.ImVec2(596, 460), imgui.Cond.FirstUseEver)--размер основного окна
      imgui.Begin('DanielsHelper', wind)
        imgui.PushItemWidth(150)
        imgui.SetCursorPos(imgui.ImVec2(435, 25))
    end imgui.PopItemWidth()
       imgui.SetCursorPos (imgui.ImVec2(7, 85))
       imgui.BeginChild('##1', imgui.ImVec2(190, 180), true)
        local btn_size = imgui.ImVec2(-0.1, 0)
        imgui.Text(u8'Разное')
        imgui.Separator()
          if imgui.Button(u8'Приветствие в чате семьи', btn_size) then
              sampSendChat("/fam Привет!")
          end
          if imgui.Button(u8'Приветствие нового члена!', btn_size) then
              sampSendChat('/fam Добро пожаловать в гей клуб!')
          end
          if imgui.Button(u8'Поздравить с ДР', btn_size) then
             sampSendChat('/fam Поздравляю с ДР! Счастья, здоровья!')
          end
       imgui.EndChild()
       imgui.BeginChild('##2', imgui.ImVec2(190, 180), true)
       imgui.Text(u8'Разное')
       imgui.Separator()
          if imgui.Button(u8'Броня', btn_size) then
              sampSendChat("/armour")
          end
          if imgui.Button(u8'Маска', btn_size) then
              sampSendChat('/mask')
          end
          if imgui.Button(u8'Телефон', btn_size) then
              sampSendChat('/phone')
          end
          if imgui.Button(u8'Статистика', btn_size) then
              sampSendChat('/stats')
          end
        imgui.EndChild()
------------------------------

        imgui.SameLine()

--2 блок
------------------------------
        imgui.BeginChild('##3', imgui.ImVec2(190, 180), true)
        imgui.Text(u8'Тест')
        imgui.Separator()
          if imgui.Button(u8'Покушать', btn_size) then
              sampSendChat("/eat")
              if sampIsDialogActive() then
                  sampSendDialogResponse(9965,1,0,"")
              end
          end
          if imgui.Button(u8'Маска', btn_size) then
              sampSendChat('/mask')
          end
          if imgui.Button(u8'Телефон', btn_size) then
              sampSendChat('/phone')
          end
          if imgui.Button(u8'Статистика', btn_size) then
      sampSendChat('/stats')
          end
        imgui.EndChild()
      imgui.End()
end
function main()
  while true do
    wait(0)
    if wasKeyPressed(key.VK_Q) and wasKeyPressed(key.VK_E) then -- активация
        wind.v = not wind.v
    end
    imgui.Process = wind.v
  end
end


function apply_custom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    colors[clr.Text]   = ImVec4(0.00, 0.00, 0.00, 0.51)
    colors[clr.TextDisabled]   = ImVec4(0.24, 0.24, 0.24, 1.00)
    colors[clr.WindowBg]              = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.ChildWindowBg]         = ImVec4(0.96, 0.96, 0.96, 1.00)
    colors[clr.PopupBg]               = ImVec4(0.92, 0.92, 0.92, 1.00)
    colors[clr.Border]                = ImVec4(0.86, 0.86, 0.86, 1.00)
    colors[clr.BorderShadow]          = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.FrameBg]               = ImVec4(0.88, 0.88, 0.88, 1.00)
    colors[clr.FrameBgHovered]        = ImVec4(0.82, 0.82, 0.82, 1.00)
    colors[clr.FrameBgActive]         = ImVec4(0.76, 0.76, 0.76, 1.00)
    colors[clr.TitleBg]               = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.TitleBgCollapsed]      = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.TitleBgActive]         = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.MenuBarBg]             = ImVec4(0.00, 0.37, 0.78, 1.00)
    colors[clr.ScrollbarBg]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.ScrollbarGrab]         = ImVec4(0.00, 0.35, 1.00, 0.78)
    colors[clr.ScrollbarGrabHovered]  = ImVec4(0.00, 0.33, 1.00, 0.84)
    colors[clr.ScrollbarGrabActive]   = ImVec4(0.00, 0.31, 1.00, 0.88)
    colors[clr.ComboBg]               = ImVec4(0.92, 0.92, 0.92, 1.00)
    colors[clr.CheckMark]             = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.SliderGrab]            = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.SliderGrabActive]      = ImVec4(0.00, 0.39, 1.00, 0.71)
    colors[clr.Button]                = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.ButtonHovered]         = ImVec4(0.00, 0.49, 1.00, 0.71)
    colors[clr.ButtonActive]          = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.Header]                = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.HeaderHovered]         = ImVec4(0.00, 0.49, 1.00, 0.71)
    colors[clr.HeaderActive]          = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.ResizeGrip]            = ImVec4(0.00, 0.39, 1.00, 0.59)
    colors[clr.ResizeGripHovered]     = ImVec4(0.00, 0.27, 1.00, 0.59)
    colors[clr.ResizeGripActive]      = ImVec4(0.00, 0.25, 1.00, 0.63)
    colors[clr.CloseButton]           = ImVec4(0.00, 0.35, 0.96, 0.71)
    colors[clr.CloseButtonHovered]    = ImVec4(0.00, 0.31, 0.88, 0.69)
    colors[clr.CloseButtonActive]     = ImVec4(0.00, 0.25, 0.88, 0.67)
    colors[clr.PlotLines]             = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotLinesHovered]      = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotHistogram]         = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotHistogramHovered]  = ImVec4(0.00, 0.35, 0.92, 0.78)
    colors[clr.TextSelectedBg]        = ImVec4(0.00, 0.47, 1.00, 0.59)
    colors[clr.ModalWindowDarkening]  = ImVec4(0.20, 0.20, 0.20, 0.35)
end
apply_custom_style()
Получается вот так -
43719

Мне надо окно "Тест" поднять в верхний ряд, как это сделать?
 

lemonager

Известный
Всефорумный модератор
809
1,720
Есть код -
Код:
require 'lib.moonloader'
local imgui = require 'imgui'
local key = require 'vkeys'
local lib = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local toggle = false
local ImBool1 = imgui.ImBool(false)
local ImBool2 = imgui.ImBool(false)
local ImBool3 = imgui.ImBool(false)
local wind = imgui.ImBool(false)
local settings_window = imgui.ImBool(false)

function imgui.OnDrawFrame()
      imgui.ShowCursor = wind.v
        local sw, sh = getScreenResolution()
    if wind.v then
      imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) --положение основного окна
      imgui.SetNextWindowSize(imgui.ImVec2(596, 460), imgui.Cond.FirstUseEver)--размер основного окна
      imgui.Begin('DanielsHelper', wind)
        imgui.PushItemWidth(150)
        imgui.SetCursorPos(imgui.ImVec2(435, 25))
    end imgui.PopItemWidth()
       imgui.SetCursorPos (imgui.ImVec2(7, 85))
       imgui.BeginChild('##1', imgui.ImVec2(190, 180), true)
        local btn_size = imgui.ImVec2(-0.1, 0)
        imgui.Text(u8'Разное')
        imgui.Separator()
          if imgui.Button(u8'Приветствие в чате семьи', btn_size) then
              sampSendChat("/fam Привет!")
          end
          if imgui.Button(u8'Приветствие нового члена!', btn_size) then
              sampSendChat('/fam Добро пожаловать в гей клуб!')
          end
          if imgui.Button(u8'Поздравить с ДР', btn_size) then
             sampSendChat('/fam Поздравляю с ДР! Счастья, здоровья!')
          end
       imgui.EndChild()
       imgui.BeginChild('##2', imgui.ImVec2(190, 180), true)
       imgui.Text(u8'Разное')
       imgui.Separator()
          if imgui.Button(u8'Броня', btn_size) then
              sampSendChat("/armour")
          end
          if imgui.Button(u8'Маска', btn_size) then
              sampSendChat('/mask')
          end
          if imgui.Button(u8'Телефон', btn_size) then
              sampSendChat('/phone')
          end
          if imgui.Button(u8'Статистика', btn_size) then
              sampSendChat('/stats')
          end
        imgui.EndChild()
------------------------------

        imgui.SameLine()

--2 блок
------------------------------
        imgui.BeginChild('##3', imgui.ImVec2(190, 180), true)
        imgui.Text(u8'Тест')
        imgui.Separator()
          if imgui.Button(u8'Покушать', btn_size) then
              sampSendChat("/eat")
              if sampIsDialogActive() then
                  sampSendDialogResponse(9965,1,0,"")
              end
          end
          if imgui.Button(u8'Маска', btn_size) then
              sampSendChat('/mask')
          end
          if imgui.Button(u8'Телефон', btn_size) then
              sampSendChat('/phone')
          end
          if imgui.Button(u8'Статистика', btn_size) then
      sampSendChat('/stats')
          end
        imgui.EndChild()
      imgui.End()
end
function main()
  while true do
    wait(0)
    if wasKeyPressed(key.VK_Q) and wasKeyPressed(key.VK_E) then -- активация
        wind.v = not wind.v
    end
    imgui.Process = wind.v
  end
end


function apply_custom_style()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    colors[clr.Text]   = ImVec4(0.00, 0.00, 0.00, 0.51)
    colors[clr.TextDisabled]   = ImVec4(0.24, 0.24, 0.24, 1.00)
    colors[clr.WindowBg]              = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.ChildWindowBg]         = ImVec4(0.96, 0.96, 0.96, 1.00)
    colors[clr.PopupBg]               = ImVec4(0.92, 0.92, 0.92, 1.00)
    colors[clr.Border]                = ImVec4(0.86, 0.86, 0.86, 1.00)
    colors[clr.BorderShadow]          = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.FrameBg]               = ImVec4(0.88, 0.88, 0.88, 1.00)
    colors[clr.FrameBgHovered]        = ImVec4(0.82, 0.82, 0.82, 1.00)
    colors[clr.FrameBgActive]         = ImVec4(0.76, 0.76, 0.76, 1.00)
    colors[clr.TitleBg]               = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.TitleBgCollapsed]      = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.TitleBgActive]         = ImVec4(0.00, 0.45, 1.00, 0.82)
    colors[clr.MenuBarBg]             = ImVec4(0.00, 0.37, 0.78, 1.00)
    colors[clr.ScrollbarBg]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.ScrollbarGrab]         = ImVec4(0.00, 0.35, 1.00, 0.78)
    colors[clr.ScrollbarGrabHovered]  = ImVec4(0.00, 0.33, 1.00, 0.84)
    colors[clr.ScrollbarGrabActive]   = ImVec4(0.00, 0.31, 1.00, 0.88)
    colors[clr.ComboBg]               = ImVec4(0.92, 0.92, 0.92, 1.00)
    colors[clr.CheckMark]             = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.SliderGrab]            = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.SliderGrabActive]      = ImVec4(0.00, 0.39, 1.00, 0.71)
    colors[clr.Button]                = ImVec4(0.00, 0.49, 1.00, 0.59)
    colors[clr.ButtonHovered]         = ImVec4(0.00, 0.49, 1.00, 0.71)
    colors[clr.ButtonActive]          = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.Header]                = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.HeaderHovered]         = ImVec4(0.00, 0.49, 1.00, 0.71)
    colors[clr.HeaderActive]          = ImVec4(0.00, 0.49, 1.00, 0.78)
    colors[clr.ResizeGrip]            = ImVec4(0.00, 0.39, 1.00, 0.59)
    colors[clr.ResizeGripHovered]     = ImVec4(0.00, 0.27, 1.00, 0.59)
    colors[clr.ResizeGripActive]      = ImVec4(0.00, 0.25, 1.00, 0.63)
    colors[clr.CloseButton]           = ImVec4(0.00, 0.35, 0.96, 0.71)
    colors[clr.CloseButtonHovered]    = ImVec4(0.00, 0.31, 0.88, 0.69)
    colors[clr.CloseButtonActive]     = ImVec4(0.00, 0.25, 0.88, 0.67)
    colors[clr.PlotLines]             = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotLinesHovered]      = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotHistogram]         = ImVec4(0.00, 0.39, 1.00, 0.75)
    colors[clr.PlotHistogramHovered]  = ImVec4(0.00, 0.35, 0.92, 0.78)
    colors[clr.TextSelectedBg]        = ImVec4(0.00, 0.47, 1.00, 0.59)
    colors[clr.ModalWindowDarkening]  = ImVec4(0.20, 0.20, 0.20, 0.35)
end
apply_custom_style()
Получается вот так - Посмотреть вложение 43719
Мне надо окно "Тест" поднять в верхний ряд, как это сделать?
Lua:
imgui.SetCursorPos(imgui.ImVec2(X, Y))
ставишь это после нужного элемента(в твоем случае окошко) и место X и Y подбираешь координаты(цифры).
X - лево/право
Y - вверх/вниз
Данная функция перемещает любой объект в любую часть имгуи окна
 
  • Нравится
Реакции: JLCUHA

JLCUHA

Участник
28
7
Ещё вопросик, как сделать выход из игры на кнопку, sampSendChat('/q') не работает.
 

JLCUHA

Участник
28
7
Опять я :)
Возможно ли сделать смену тем Imgui прямо в игре и менюшку для их выбора? Желательно с примером.
 
Последнее редактирование:

neverlane

t.me/neverlane00
Друг
1,010
1,159
Есть у меня 2 imgui окна: основное с настройками и дополнительное с информацией. Когда нажимаешь на checkbox то в доп.окно добавляется определённый текст и окно должно увеличится по Y на несколько пикселей. Как это сделать?
 

Quasper

Известный
835
354
Есть у меня 2 imgui окна: основное с настройками и дополнительное с информацией. Когда нажимаешь на checkbox то в доп.окно добавляется определённый текст и окно должно увеличится по Y на несколько пикселей. Как это сделать?
Lua:
local checkBox = imgui.ImBool(false)
local sX, sY = 100, 100 -- дефолт размеры второго окна
--в 1м окне
imgui.Begin()
if imgui.CheckBox("Add text", checkBox) then
    sY = sY + 20 -- прибавляем 20 пикселей к Y
end
imgui.End()

--во втором окне
imgui.SetNextWindowSize(imgui.ImVec2(sX, sY))
imgui.Begin()
--блок где нужно добавить текст
if checkBox.v then
    imgui.Text("Text added")
end
imgui.End()

ну или просто можно второму бегину установить флаг авторазмера и не париться
 
  • Нравится
Реакции: AnWu и neverlane

JLCUHA

Участник
28
7
Как сделать вот такую штуку?
И как с ней работать?
 

Вложения

  • photofacefun_com_1574166595.jpg
    photofacefun_com_1574166595.jpg
    1.1 KB · Просмотры: 203

atizoff

приобретаю кашель за деньги
Проверенный
1,296
1,179
Может кто помочь? В этой строке:
Lua:
imgui.Text(u8"Жизни:"); imgui.SameLine(spacing); imgui.Text(isPed and health or u8"Нет")
выдаёт такую ошибку(log):
[21:29:15.807931] (error) First script: E:\WinterSAMP\moonloader\flintool.lua:614: stack index 1, expected string, received number: (bad argument into 'void(const char*)')
stack traceback:
что ты сделать хочешь? ты в текст хуйню вставил какую-то

что isped и health возвращают?
 

RTD

Потужно
Модератор
399
470
Может кто помочь? В этой строке:
Lua:
imgui.Text(u8"Жизни:"); imgui.SameLine(spacing); imgui.Text(isPed and health or u8"Нет")
выдаёт такую ошибку(log):
[21:29:15.807931] (error) First script: E:\WinterSAMP\moonloader\flintool.lua:614: stack index 1, expected string, received number: (bad argument into 'void(const char*)')
stack traceback:
Lua:
isPed and tostring(health) or u8...
 
  • Влюблен
  • Нравится
Реакции: AnWu и iwak