Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
[imgui.ProgressBar] Прогресс бар Посмотреть вложение 222494
Благодаря этой функции, вы можете рендерить прогресс бар в вашем окне мимгуи. Примеры использования
Lua:
-- Отражаем скорость нашего персонажа в прогресс баре
local speed = math.floor(getCharSpeed(1))
imgui.ProgressBar(speed/100,imgui.ImVec2(100,24),'Speed: '..speed)
-- Отражаем полоску ХП нашего персонажа в прогресс баре
local myHP = getCharHealth(1)
imgui.ProgressBar(myHP/100,imgui.ImVec2(100,24),'HP: '..myHP)
1-ый аргумент - текущее значение чего либо/максимальное
2-ой аргумент - размеры прогресс бара. Можно указать nil и тогда он растянется до конца окна
3-ий аргумент - надпись внутри прогресс бара
Изменить цвет фона прогресс бара можно с помощью параметра imgui.Col.FrameBg
Изменить цвет самой полоски прогресс бара можно с помощью параметра imgui.Col.PlotHistogram
Введение Данная тема создана, как продолжение гайда "Mimgui для чайников" (обязательно к прочтению) с целью ознакомить начинающих скриптеров с mimgui на практике. Практика - является лучшим способом изучения чего-либо, пример простых скриптов на луа и их разбор поможет лучше понять данную...
Введение Данная тема создана, как продолжение гайда "Mimgui для чайников" (обязательно к прочтению) с целью ознакомить начинающих скриптеров с mimgui на практике. Практика - является лучшим способом изучения чего-либо, пример простых скриптов на луа и их разбор поможет лучше понять данную...
Добро пожаловать в гайд по mimgui. mimgui — это новая графическая библиотека, написанная в результате устаревания предыдущей графической библиотеки Moon ImGui, использующей Dear ImGui v.1.52; использующая в своей основе свежий релиз Dear ImGui v.1.72. Новая библиотека включает в себя все...
Введение Данная тема создана, как продолжение гайда "Mimgui для чайников" (обязательно к прочтению) с целью ознакомить начинающих скриптеров с mimgui на практике. Практика - является лучшим способом изучения чего-либо, пример простых скриптов на луа и их разбор поможет лучше понять данную...
www.blast.hk
Вместе с этим, рекомендую к просмотру гайды @chapo
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local new = imgui.new
local WinState = new.bool()
imgui.OnFrame(function() return WinState[0] end, function(player)
imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
imgui.Begin('##Window', WinState, imgui.WindowFlags.NoResize)
imgui.End()
end)
function main()
sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end)
wait(-1)
end
По кнопке
Lua:
require('lib.moonloader')
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local new = imgui.new
local WinState = new.bool()
imgui.OnFrame(function() return WinState[0] end, function(player)
imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
imgui.Begin('##Window', WinState, imgui.WindowFlags.NoResize)
imgui.End()
end)
function main()
while true do wait(0)
if wasKeyPressed(VK_R) and not sampIsCursorActive() then -- Если нажата клавиша R и не активен самп курсор (во избежании активации при открытом чате/диалоге)
WinState[0] = not WinState[0]
end
end
end
В imgui.Begin можно задать флаги, которые влияют на само окно и их перечень таков (жирным шрифтом отмечены наиболее популярные флаги):
imgui.WindowFlags.NoDecoration - убирает верхнюю бровь, полузнок для изменения окна и любые другие элементы мимгуи окна
imgui.WindowFlags.NoTitleBar - убирает заголовок окна
imgui.WindowFlags.NoResize - запрещает изменять размер
imgui.WindowFlags.NoMove - запрещает передвигать окно
imgui.WindowFlags.AlwaysAutoResize - автоматически ставит размер окна
imgui.WindowFlags.NoBackground - делает фон окна прозрачным
imgui.WindowFlags.Tooltip - включает подсказки
imgui.WindowFlags.ShowBorders - включает обводку элементов imgui.WindowFlags.NoScrollbar - убирает ползунок прокрутки
imgui.WindowFlags.NoCollapse - запрещает минимизировать окно при двойном клике
imgui.WindowFlags.NoScrollWithMouse - отключает прокрутку колёсиком мыши
imgui.WindowFlags.NoSavedSettings - отключает сохранения настроек в файл
imgui.WindowFlags.AlwaysUseWindowPadding - создает отступы вокруг окна
imgui.WindowFlags.NoInputs - отключает мышь и клавиатуру
imgui.WindowFlags.NoFocusOnAppearing - отключает фокус при переходе от скрытого к видимому состоянию
При использовании больше 1 флага, их следует перечислять через знак +. Пример:
[Примечание]:
1. Любую функцию можно прописать, как условие.
Тогда то, что вы пропишите будет выполнятся при взаимодействии с этой функцией. Пример на чекбоксе:
Lua:
if imgui.Checkbox(u8'Чекбокс', checkboxone) then
sampAddChatMessage('Вы нажали на чекбокс', -1)
end
2. Зачем нужен ключ [0]?
Для многих функций необходимо создание буфера, которое хранит в себе то или иное значение/состояние. Например, imgui.new.bool() хранит в себе true/false, а imgui.new.int() хранит в себе целую цифру/число. Чтобы получить их значение используется ключ [0] (в имгуи этим ключом служит .v).
Как правило, каждому буферу создается свой псевдоним (( local checkboxone = imgui.new.bool() )), который прописывается в функции и чтобы получить состояние/значение этой функции, после псевдонима ставится ключ [0], к примеру, для получения состояния imgui.Checkbox('Name', checkboxone) ((в самой функции, где указывается псевдоним буфера, ключ использовать не надо)) к его псевдониму необходимо приписать ключ, в итоге получится checkboxone[0].
Для неё не надо создавать буфер, но для её работоспособности, необходимо прописать её, как условие, например:
Lua:
if imgui.CollapsingHeader(u8'Пример списка') then
imgui.TextWrapped(u8'Удобная функция, позволяет сэкономить место и красиво оформить скрипт')
imgui.Separator()
end
-- в начале скрипта
local checkboxone = new.bool() -- создём буфер для чекбокса, который возвращает true/false
-- в мимгуи
imgui.Checkbox(u8'Чекбокс', checkboxone)
Для работы чекбокса, вставлять его в условие необязательно:
Lua:
function main()
while true do wait(0)
if checkboxone[0] then
sampAddChatMessage('Вы поставили галочку в чекбоксе',-1)
wait(5000)
end
end
end
[imgui.RadioButtonBool & imgui.RadioButtonIntPtr] Радиокнопка
Отличия двух этих функций в том, что: imgui.RadioButtonBool - принимает true/false imgui.RadioButtonIntPtr - принимает цифру/число
Их можно использовать следующими способами: 1. Либо с помощью буфера мимгуи, например:
Lua:
-- вне мимгуи
local radioBool = imgui.new.bool()
local radioInt = imgui.new.int()
-- в мимгуи
if imgui.RadioButtonBool('RadioButton',radioBool[0]) then
radioBool[0] = not radioBool[0]
end
for i = 0, 3 do
if imgui.RadioButtonIntPtr(tostring(i),radioInt,i) then
radioInt[0] = i
end
end
2. С помощью обычных локалок (применимо только к imgui.RadioButtonBool):
Lua:
-- вне мимгуи
local radioStatus = false
-- в мимгуи
if imgui.RadioButtonBool('RadioButton',radioStatus) then
radioStatus = not radioStatus
end
-- в начале скрипта
local inputField = new.char[256]() -- создаём буфер для инпута
-- в мимгуи
imgui.InputTextWithHint(u8'Ещё пример', u8'Введите текст', inputField, 256)
[imgui.InputTextMultiline] Позволяет работать с различным многострочным текстом Посмотреть вложение 194515
Lua:
-- в начале скрипта
local TextMultiLine = new.char[256]() -- создаём буфер для imgui InputTextMultiline
-- в мимгуи
imgui.InputTextMultiline("##MyMultilineInput", TextMultiLine, 256) -- если в первом аргументе стоит ##, то следующий текст виден не будет
-- пример использования
imgui.Text(TextMultiLine) -- выводим текст, написанный в многострочном инпуте
-- в начале скрипта
local SliderOne = new.int(2) -- создаём буфер для SliderInt со значением 2 по умолчанию
local SliderTwo = new.float() -- создаём буфер для SliderFloat
-- в мимгуи
imgui.SliderInt(u8'Первый', SliderOne, 0, 24) -- 3 аргументом является минимальное значение, а 4 аргумент задаёт максимальное значение
imgui.SliderFloat(u8'Второй', SliderTwo, 0, 4) -- 3 аргументом является минимальное значение, а 4 аргумент задаёт максимальное значение
imgui.SliderInt - возвращает целую цифру/число (1, 2, 3, 4) imgui.SliderFloat - возвращает нецелую цифру/число(1.1, 1.2, 1.3, 1.4)
Чтобы получить значение, в обоих случаях достаточно добавить ключ [0] к названию буфера. Например:
Lua:
if wasKeyPressed(VK_Q) and not sampIsCursorActive() then
sampAddChatMessage('В SliderInt вы установили '..SliderOne[0],-1)
elseif wasKeyPressed(VK_E) and not sampIsCursorActive() then
sampAddChatMessage('В SliderFloat вы установили '..SliderTwo[0],-1)
end
[imgui.VSliderInt & imgui.VSliderFloat] Вертикальные ползунки Посмотреть вложение 222506
Принцип работы тот же, что и у слайдеров выше, разница лишь во внешнем виде
Lua:
-- В начале
local testSliderInt = new.int()
local testSliderFloat = new.float()
-- В мимгуи
imgui.VSliderFloat('Float',imgui.ImVec2(50,50),testSliderFloat,0,24)
imgui.VSliderInt('Int',imgui.ImVec2(24,100),testSliderInt,0,50)
[imgui.SliderInt2-4 & imgui.SliderFloat2-4] Полузнки с несколькими параметрами Посмотреть вложение 222508
Ползунки, позволяющие записывать несколько параметров в один буфер
Пример использования SliderInt с 4 параметрами:
Lua:
-- вне мимгуи
local testSliderInt = new.int()
-- в мимгуи
imgui.SliderInt4('SliderInt4',testSliderInt,0,20)
-- пример использования
imgui.Text(string.format('SliderInt[0] = %s\nSliderInt[1] = %s\nSliderInt[2] = %s\nSliderInt[3] = %s',testSliderInt[0],testSliderInt[1],testSliderInt[2],testSliderInt[3]))
Пример использования SliderFloat с 2 параметрами:
Lua:
-- вне мимгуи
local testSliderFloat = new.float()
-- в мимгуи
imgui.SliderFloat2('SliderFloat2',testSliderFloat,0,20)
-- пример использования
imgui.Text(string.format('SliderFloat[0] = %s\nSliderFloat[1] = %s',testSliderFloat[0],testSliderFloat[1]))
-- в начале скрипта
local ComboTest = new.int() -- создаём буфер для комбо
local item_list = {u8'Раз', u8'Два'} -- создаём таблицу с содержимым списка
local ImItems = imgui.new['const char*'][#item_list](item_list)
-- в мимгуи
imgui.Combo(u8'Список',ComboTest,ImItems, #item_list)
Для работы с ним достаточно к названию буфера добавить ключ [0]. Например:
Lua:
if wasKeyPressed(VK_R) and not sampIsCursorActive() then
if ComboTest[0] == 0 then -- комбо возвращает значение, поэтому следует указывать при каком пункте выполняется условие
sampAddChatMessage('Выбран первый пункт',-1)
elseif ComboTest[0] == 1 then
sampAddChatMessage('Выбран второй пункт',-1)
end
end
[imgui.Text] Текст без переноса на следующие строчки
Lua:
imgui.Text('Primer')
[imgui.TextWrapped] Текст с переносом на следующие строчки
Lua:
imgui.TextWrapped('I want to fuck a cheeseburger. Just having that cheesy goodness melt all around my cock woild make me fell at easy with the world again.')
[imgui.SameLine] Отменяет перенос нижней функции на следующую строку
Lua:
imgui.SameLine()
Посмотреть вложение 202235 [imgui.PushItemWidth] Изменение ширины функции
Применимо к: SliderInt, SliderFloat, Combo, InputText (мб ещё чему-то, про что забыл)
Вставляется до и после функции, размер которой необходимо изменить. Пример ниже:
Переместить функцию по горизонтали/вертикали можно следующими способами
Lua:
-- Первый способ
imgui.SetCursorPosX(150) -- позволяет задать положение функции по горизнотали
imgui.SetCursorPosY(140) -- позволяет задать положение функции по вертикали
imgui.Button(u8'Кнопка три')
-- Второй способ
imgui.SetCursorPos(imgui.ImVec2(50, 170)) -- 50 = по горизонтали, 170 по вертикали
imgui.Button(u8'Кнопка три')
if imgui.BeginChild('Name', imgui.ImVec2(160, 60), true) then
imgui.Text(u8'Пример чайлда') -- содержание чайлда
imgui.Button(u8'Тестовая кнопка')
imgui.EndChild() -- обязательно следите за тем, чтобы каждый чайлд был закрыт
end
if imgui.Button('Open') then
imgui.OpenPopup(u8'Пример')
end
if imgui.BeginPopupModal(u8'Пример', _, imgui.WindowFlags.NoResize) then
imgui.SetWindowSizeVec2(imgui.ImVec2(290, 190)) -- задаём размер окна
imgui.Text('Test')
if imgui.Button(u8'Закрыть', imgui.ImVec2(280, 24)) then -- обязательно создавайте такую кнопку, чтобы была возможность закрыть окно
imgui.CloseCurrentPopup()
end
imgui.End()
end
[Вкладки] Вкладки (2 способа)
1-ый способ встроенной функцией:
Lua:
if imgui.BeginTabBar('Tabs') then -- задаём начало вкладок
if imgui.BeginTabItem(u8'Основная вкладка') then -- первая вкладка
imgui.EndTabItem() -- конец вкладки
end
if imgui.BeginTabItem(u8'Пустая вкладка') then -- вторая вкладка
imgui.EndTabItem() -- конец вкладки
end
imgui.EndTabBar() -- конец всех вкладок
end
-- вне мимгуи, можно где-нибудь в начале
local tab = 1
-- в мимгуи
if imgui.Button(u8'Первый раздел') then tab = 1 end -- это первая кнопка, которая будет отвечать за переключение на раздел 1
imgui.SameLine()
if imgui.Button(u8'Второй раздел') then tab = 2 end -- это вторая кнопка, которая будет отвечать за переключение на раздел 2
if tab == 1 then
imgui.Text(u8'Открыт первый раздел')
elseif tab == 2 then
imgui.Text(u8'Открыт второй раздел')
end
Посмотреть вложение 202492 [imgui.IsItemHovered] Действие при наведении
С помощью этой функции, можно сделать простую подсказку при наведении, пример:
Lua:
imgui.Button(u8'Пример подскази 1')
if imgui.IsItemHovered() then
imgui.BeginTooltip()
imgui.Text(u8'Вы навелись на кнопку')
imgui.EndTooltip()
end
imgui.Text(u8'Пример подсказки 2')
if imgui.IsItemHovered() then
imgui.BeginTooltip()
imgui.Text(u8'Вы навелись на текст')
imgui.EndTooltip()
end
Посмотреть вложение 202494 [imgui.IsItemClicked] Действие при клике
Если вписать это, как условие после какой-либо функции, например, обычного текста (imgui.Text), то выполнится прописанное условие
Lua:
imgui.Text(u8'Текст')
if imgui.IsItemClicked() then
sampAddChatMessage('Вы нажали на текст', -1)
end
[imgui.Columns] Таблица
Создаёт колонки/столбики в мимгуи окне
Lua:
-- для удобства зададим ширину каждой колонки в начале
local w = {
first = 120,
second = 70,
}
-- == Первая строка
imgui.Columns(3) -- 3 количество столбцов
imgui.Text(u8'Первая') imgui.SetColumnWidth(-1, w.first) -- первый столбик
imgui.NextColumn()
imgui.Text(u8'Вторая') imgui.SetColumnWidth(-1, w.second) -- второй столбик
imgui.NextColumn()
imgui.Text(u8'Третья') imgui.SetColumnWidth(-1, 80) -- либо можете самостоятельно вписывать
imgui.Columns(1)
imgui.Separator()
-- == Вторая строка
imgui.Columns(3)
imgui.Text(u8'Текст под первой') imgui.SetColumnWidth(-1, w.first)
imgui.NextColumn()
imgui.Button(u8'Кнопка') imgui.SetColumnWidth(-1, w.second)
imgui.NextColumn()
imgui.Text(u8'Колонка 3') imgui.SetColumnWidth(-1, 80) -- копируем верхнее
imgui.Columns(1)
imgui.Separator()
-- == Можете задать сколько вам нужно строк
-- Отражаем скорость нашего персонажа в прогресс баре
local speed = math.floor(getCharSpeed(1))
imgui.ProgressBar(speed/100,imgui.ImVec2(100,24),'Speed: '..speed)
-- Отражаем полоску ХП нашего персонажа в прогресс баре
local myHP = getCharHealth(1)
imgui.ProgressBar(myHP/100,imgui.ImVec2(100,24),'HP: '..myHP)
1-ый аргумент - текущее значение чего либо/максимальное
2-ой аргумент - размеры прогресс бара. Можно указать nil и тогда он растянется до конца окна
3-ий аргумент - надпись внутри прогресс бара
Изменить цвет фона прогресс бара можно с помощью параметра imgui.Col.FrameBg
Изменить цвет самой полоски прогресс бара можно с помощью параметра imgui.Col.PlotHistogram [imgui.Dummy] Отступ по вертикали/горизонтали
С помощью этой функции можно сделать отступ по вертикали/горизонтали
Для начала, надо выбрать любой понравившийся стиль. Будьте внимательны, для мимгуи и имгуи они отличаются. Можно выбрать на последних страницах этой темы:
Приветствую всех! В данной теме вы можете делиться своими стилями/темами для ImGUI. Желательно вместе с кодом прикладывать скриншот того, как выглядит в игре. Что-ж, приступим! :dance:
Описание Тема создана с целью сбора удачных решений и ответов на частые вопросы по ImGui интерфейсу. В шапке темы я постараюсь их красиво организовывать, чтобы искать необходимое было легче. Оставляйте свои варианты решений ориентируясь на такой шаблон: Название Скриншот Описание Код Пример...
www.blast.hk
Дополнительные возможности
Авторы этих функций мне неизвестны, но если вы знаете и скажите кто, то укажу его в теме.
3.0 Цветной текст
Встроенной функции с использованием HEX в мимгуи нет, поэтому прибегнем к этой
Lua:
function imgui.TextColoredRGB(text)
local style = imgui.GetStyle()
local colors = style.Colors
local ImVec4 = imgui.ImVec4
local explode_argb = function(argb)
local a = bit.band(bit.rshift(argb, 24), 0xFF)
local r = bit.band(bit.rshift(argb, 16), 0xFF)
local g = bit.band(bit.rshift(argb, 8), 0xFF)
local b = bit.band(argb, 0xFF)
return a, r, g, b
end
local getcolor = function(color)
if color:sub(1, 6):upper() == 'SSSSSS' then
local r, g, b = colors[1].x, colors[1].y, colors[1].z
local a = tonumber(color:sub(7, 8), 16) or colors[1].w * 255
return ImVec4(r, g, b, a / 255)
end
local color = type(color) == 'string' and tonumber(color, 16) or color
if type(color) ~= 'number' then return end
local r, g, b, a = explode_argb(color)
return imgui.ImVec4(r/255, g/255, b/255, a/255)
end
local render_text = function(text_)
for w in text_:gmatch('[^\r\n]+') do
local text, colors_, m = {}, {}, 1
w = w:gsub('{(......)}', '{%1FF}')
while w:find('{........}') do
local n, k = w:find('{........}')
local color = getcolor(w:sub(n + 1, k - 1))
if color then
text[#text], text[#text + 1] = w:sub(m, n - 1), w:sub(k + 1, #w)
colors_[#colors_ + 1] = color
m = n
end
w = w:sub(1, n - 1) .. w:sub(k + 1, #w)
end
if text[0] then
for i = 0, #text do
imgui.TextColored(colors_[i] or colors[1], u8(text[i]))
imgui.SameLine(nil, 0)
end
imgui.NewLine()
else imgui.Text(u8(w)) end
end
end
render_text(text)
end
Если у вас ещё нет следующей функции в коде, то вписываем её в любом месте:
Lua:
imgui.OnInitialize(function()
end)
Внутрь этой функции будет указываться необходимый шрифт. В качестве примера будет вызываться шрифт impact.ttf с размером шрифта 16
Lua:
imgui.OnInitialize(function()
local glyph_ranges = imgui.GetIO().Fonts:GetGlyphRangesCyrillic()
example = imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14)..'\\impact.ttf', 16, _, glyph_ranges)
end)
Чтобы начать его использовать в нужном месте, перед и после нужной части кода, необходимо вписывать следующее:
Lua:
imgui.PushFont(example) -- вызываем функцию, которая меняет шрифт
imgui.Text(u8'Текст жирным шрифтом') -- сам текст
imgui.PopFont() -- функция, заменяющая шрифт заканчивается
Посмотреть вложение 210708
Как можно наблюдать, это применимо к тексту на других функциях. Пример со скрина:
Lua:
-- == Обычный шрифт == --
imgui.Text(u8'Текст')
imgui.Button(u8'Обычная кнопка')
-- == Шрифт impact с размером шрифта 16 == --
imgui.PushFont(example)
imgui.Text(u8'Текст с изм шрифтом')
imgui.Button(u8'Кнопка с изм шрифтом')
imgui.PopFont()
-- == == --
function imgui.ColoredButton(text,hex,trans,size)
local r,g,b = tonumber("0x"..hex:sub(1,2)), tonumber("0x"..hex:sub(3,4)), tonumber("0x"..hex:sub(5,6))
if tonumber(trans) ~= nil and tonumber(trans) < 101 and tonumber(trans) > 0 then a = trans else a = 60 end
imgui.PushStyleColor(imgui.Col.Button, imgui.ImVec4(r/255, g/255, b/255, a/100))
imgui.PushStyleColor(imgui.Col.ButtonHovered, imgui.ImVec4(r/255, g/255, b/255, a/100))
imgui.PushStyleColor(imgui.Col.ButtonActive, imgui.ImVec4(r/255, g/255, b/255, a/100))
local button = imgui.Button(text, size)
imgui.PopStyleColor(3)
return button
end
Посмотреть вложение 222498
1-ый аргумент - название кнопки,
2-ой аргумент - цвет в HEX формате
3-ий аргумент - прозрачность
4-ый аргумент - размер кнопки
Цветной сепаратор
Lua:
function imgui.ColSeparator(hex,trans)
local r,g,b = tonumber("0x"..hex:sub(1,2)), tonumber("0x"..hex:sub(3,4)), tonumber("0x"..hex:sub(5,6))
if tonumber(trans) ~= nil and tonumber(trans) < 101 and tonumber(trans) > 0 then a = trans else a = 100 end
imgui.PushStyleColor(imgui.Col.Separator, imgui.ImVec4(r/255, g/255, b/255, a/100))
local colsep = imgui.Separator()
imgui.PopStyleColor(1)
return colsep
end
Пример использования:
Lua:
for i = 100, 10, -10 do
imgui.ColSeparator('F94242', i)
imgui.ColSeparator('32CD32', i)
end