Нажатие на drawlist mimgui

plalkeo

Известный
Автор темы
688
260
Версия MoonLoader
Другое
Всем привет, хотелось бы узнать как можно определить что я нажал на элемент который нарисовал через drawlist, а то никогда не делал подобное
1719786015945.png

(скриншот из темы от chapo - https://www.blast.hk/threads/122084/)
 
Решение
кликать на дравлист не получится. можно реализовать это как нибудь так:
Lua:
local m = imgui.GetMousePos()
local up_left = imgui.ImVec2(0, 0) -- верхний левый угол прямоугольника
local down_rigth = imgui.ImVec2(52, 1488) -- нижний правый угол прямоугольника
if imgui.IsMouseClicked(1) and m.x >= up_left.x and m.x <= down_rigth.x and m.y >= up_left.y and m.y <= down_rigth.y then
    -- click
end
реализовать проверку нахождения мышки в момент клика в прямоугольнике под углом можно так:
Lua:
local m = imgui.GetMousePos()
local down_left = imgui.ImVec2(0, 1488) -- нижний левый угол прямоугольника
local down_rigth = imgui.ImVec2(52, 1488) -- нижний правый угол прямоугольника
local up_rigth = imgui.ImVec2(52, 0) -- верхний правый угол...

plalkeo

Известный
Автор темы
688
260
можно через невидимую кнопку,ещё есть варианты,но не могу вспомнить какие
не подойдет, мне просто надо кнопку примерно под таким углом, или есть получше варики это сделать?
1719786500257.png


думал сработает нечто подобное
1719787264581.png

но функция не вызывается(
 
Последнее редактирование:

kyrtion

Известный
871
304
но функция не вызывается(
по моему imgui.IsItemClicked сработает на предмет, как и imgui.Button и тд, но не Rect.
попробуй так, они пока лично не протестирован, когда у тебя будет времени то посмотришь

1719797183966.png
 
  • Нравится
Реакции: inexplica

XRLM

Против ветра рождённый
Проверенный
1,503
1,062
кликать на дравлист не получится. можно реализовать это как нибудь так:
Lua:
local m = imgui.GetMousePos()
local up_left = imgui.ImVec2(0, 0) -- верхний левый угол прямоугольника
local down_rigth = imgui.ImVec2(52, 1488) -- нижний правый угол прямоугольника
if imgui.IsMouseClicked(1) and m.x >= up_left.x and m.x <= down_rigth.x and m.y >= up_left.y and m.y <= down_rigth.y then
    -- click
end
реализовать проверку нахождения мышки в момент клика в прямоугольнике под углом можно так:
Lua:
local m = imgui.GetMousePos()
local down_left = imgui.ImVec2(0, 1488) -- нижний левый угол прямоугольника
local down_rigth = imgui.ImVec2(52, 1488) -- нижний правый угол прямоугольника
local up_rigth = imgui.ImVec2(52, 0) -- верхний правый угол прямоугольника
local up_left = imgui.ImVec2(0, 0) -- верхний левый угол прямоугольника
if imgui.IsMouseClicked(1) and isPointInQuadAtAngle(m, down_left, down_rigth, up_rigth, up_left) then
    -- click
end

-- вне фрейма
function product(Px, Py, Ax, Ay, Bx, By)
      return (Bx - Ax) * (Py - Ay) - (By - Ay) * (Px - Ax);
end

function isPointInQuadAtAngle(p, dl, dr, ur, ul)
    p1 = product(p.x, p.y, dl.x, dl.y, dr.x, dr.y)
    p2 = product(p.x, p.y, dr.x, dr.y, ur.x, ur.y)
    p3 = product(p.x, p.y, ur.x, ur.y, ul.x, ul.y)
    p4 = product(p.x, p.y, ul.x, ul.y, dl.x, dl.y)
    return ((p1 < 0 && p2 < 0 && p3 < 0 && p4 < 0) || (p1 > 0 && p2 > 0 && p3 > 0 && p4 > 0))
end
не тестил
 
  • Нравится
Реакции: plalkeo

plalkeo

Известный
Автор темы
688
260
кликать на дравлист не получится. можно реализовать это как нибудь так:
Lua:
local m = imgui.GetMousePos()
local up_left = imgui.ImVec2(0, 0) -- верхний левый угол прямоугольника
local down_rigth = imgui.ImVec2(52, 1488) -- нижний правый угол прямоугольника
if imgui.IsMouseClicked(1) and m.x >= up_left.x and m.x <= down_rigth.x and m.y >= up_left.y and m.y <= down_rigth.y then
    -- click
end
реализовать проверку нахождения мышки в момент клика в прямоугольнике под углом можно так:
Lua:
local m = imgui.GetMousePos()
local down_left = imgui.ImVec2(0, 1488) -- нижний левый угол прямоугольника
local down_rigth = imgui.ImVec2(52, 1488) -- нижний правый угол прямоугольника
local up_rigth = imgui.ImVec2(52, 0) -- верхний правый угол прямоугольника
local up_left = imgui.ImVec2(0, 0) -- верхний левый угол прямоугольника
if imgui.IsMouseClicked(1) and isPointInQuadAtAngle(m, down_left, down_rigth, up_rigth, up_left) then
    -- click
end

-- вне фрейма
function product(Px, Py, Ax, Ay, Bx, By)
      return (Bx - Ax) * (Py - Ay) - (By - Ay) * (Px - Ax);
end

function isPointInQuadAtAngle(p, dl, dr, ur, ul)
    p1 = product(p.x, p.y, dl.x, dl.y, dr.x, dr.y)
    p2 = product(p.x, p.y, dr.x, dr.y, ur.x, ur.y)
    p3 = product(p.x, p.y, ur.x, ur.y, ul.x, ul.y)
    p4 = product(p.x, p.y, ul.x, ul.y, dl.x, dl.y)
    return ((p1 < 0 && p2 < 0 && p3 < 0 && p4 < 0) || (p1 > 0 && p2 > 0 && p3 > 0 && p4 > 0))
end
не тестил

немного исправив последнюю функцию заменив && на and и || на or, все заработало как надо, отслеживается клик прям как надо
 
  • Нравится
Реакции: XRLM