круглый биндер (на колесико)

w99zzl1

Участник
Автор темы
129
12
Версия MoonLoader
.026-beta
Заинтересовался написать биндер, который, при нажатии на колесико мыши будет проявлять "менюшку", по задумке, она круглая, а кнопочки - поделены на "дольки" этого круга, и скрипт триггерится когда я навел на нужную себе кнопку и отпустил СКМ. Написал код, мало того, что меню не появляется (появляется окно debug, которое, кстати, работает как "маска", если перетащить его в центр - появляется походу то самое полудохлое "меню" биндера. И мало того, появляется не круг, а злоебучий многоугольник какой то. Гайдов или открытых кодов с таким биндером не нашел, так что пишу сюда ибо вообще теперь не понимаю, как это организовать. Подскажите пожалуйста. Вот код:


Код:
local menu = imgui.new.bool(false)  -- окно (открыто / закрыто)
local key_m3 = 0x04  -- Средняя кнопка мыши
local sectors = 6  -- Количество кнопок ("долек")
local radius = 120  -- Радиус меню
local selected = nil  -- Выбранная "долька"

-- Опции команд, соответствующие "долькам"
local options = {
    {label = "Привет", action = function() sampSendChat("Привет") end},
    {label = "Как дела?", action = function() sampSendChat("Как дела?") end}
}

function main()
    while not isSampAvailable() do wait(100) end

    while true do
        wait(0)

        -- Открытие меню при зажатии СКМ
        if isKeyDown(key_m3) then
            menu[0] = true
            showCursor(true)
        end

        -- Закрытие меню при отпускании СКМ + выполнение команды
        if wasKeyReleased(key_m3) then
            menu[0] = false
            showCursor(false)
            if selected then
                selected.action()
                selected = nil
            end
        end
    end
end

imgui.OnFrame(function() return menu[0] end, function()
    local sx, sy = getScreenResolution()  -- Размер экрана
    local cx, cy = sx / 2, sy / 2  -- Центр экрана
    local draw = imgui.GetWindowDrawList()

    -- Невидимое окно
    imgui.SetNextWindowPos(imgui.ImVec2(0, 0), imgui.Cond.Always)
    imgui.SetNextWindowSize(imgui.ImVec2(0, 0))
    imgui.Begin("###RadialMenu", nil, imgui.WindowFlags.NoBackground + imgui.WindowFlags.NoDecoration + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoInputs)

    -- Координаты курсора
    local success, mx, my = getCursorPos()
    if success and mx and my then
        -- Вычисляем угол курсора относительно центра
        local angle = math.atan2(my - cy, mx - cx)
        if angle < 0 then angle = angle + 2 * math.pi end

        -- В какой сектор попал курсор
        local sector_size = (2 * math.pi) / sectors
        local index = math.floor(angle / sector_size) + 1
        selected = options[index]
    end

    -- Радиальное меню
    for i, opt in ipairs(options) do
        local start_angle = (i - 1) * (2 * math.pi / sectors)
        local end_angle = i * (2 * math.pi / sectors)

        local p1 = imgui.ImVec2(cx, cy)
        local p2 = imgui.ImVec2(cx + math.cos(start_angle) * radius, cy + math.sin(start_angle) * radius)
        local p3 = imgui.ImVec2(cx + math.cos(end_angle) * radius, cy + math.sin(end_angle) * radius)

        local color = imgui.ColorConvertFloat4ToU32({0.2, 0.2, 0.2, 0.8})
        if selected == opt then
            color = imgui.ColorConvertFloat4ToU32({0.8, 0.2, 0.2, 0.8}) -- Подсветка выбранного сектора
        end

        draw:AddTriangleFilled(p1, p2, p3, color)
    end

    imgui.End()
end)
 
Решение
Lua:
local imgui     = require "mimgui"
local encoding  = require "encoding"

encoding.default = "CP1251"
u8 = encoding.UTF8

-- Pie меню
local pie       = require "imgui_piemenu"
local pie_mode  = imgui.new.bool(true)
local pie_keyId = 1 -- 0 ЛКМ, 1 ПКМ, 2 СКМ

local pie_elements = {
    --[[
        name    = Название кнопки
        action  = Действие кнопки
        next    = Подменю этой кнопки. Если nil - подменю не будет
    ]]

    {name = "Привет", action = function() sampAddChatMessage("Привет!", -1) end, next = nil},
    {name = "Пока", action = function() sampAddChatMessage("Пока", -1) end, next = nil},
    {name = "Биндер", action = function() end, next = {
        -- Подменю...

Vespan

loneliness
Проверенный
2,138
1,775
 
  • Влюблен
Реакции: w99zzl1

w99zzl1

Участник
Автор темы
129
12
а есть что то подобное, совместимое с мимгуи?
 

w99zzl1

Участник
Автор темы
129
12
Спасибо! Уже долго мучаюсь, никак не могу понять, сколько кодов перепробовал, или ошибки какие то нелогичные и непонятные вообще, или окно просто не открывается. Что я делаю не так? Помогите пожалуйста
Lua:
local imgui = require 'mimgui'
local pie = require 'imgui_piemenu'

local piemenu = imgui.new.bool(false)

imgui.OnFrame(function()
    if imgui.IsMouseClicked(2) then
        imgui.OpenPopup('PieMenu') piemenu[0] = true
    end
    if showMenu[0] and pie.BeginPiePopup('PieMenu', 1) then
        if pie.PieMenuItem('Test1') then
            sampAddChatMesage("Выбран Test1")
        end
        pie.EndPiePopup()
        piemenu[0] = false
    end

    return true
end)
 

$Mr.R1ch$

Активный
333
51
Спасибо! Уже долго мучаюсь, никак не могу понять, сколько кодов перепробовал, или ошибки какие то нелогичные и непонятные вообще, или окно просто не открывается. Что я делаю не так? Помогите пожалуйста
Lua:
local imgui = require 'mimgui'
local pie = require 'imgui_piemenu'

local piemenu = imgui.new.bool(false)

imgui.OnFrame(function()
    if imgui.IsMouseClicked(2) then
        imgui.OpenPopup('PieMenu') piemenu[0] = true
    end
    if showMenu[0] and pie.BeginPiePopup('PieMenu', 1) then
        if pie.PieMenuItem('Test1') then
            sampAddChatMesage("Выбран Test1")
        end
        pie.EndPiePopup()
        piemenu[0] = false
    end

    return true
end)
Lua:
imgui.OnFrame(function()
    if imgui.IsMouseClicked(2) then
        imgui.OpenPopup('PieMenu')
    end
    if pie.BeginPiePopup('PieMenu', 1) then
        if pie.PieMenuItem('Test1') then
            sampAddChatMesage("Выбран Test1")
        end
        pie.EndPiePopup()
    end

    return true
end)
piemenu[0] тут вообще не нужно, это по сути popup уже идёт
 

w99zzl1

Участник
Автор темы
129
12
Lua:
imgui.OnFrame(function()
    if imgui.IsMouseClicked(2) then
        imgui.OpenPopup('PieMenu')
    end
    if pie.BeginPiePopup('PieMenu', 1) then
        if pie.PieMenuItem('Test1') then
            sampAddChatMesage("Выбран Test1")
        end
        pie.EndPiePopup()
    end

    return true
end)
piemenu[0] тут вообще не нужно, это по сути popup уже идёт
В целом, да, знаю что можно без imgui.new.bool, но почему то без него в игру не заходило даже, сейчас ошибку выдает:


Код:
[ML] (error) alt enter.lua: D:\SAMSA MEDIUM PC\moonloader\lib\mimgui\init.lua:277: assertion failed!
stack traceback:
    [C]: in function 'assert'
    D:\SAMSA MEDIUM PC\moonloader\lib\mimgui\init.lua:277: in function 'OnFrame'
    D:\SAMSA MEDIUM PC\moonloader\alt enter.lua:4: in main chunk
[ML] (error) alt enter.lua: Script died due to an error. (1D330F8C)

ничего не понимаю...
 

$Mr.R1ch$

Активный
333
51
В целом, да, знаю что можно без imgui.new.bool, но почему то без него в игру не заходило даже, сейчас ошибку выдает:


Код:
[ML] (error) alt enter.lua: D:\SAMSA MEDIUM PC\moonloader\lib\mimgui\init.lua:277: assertion failed!
stack traceback:
    [C]: in function 'assert'
    D:\SAMSA MEDIUM PC\moonloader\lib\mimgui\init.lua:277: in function 'OnFrame'
    D:\SAMSA MEDIUM PC\moonloader\alt enter.lua:4: in main chunk
[ML] (error) alt enter.lua: Script died due to an error. (1D330F8C)

ничего не понимаю...
так, ты меню открываешь в фрейме, или кнопкой? если кнопкой, то ты должен убрать imgui.OnFrame(function(), и рендерить пай меню вне фрейма
 
Последнее редактирование:

w99zzl1

Участник
Автор темы
129
12
тут почему то при попытке открыть круговое меню, курсор фиксируется, окна пропадают и с ними больше невозможно работать...

так, ты меню открываешь в фрейме, или кнопкой? если во фрейме, то ты должен убрать imgui.OnFrame(function(), и рендерить пай меню вне фрейма
Так... Во фрейме... Это и весь мой код:


Lua:
local imgui = require 'mimgui'
local pie = require 'imgui_piemenu'

imgui.OnFrame(function()
    if imgui.IsMouseClicked(2) then
        imgui.OpenPopup('PieMenu')
    end
    if pie.BeginPiePopup('PieMenu', 1) then
        if pie.PieMenuItem('Test1') then
            sampAddChatMesage("Выбран Test1")
        end
        pie.EndPiePopup()
    end

    return true
end)

(который с ошибкой)
Только не говори что я тупанул, и нужно было вызывать через main в беск. цикле и key?... Первый раз работаю с этой библиотекой просто)
 
Последнее редактирование:

$Mr.R1ch$

Активный
333
51
тут почему то при попытке открыть круговое меню, курсор фиксируется, окна пропадают и с ними больше невозможно работать...


Так... Во фрейме... Это и весь мой код:


Lua:
local imgui = require 'mimgui'
local pie = require 'imgui_piemenu'

imgui.OnFrame(function()
    if imgui.IsMouseClicked(2) then
        imgui.OpenPopup('PieMenu')
    end
    if pie.BeginPiePopup('PieMenu', 1) then
        if pie.PieMenuItem('Test1') then
            sampAddChatMesage("Выбран Test1")
        end
        pie.EndPiePopup()
    end

    return true
end)

(который с ошибкой)
Только не говори что я тупанул, и нужно было вызывать через main в беск. цикле и key?... Первый раз работаю с этой библиотекой просто)
тупанул, если кнопкой рендерить, то вне фрейма
 

w99zzl1

Участник
Автор темы
129
12
тупанул, если кнопкой рендерить, то вне фрейма
а фрейм должен ведь прорисовывать само окно?

Ну типо...


Lua:
local imgui = require 'mimgui'
local pie = require 'imgui_piemenu'

local piemenu = imgui.new.bool(false)

function main()
    while true do
        wait(0)

        if isKeyJustPressed(2) then
            piemenu[0] = true
            imgui.OpenPopup('PieMenu')
        end
    end
end

imgui.OnFrame(function() return piemenu[0] end, function() -- или это убрать? Хотя что с ним, что без него, при нажатии СКМ ничего не происходит.
    pie.BeginPiePopup('test')
    pie.EndPiePopup()
end)

function imgui.OnRender()
    if piemenu[0] then
        if pie.BeginPiePopup('PieMenu', 1) then
            if pie.PieMenuItem('Test1') then
                sampAddChatMessage("Выбран Test1")
                piemenu[0] = false
            end
            pie.EndPiePopup()
        end
    end
end
 

$Mr.R1ch$

Активный
333
51
а фрейм должен ведь прорисовывать само окно?

Ну типо...


Lua:
local imgui = require 'mimgui'
local pie = require 'imgui_piemenu'

local piemenu = imgui.new.bool(false)

function main()
    while true do
        wait(0)

        if isKeyJustPressed(2) then
            piemenu[0] = true
            imgui.OpenPopup('PieMenu')
        end
    end
end

imgui.OnFrame(function() return piemenu[0] end, function(player) -- или это убрать? Хотя что с ним, что без него, при нажатии СКМ ничего не происходит.
    pie.BeginPiePopup('test')
    pie.EndPiePopup()
end)

function imgui.OnRender()
    if piemenu[0] then
        if pie.BeginPiePopup('PieMenu', 1) then
            if pie.PieMenuItem('Test1') then
                sampAddChatMessage("Выбран Test1")
                piemenu[0] = false
            end
            pie.EndPiePopup()
        end
    end
end
короче, я проверил, и мои слова бред
пай меню надо всегда рендерить в фрейме, а в мейнев цикле надо сделать так:
Lua:
if isKeyJustPressed(88) then -- X клавиша любо другая
       piemenu[0] = not piemenu[0]
 end
 

w99zzl1

Участник
Автор темы
129
12
короче, я проверил, и мои слова бред
пай меню надо всегда рендерить в фрейме, а в мейнев цикле надо сделать так:
Lua:
if isKeyJustPressed(88) then -- X клавиша любо другая
       piemenu[0] = not piemenu[0]
 end
Lua:
local imgui = require 'mimgui'
local pie = require 'imgui_piemenu'

local piemenu = imgui.new.bool(false)

function main()

    wait(0)

    while true do
        wait(0)

        if isKeyJustPressed(88) then
            piemenu[0] = not piemenu[0]
        end
    end
end

imgui.OnFrame(function() return piemenu[0] end, function()
    imgui.OpenPopup('PieMenu')

    if pie.BeginPiePopup('PieMenu', 1) then
        if pie.PieMenuItem('Test1') then
            sampAddChatMessage("Выбран Test1")
        end
        pie.EndPiePopup()
    end

    return true
end)

И ничего... Ни ошибок, ни работы((

Вот ещё варик, вроде выглядит правильно, но также безуспешно..


Lua:
local imgui = require 'mimgui'
local pie = require 'imgui_piemenu'

local piemenu = imgui.new.bool(false)

function main()
    while not isSampAvailable() do wait(0) end

    while true do
        wait(0)

        if isKeyJustPressed(88) then
            piemenu[0] = not piemenu[0]
        end
    end
end

imgui.OnFrame(function() return piemenu[0] end, function()
    imgui.OpenPopup('PieMenu')
    if pie.BeginPiePopup('PieMenu', 1) then
        if pie.PieMenuItem('Test1') then
            sampAddChatMesage("Выбран Test1")
        end
        pie.EndPiePopup()
    end

    return true
end)
 

$Mr.R1ch$

Активный
333
51
Lua:
local imgui = require 'mimgui'
local pie = require 'imgui_piemenu'

local piemenu = imgui.new.bool(false)

function main()

    wait(0)

    while true do
        wait(0)

        if isKeyJustPressed(88) then
            piemenu[0] = not piemenu[0]
        end
    end
end

imgui.OnFrame(function() return piemenu[0] end, function()
    imgui.OpenPopup('PieMenu')

    if pie.BeginPiePopup('PieMenu', 1) then
        if pie.PieMenuItem('Test1') then
            sampAddChatMessage("Выбран Test1")
        end
        pie.EndPiePopup()
    end

    return true
end)

И ничего... Ни ошибок, ни работы((
Lua:
function main()
 while not isSampAvailable() do wait(100) end
 wait(500)

while true do wait(0)
  if isKeyJustPressed(88) then
     piemenu[0] = not piemenu[0]
  end
end