[mimgui] Изменение позиции второго окна

Howau

Участник
Автор темы
45
8
Версия MoonLoader
.026-beta
делаю функцию для перемещения маленького окна с информацией по нажатию кнопки, сделал - все работает, но нужно бы сделать так, что бы когда я нажимал на кнопку курсор цеплялся за окно, далее я вел курсор в нужно менсто нажимал ЛКН и позиция окна бы сохранялась.

Lua:
--в начале
local flags = imgui.WindowFlags.NoMove + imgui.WindowFlags.NoDecoration

-- окно информации
imgui.OnFrame(function() return window_two[0] end, function(player)
    imgui.SetNextWindowBgAlpha(0.3)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(200,220), imgui.Cond.Always)
    imgui.Begin("##yourinfo", window_two, flags)
    imgui.Text(u8'Информация о '.. ffi.string(name) .. ':')
    imgui.Separator()
    local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    imgui.TextWrapped(u8'НикНейм: ' .. ffi.string(name) .. ' [' .. id .. ']')
    imgui.TextWrapped(u8'Тег: ' .. ffi.string(org))
    imgui.TextWrapped(u8'Должность: ' .. ffi.string(rank))
    imgui.TextWrapped(u8"Здоровье: " .. hp .. " HP")
    imgui.TextWrapped(u8"Город: " .. calccity(x, y, z))
    imgui.TextWrapped(u8"Район: " .. calculateZone(x, y, z))
    imgui.TextWrapped(u8"Время: " .. os.date('%H:%M:%S'))
    imgui.End()
end).HideCursor = true


--кнопка сохраняющая все это дело.
if imgui.Button(fa.UP_DOWN_LEFT_RIGHT) then
                flags = (bit.rshift(flags, 2) == 1) and (flags - imgui.WindowFlags.NoMove) or (flags + imgui.WindowFlags.NoMove)
            end
 
Решение
Не обязательно оборачивать строчки в ffi.string для вывода в imgui. И все методы, связанные с текстом, поддерживают форматный вывод, конкатенацию можно не делать

Lua:
--в начале
local flags = imgui.WindowFlags.NoMove + imgui.WindowFlags.NoDecoration

-- окно информации
imgui.OnFrame(function() return window_two[0] end, function(player)
    if bit.band(flags, imgui.WindowFlags.NoMove) == 0 then
        local x, y = getCursorPos()
        imgui.SetNextWindowPos(imgui.ImVec2(x, y), nil, imgui.ImVec2(0.5, 0.5))
        if imgui.IsMouseClicked(0) then
            flags = flags + imgui.WindowFlags.NoMove
        end
    end

    imgui.SetNextWindowBgAlpha(0.3)
    imgui.SetNextWindowSize(imgui.ImVec2(200,220), imgui.Cond.Always)...

wojciech?

Известный
Проверенный
352
236
Не обязательно оборачивать строчки в ffi.string для вывода в imgui. И все методы, связанные с текстом, поддерживают форматный вывод, конкатенацию можно не делать

Lua:
--в начале
local flags = imgui.WindowFlags.NoMove + imgui.WindowFlags.NoDecoration

-- окно информации
imgui.OnFrame(function() return window_two[0] end, function(player)
    if bit.band(flags, imgui.WindowFlags.NoMove) == 0 then
        local x, y = getCursorPos()
        imgui.SetNextWindowPos(imgui.ImVec2(x, y), nil, imgui.ImVec2(0.5, 0.5))
        if imgui.IsMouseClicked(0) then
            flags = flags + imgui.WindowFlags.NoMove
        end
    end

    imgui.SetNextWindowBgAlpha(0.3)
    imgui.SetNextWindowSize(imgui.ImVec2(200,220), imgui.Cond.Always)
    imgui.Begin("##yourinfo", window_two, flags)
    imgui.Text(u8'Информация о %s:', name)

    imgui.Separator()
    local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    imgui.TextWrapped(u8"НикНейм: %s [%.0f]", name, id)
    imgui.TextWrapped(u8'Тег: %s', org)
    imgui.TextWrapped(u8'Должность: %s', rank)
    imgui.TextWrapped(u8"Здоровье: %.0f HP", hp)
    imgui.TextWrapped(u8"Город: %s", calccity(x, y, z))
    imgui.TextWrapped(u8"Район: %s", calculateZone(x, y, z))
    imgui.TextWrapped(u8"Время: %s", os.date('%H:%M:%S'))
    imgui.End()
end).HideCursor = true


--кнопка сохраняющая все это дело.
if imgui.Button(fa.UP_DOWN_LEFT_RIGHT) then
    flags = (bit.band(flags, imgui.WindowFlags.NoMove) == 1) and (flags - imgui.WindowFlags.NoMove) or (flags + imgui.WindowFlags.NoMove)
end
 

Howau

Участник
Автор темы
45
8
Не обязательно оборачивать строчки в ffi.string для вывода в imgui. И все методы, связанные с текстом, поддерживают форматный вывод, конкатенацию можно не делать

Lua:
--в начале
local flags = imgui.WindowFlags.NoMove + imgui.WindowFlags.NoDecoration

-- окно информации
imgui.OnFrame(function() return window_two[0] end, function(player)
    if bit.band(flags, imgui.WindowFlags.NoMove) == 0 then
        local x, y = getCursorPos()
        imgui.SetNextWindowPos(imgui.ImVec2(x, y), nil, imgui.ImVec2(0.5, 0.5))
        if imgui.IsMouseClicked(0) then
            flags = flags + imgui.WindowFlags.NoMove
        end
    end

    imgui.SetNextWindowBgAlpha(0.3)
    imgui.SetNextWindowSize(imgui.ImVec2(200,220), imgui.Cond.Always)
    imgui.Begin("##yourinfo", window_two, flags)
    imgui.Text(u8'Информация о %s:', name)

    imgui.Separator()
    local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    imgui.TextWrapped(u8"НикНейм: %s [%.0f]", name, id)
    imgui.TextWrapped(u8'Тег: %s', org)
    imgui.TextWrapped(u8'Должность: %s', rank)
    imgui.TextWrapped(u8"Здоровье: %.0f HP", hp)
    imgui.TextWrapped(u8"Город: %s", calccity(x, y, z))
    imgui.TextWrapped(u8"Район: %s", calculateZone(x, y, z))
    imgui.TextWrapped(u8"Время: %s", os.date('%H:%M:%S'))
    imgui.End()
end).HideCursor = true


--кнопка сохраняющая все это дело.
if imgui.Button(fa.UP_DOWN_LEFT_RIGHT) then
    flags = (bit.band(flags, imgui.WindowFlags.NoMove) == 1) and (flags - imgui.WindowFlags.NoMove) or (flags + imgui.WindowFlags.NoMove)
end
В переменных name, org и т.п. выходят из ini, поэтому они обёрнуты в ffi.string