Как сделать загрузку на mimgui

.KOHTOP.

Активный
Автор темы
226
35
Версия MoonLoader
.027.0-preview
loading-load.gif


Как сделать это, на mimgui?
 
Решение

Lua:
module.Spinner = function(label, radius, thickness, color)
    local style = imgui.GetStyle()
    local pos = imgui.GetCursorScreenPos()
    local size = imgui.ImVec2(radius * 2, (radius + style.FramePadding.y) * 2)
    
    imgui.Dummy(imgui.ImVec2(size.x + style.ItemSpacing.x, size.y))

    local DrawList = imgui.GetWindowDrawList()
    DrawList:PathClear()
    
    local num_segments = 30
    local start = math.abs(math.sin(imgui.GetTime() * 1.8) * (num_segments - 5))
    
    local a_min = 3.14 * 2.0 * start / num_segments
    local a_max = 3.14 * 2.0 * (num_segments - 3) / num_segments

    local centre = imgui.ImVec2(pos.x + radius, pos.y + radius + style.FramePadding.y)
    
    for i...

RedHolms

Известный
Проверенный
622
369
Lua:
do -- pie menu sub library
   local function ImRectAdd(rect, rhs)
      local Min, Max = rect.Min, rect.Max
      if Min.x > rhs.x then Min.x = rhs.x end
      if Min.y > rhs.y then Min.y = rhs.y end
      if Max.x < rhs.x then Max.x = rhs.x end
      if Max.y < rhs.y then Max.y = rhs.y end
   end

   local function NewPieMenu()
      local obj = {
         m_iCurrentIndex = 0,
         m_fMaxItemSqrDiameter = 0,
         m_iHoveredItem = 0,
         m_iLastHoveredItem = 0,
         m_iClickedItem = 0,
         m_oItemIsSubMenu = {},
         m_oItemNames = {},
         m_oItemSizes = {}
      }
      return obj
   end

   local function NewPieMenuContext()
      local obj = {
         m_oPieMenuStack = {},
         m_iCurrentIndex = -1,
         m_iLastFrame = 0,
         m_iMaxIndex = 0,
         m_oCenter = ImVec2(0, 0),
         m_oCenterArg = ImVec2(0, 0),
         m_iMouseButton = 0,
         m_bClose = false,
      }
      for i = 0, 8 - 1 do
         obj.m_oPieMenuStack[i] = NewPieMenu()
      end
      return obj
   end

   local function BeginPieMenuEx(menuCtx)
      menuCtx.m_iCurrentIndex = menuCtx.m_iCurrentIndex + 1
      menuCtx.m_iMaxIndex = menuCtx.m_iMaxIndex + 1
      local oPieMenu = menuCtx.m_oPieMenuStack[menuCtx.m_iCurrentIndex]
      oPieMenu.m_iCurrentIndex = 0
      oPieMenu.m_fMaxItemSqrDiameter = 0
      if not ImGui.IsMouseReleased( menuCtx.m_iMouseButton ) then
         oPieMenu.m_iHoveredItem = -1
      end
      if menuCtx.m_iCurrentIndex > 0 then
         oPieMenu.m_fMaxItemSqrDiameter = menuCtx.m_oPieMenuStack[menuCtx.m_iCurrentIndex - 1].m_fMaxItemSqrDiameter
      end
   end

   local function EndPieMenuEx(menuCtx)
      menuCtx.m_iCurrentIndex = menuCtx.m_iCurrentIndex - 1
   end

   local function BeginPiePopup(menuCtx, position)
      menuCtx.m_iMouseButton = 0

      local iCurrentFrame = ImGui.GetFrameCount()
      if menuCtx.m_iLastFrame < (iCurrentFrame - 1) or menuCtx.m_oCenterArg ~= position then
         menuCtx.m_oCenter = ImGui.GetWindowPos() + position
         menuCtx.m_oCenterArg = position
      end
      menuCtx.m_iLastFrame = iCurrentFrame
      menuCtx.m_iMaxIndex = -1
      ImGui.PushFont(ImGuiFonts.Text13)
      BeginPieMenuEx(menuCtx)
   end

   local function EndPiePopup(menuCtx)
      EndPieMenuEx(menuCtx)
      local oStyle = ImGui.GetStyle()
      local pDrawList = ImGui.GetWindowDrawList()
---@diagnostic disable-next-line: undefined-field
      pDrawList:PushClipRect(ImGui.GetWindowPos(), ImGui.GetWindowPos() + ImGui.GetWindowSize())
      local oMousePos = ImGui.GetIO().MousePos
      local oDragDelta = ImVec2(oMousePos.x - menuCtx.m_oCenter.x, oMousePos.y - menuCtx.m_oCenter.y)
      local fDragDistSqr = oDragDelta.x*oDragDelta.x + oDragDelta.y*oDragDelta.y
      local fCurrentRadius = 30
---@diagnostic disable-next-line: missing-parameter
      local oArea = {Min = ImVec2(menuCtx.m_oCenter), Max = ImVec2(menuCtx.m_oCenter)}
      local c_fDefaultRotate = -math.pi / 2
      local fLastRotate = c_fDefaultRotate
      for iIndex = 0, menuCtx.m_iMaxIndex do
         local oPieMenu = menuCtx.m_oPieMenuStack[iIndex]
         local fMenuHeight = math.sqrt(oPieMenu.m_fMaxItemSqrDiameter)
         local fMinRadius = fCurrentRadius
         local fMaxRadius = fMinRadius + (fMenuHeight * oPieMenu.m_iCurrentIndex) / 2
         menuCtx.fMaxRadius = fMaxRadius
         local item_arc_span = 2 * math.pi / math.max(3 + 3 * iIndex, oPieMenu.m_iCurrentIndex)
         local drag_angle = math.atan2(oDragDelta.y, oDragDelta.x)
         local fRotate = fLastRotate - item_arc_span * ( oPieMenu.m_iCurrentIndex - 1 ) / 2
         local item_hovered = -1
         for item_n = 0, oPieMenu.m_iCurrentIndex - 1 do
            local item_label = oPieMenu.m_oItemNames[ item_n ]
            local fMinInnerSpacing = oStyle.ItemInnerSpacing.x / ( fMinRadius * 2 )
            local fMaxInnerSpacing = oStyle.ItemInnerSpacing.x / ( fMaxRadius * 2 )
            local item_inner_ang_min = item_arc_span * ( item_n - 0.5 + fMinInnerSpacing ) + fRotate
            local item_inner_ang_max = item_arc_span * ( item_n + 0.5 - fMinInnerSpacing ) + fRotate
            local item_outer_ang_min = item_arc_span * ( item_n - 0.5 + fMaxInnerSpacing ) + fRotate
            local item_outer_ang_max = item_arc_span * ( item_n + 0.5 - fMaxInnerSpacing ) + fRotate
            local hovered = false
            if fDragDistSqr >= fMinRadius * fMinRadius and fDragDistSqr < fMaxRadius * fMaxRadius  then
               while (drag_angle - item_inner_ang_min) < 0 do
                  drag_angle = drag_angle + (2 * math.pi)
               end
               while (drag_angle - item_inner_ang_min) > 2 * math.pi do
                  drag_angle = drag_angle - (2 * math.pi)
               end
               if drag_angle >= item_inner_ang_min and drag_angle < item_inner_ang_max  then
                  hovered = true
               end
            end
            -- draw segments
            local arc_segments = math.floor(( 32 * item_arc_span / ( 2 * math.pi ) ) + 1)
            local iColor = ImGui.GetColorU32( hovered and ImGui.Col.ButtonHovered or ImGui.Col.Button )
            local fAngleStepInner = (item_inner_ang_max - item_inner_ang_min) / arc_segments
            local fAngleStepOuter = ( item_outer_ang_max - item_outer_ang_min ) / arc_segments
---@diagnostic disable-next-line: undefined-field
            pDrawList:PrimReserve(arc_segments * 6, (arc_segments + 1) * 2)
            for iSeg = 0, arc_segments do
               local fCosInner = math.cos(item_inner_ang_min + fAngleStepInner * iSeg)
               local fSinInner = math.sin(item_inner_ang_min + fAngleStepInner * iSeg)
               local fCosOuter = math.cos(item_outer_ang_min + fAngleStepOuter * iSeg)
               local fSinOuter = math.sin(item_outer_ang_min + fAngleStepOuter * iSeg)

               if iSeg < arc_segments then
                  ---@diagnostic disable-next-line: undefined-field
                  local VtxCurrentIdx = pDrawList._VtxCurrentIdx
                  ---@diagnostic disable-next-line: undefined-field
                  pDrawList:PrimWriteIdx(VtxCurrentIdx + 0)
                  ---@diagnostic disable-next-line: undefined-field
                  pDrawList:PrimWriteIdx(VtxCurrentIdx + 2)
                  ---@diagnostic disable-next-line: undefined-field
                  pDrawList:PrimWriteIdx(VtxCurrentIdx + 1)
                  ---@diagnostic disable-next-line: undefined-field
                  pDrawList:PrimWriteIdx(VtxCurrentIdx + 3)
                  ---@diagnostic disable-next-line: undefined-field
                  pDrawList:PrimWriteIdx(VtxCurrentIdx + 2)
                  ---@diagnostic disable-next-line: undefined-field
                  pDrawList:PrimWriteIdx(VtxCurrentIdx + 1)
               end
               local pos = ImVec2(menuCtx.m_oCenter.x + fCosInner * (fMinRadius + oStyle.ItemInnerSpacing.x), menuCtx.m_oCenter.y + fSinInner * (fMinRadius + oStyle.ItemInnerSpacing.x))
               local pos2 = ImVec2(menuCtx.m_oCenter.x + fCosOuter * (fMaxRadius - oStyle.ItemInnerSpacing.x), menuCtx.m_oCenter.y + fSinOuter * (fMaxRadius - oStyle.ItemInnerSpacing.x))
               ---@diagnostic disable-next-line: undefined-field
               pDrawList:PrimWriteVtx(pos, ImVec2(0, 0), iColor)
               ---@diagnostic disable-next-line: undefined-field
               pDrawList:PrimWriteVtx(pos2, ImVec2(0, 0), iColor)
            end

            local fRadCenter = ( item_arc_span * item_n ) + fRotate
            local oOuterCenter = ImVec2( menuCtx.m_oCenter.x + math.cos( fRadCenter ) * fMaxRadius, menuCtx.m_oCenter.y + math.sin( fRadCenter ) * fMaxRadius )
            ImRectAdd(oArea, oOuterCenter)
            if oPieMenu.m_oItemIsSubMenu[item_n] then
---@diagnostic disable-next-line: missing-parameter
               local oTrianglePos = {ImVec2(), ImVec2(), ImVec2()}
               local fRadLeft = fRadCenter - 5 / fMaxRadius
               local fRadRight = fRadCenter + 5 / fMaxRadius
               oTrianglePos[ 0+1 ].x = menuCtx.m_oCenter.x + math.cos( fRadCenter ) * ( fMaxRadius - 5 )
               oTrianglePos[ 0+1 ].y = menuCtx.m_oCenter.y + math.sin( fRadCenter ) * ( fMaxRadius - 5 )
               oTrianglePos[ 1+1 ].x = menuCtx.m_oCenter.x + math.cos( fRadLeft ) * ( fMaxRadius - 10 )
               oTrianglePos[ 1+1 ].y = menuCtx.m_oCenter.y + math.sin( fRadLeft ) * ( fMaxRadius - 10 )
               oTrianglePos[ 2+1 ].x = menuCtx.m_oCenter.x + math.cos( fRadRight ) * ( fMaxRadius - 10 )
               oTrianglePos[ 2+1 ].y = menuCtx.m_oCenter.y + math.sin( fRadRight ) * ( fMaxRadius - 10 )
               pDrawList:AddTriangleFilled(oTrianglePos[1], oTrianglePos[2], oTrianglePos[3], 0xFFFFFFFF)
            end
            ---@diagnostic disable-next-line: missing-parameter
            local text_size = ImVec2(oPieMenu.m_oItemSizes[item_n])
            local text_pos = ImVec2(
               menuCtx.m_oCenter.x + math.cos((item_inner_ang_min + item_inner_ang_max) * 0.5) * (fMinRadius + fMaxRadius) * 0.5 - text_size.x * 0.5,
               menuCtx.m_oCenter.y + math.sin((item_inner_ang_min + item_inner_ang_max) * 0.5) * (fMinRadius + fMaxRadius) * 0.5 - text_size.y * 0.5)
            pDrawList:AddText(text_pos, ImGui.GetColorU32(ImGui.Col.Text), item_label)
            if hovered then
               item_hovered = item_n
            end
         end
         fCurrentRadius = fMaxRadius
         oPieMenu.m_iHoveredItem = item_hovered
         if fDragDistSqr >= fMaxRadius * fMaxRadius then
            item_hovered = oPieMenu.m_iLastHoveredItem
         end
         oPieMenu.m_iLastHoveredItem = item_hovered
         fLastRotate = item_arc_span * oPieMenu.m_iLastHoveredItem + fRotate
         if item_hovered == -1 or not oPieMenu.m_oItemIsSubMenu[item_hovered] then
            break
         end
      end
      ---@diagnostic disable-next-line: undefined-field
      pDrawList:PopClipRect()
      if oArea.Min.x < 0  then
         menuCtx.m_oCenter.x = ( menuCtx.m_oCenter.x - oArea.Min.x )
      end
      if oArea.Min.y < 0  then
         menuCtx.m_oCenter.y = ( menuCtx.m_oCenter.y - oArea.Min.y )
      end
      local oDisplaySize = ImGui.GetIO().DisplaySize
      if oArea.Max.x > oDisplaySize.x  then
         menuCtx.m_oCenter.x = ( menuCtx.m_oCenter.x - oArea.Max.x ) + oDisplaySize.x
      end
      if oArea.Max.y > oDisplaySize.y  then
         menuCtx.m_oCenter.y = ( menuCtx.m_oCenter.y - oArea.Max.y ) + oDisplaySize.y
      end

      ImGui.PopFont()
   end

   local function BeginPieMenu(menuCtx, pName)
      local oPieMenu = menuCtx.m_oPieMenuStack[menuCtx.m_iCurrentIndex]
      local oTextSize = ImGui.CalcTextSize(pName, nil, true)
      oPieMenu.m_oItemSizes[oPieMenu.m_iCurrentIndex] = oTextSize
      local fSqrDiameter = oTextSize.x * oTextSize.x + oTextSize.y * oTextSize.y
      fSqrDiameter = fSqrDiameter * 0.4
      if fSqrDiameter > oPieMenu.m_fMaxItemSqrDiameter then
         oPieMenu.m_fMaxItemSqrDiameter = math.min(fSqrDiameter, 3000)
      end
      oPieMenu.m_oItemIsSubMenu[oPieMenu.m_iCurrentIndex] = true
      oPieMenu.m_oItemNames[oPieMenu.m_iCurrentIndex] = pName
      if oPieMenu.m_iLastHoveredItem == oPieMenu.m_iCurrentIndex then
         oPieMenu.m_iCurrentIndex = oPieMenu.m_iCurrentIndex + 1
         BeginPieMenuEx(menuCtx)
         return true
      end
      oPieMenu.m_iCurrentIndex = oPieMenu.m_iCurrentIndex + 1
      return false
   end

   local function EndPieMenu(menuCtx)
      menuCtx.m_iCurrentIndex = menuCtx.m_iCurrentIndex - 1
   end

   local function PieMenuItem(menuCtx, pName)
      local oPieMenu = menuCtx.m_oPieMenuStack[menuCtx.m_iCurrentIndex]
      local oTextSize = ImGui.CalcTextSize(pName, nil, true)
      oPieMenu.m_oItemSizes[oPieMenu.m_iCurrentIndex] = oTextSize
      local fSqrDiameter = oTextSize.x * oTextSize.x + oTextSize.y * oTextSize.y
      fSqrDiameter = fSqrDiameter * 0.4
      if fSqrDiameter > oPieMenu.m_fMaxItemSqrDiameter then
         oPieMenu.m_fMaxItemSqrDiameter = math.min(fSqrDiameter, 3000)
      end
      oPieMenu.m_oItemIsSubMenu[oPieMenu.m_iCurrentIndex] = false
      oPieMenu.m_oItemNames[oPieMenu.m_iCurrentIndex] = pName
      local bActive = oPieMenu.m_iCurrentIndex == oPieMenu.m_iHoveredItem
      oPieMenu.m_iCurrentIndex = oPieMenu.m_iCurrentIndex + 1
      return bActive
   end

   function ImGui.NewPieContext()
      local pie_context = NewPieMenuContext()

      return {
         ctx = pie_context,
         Begin = function(position)
            return BeginPiePopup(pie_context, position)
         end,
         End = function()
            return EndPiePopup(pie_context)
         end,
         Item = function(name)
            return PieMenuItem(pie_context, name)
         end,
         BeginFolder = function(name)
            return BeginPieMenu(pie_context, name)
         end,
         EndFolder = function()
            return EndPieMenu(pie_context)
         end
      }
   end

   ImGui.Pie = ImGui.NewPieContext()
end
 

Rice.

Известный
Модератор
1,753
1,662

Lua:
module.Spinner = function(label, radius, thickness, color)
    local style = imgui.GetStyle()
    local pos = imgui.GetCursorScreenPos()
    local size = imgui.ImVec2(radius * 2, (radius + style.FramePadding.y) * 2)
    
    imgui.Dummy(imgui.ImVec2(size.x + style.ItemSpacing.x, size.y))

    local DrawList = imgui.GetWindowDrawList()
    DrawList:PathClear()
    
    local num_segments = 30
    local start = math.abs(math.sin(imgui.GetTime() * 1.8) * (num_segments - 5))
    
    local a_min = 3.14 * 2.0 * start / num_segments
    local a_max = 3.14 * 2.0 * (num_segments - 3) / num_segments

    local centre = imgui.ImVec2(pos.x + radius, pos.y + radius + style.FramePadding.y)
    
    for i = 0, num_segments do
        local a = a_min + (i / num_segments) * (a_max - a_min)
        DrawList:PathLineTo(imgui.ImVec2(centre.x + math.cos(a + imgui.GetTime() * 8) * radius, centre.y + math.sin(a + imgui.GetTime() * 8) * radius))
    end

    DrawList:PathStroke(color, false, thickness)
    return true
end
 
  • Нравится
Реакции: chapo

dmitry.karle

Активный
353
93
Lua:
function imgui.Spinner(label, radius, thickness, color, timeModifier)
    if timeModifier == nil then timeModifier = 0 end
    local style = imgui.GetStyle()
    local pos = imgui.GetCursorScreenPos()
    local size = imgui.ImVec2(radius * 2, (radius + style.FramePadding.y) * 2)
    
    imgui.Dummy(imgui.ImVec2(size.x + style.ItemSpacing.x, size.y))

    local DrawList = imgui.GetWindowDrawList()
    DrawList:PathClear()
    
    local num_segments = 30
    local start = math.abs(math.sin(imgui.GetTime() * 1.8) * (num_segments - 5))
    
    local a_min = 3.14 * 2.0 * start / num_segments
    local a_max = 3.14 * 2.0 * (num_segments - 3) / num_segments

    local centre = imgui.ImVec2(pos.x + radius, pos.y + radius + style.FramePadding.y)
    
    for i = 0, num_segments do
        local a = a_min + (i / num_segments) * (a_max - a_min)
        DrawList:PathLineTo(imgui.ImVec2(centre.x + math.cos(a + (imgui.GetTime() - timeModifier) * 8) * radius, centre.y + math.sin(a + imgui.GetTime() * 8) * radius))
    end

    DrawList:PathStroke(color, false, thickness)
    return true
end
 

.KOHTOP.

Активный
Автор темы
226
35
Lua:
function imgui.Spinner(label, radius, thickness, color, timeModifier)
    if timeModifier == nil then timeModifier = 0 end
    local style = imgui.GetStyle()
    local pos = imgui.GetCursorScreenPos()
    local size = imgui.ImVec2(radius * 2, (radius + style.FramePadding.y) * 2)
   
    imgui.Dummy(imgui.ImVec2(size.x + style.ItemSpacing.x, size.y))

    local DrawList = imgui.GetWindowDrawList()
    DrawList:PathClear()
   
    local num_segments = 30
    local start = math.abs(math.sin(imgui.GetTime() * 1.8) * (num_segments - 5))
   
    local a_min = 3.14 * 2.0 * start / num_segments
    local a_max = 3.14 * 2.0 * (num_segments - 3) / num_segments

    local centre = imgui.ImVec2(pos.x + radius, pos.y + radius + style.FramePadding.y)
   
    for i = 0, num_segments do
        local a = a_min + (i / num_segments) * (a_max - a_min)
        DrawList:PathLineTo(imgui.ImVec2(centre.x + math.cos(a + (imgui.GetTime() - timeModifier) * 8) * radius, centre.y + math.sin(a + imgui.GetTime() * 8) * radius))
    end

    DrawList:PathStroke(color, false, thickness)
    return true
end
ничуть не спиздил у человека выше

Lua:
function imgui.Spinner(label, radius, thickness, color, timeModifier)
    if timeModifier == nil then timeModifier = 0 end
    local style = imgui.GetStyle()
    local pos = imgui.GetCursorScreenPos()
    local size = imgui.ImVec2(radius * 2, (radius + style.FramePadding.y) * 2)
   
    imgui.Dummy(imgui.ImVec2(size.x + style.ItemSpacing.x, size.y))

    local DrawList = imgui.GetWindowDrawList()
    DrawList:PathClear()
   
    local num_segments = 30
    local start = math.abs(math.sin(imgui.GetTime() * 1.8) * (num_segments - 5))
   
    local a_min = 3.14 * 2.0 * start / num_segments
    local a_max = 3.14 * 2.0 * (num_segments - 3) / num_segments

    local centre = imgui.ImVec2(pos.x + radius, pos.y + radius + style.FramePadding.y)
   
    for i = 0, num_segments do
        local a = a_min + (i / num_segments) * (a_max - a_min)
        DrawList:PathLineTo(imgui.ImVec2(centre.x + math.cos(a + (imgui.GetTime() - timeModifier) * 8) * radius, centre.y + math.sin(a + imgui.GetTime() * 8) * radius))
    end

    DrawList:PathStroke(color, false, thickness)
    return true
end
Код:
[13:44:21.875253] (error)    key_sync.lua: ... ARIZONA ARCANE - RP\bin\arizona\moonloader\key_sync.lua:828: bad argument #1 to 'PathStroke' (cannot convert 'nil' to 'unsigned int')
stack traceback:
    [C]: in function 'PathStroke'
    ... ARIZONA ARCANE - RP\bin\arizona\moonloader\key_sync.lua:828: in function 'Spinner'
    ... ARIZONA ARCANE - RP\bin\arizona\moonloader\key_sync.lua:487: in function '_draw'
    ...A ARCANE - RP\bin\arizona\moonloader\lib\mimgui\init.lua:107: in function <...A ARCANE - RP\bin\arizona\moonloader\lib\mimgui\init.lua:91>
[13:44:21.876248] (error)    key_sync.lua: Script died due to an error. (8AADE4DC)

Что с function, что с module, нихуя не работает
 
Последнее редактирование:
  • Эм
Реакции: dmitry.karle

chromiusj

fullstack eblan
Модератор
5,758
4,061
ничуть не спиздил у человека выше


Код:
[13:44:21.875253] (error)    key_sync.lua: ... ARIZONA ARCANE - RP\bin\arizona\moonloader\key_sync.lua:828: bad argument #1 to 'PathStroke' (cannot convert 'nil' to 'unsigned int')
stack traceback:
    [C]: in function 'PathStroke'
    ... ARIZONA ARCANE - RP\bin\arizona\moonloader\key_sync.lua:828: in function 'Spinner'
    ... ARIZONA ARCANE - RP\bin\arizona\moonloader\key_sync.lua:487: in function '_draw'
    ...A ARCANE - RP\bin\arizona\moonloader\lib\mimgui\init.lua:107: in function <...A ARCANE - RP\bin\arizona\moonloader\lib\mimgui\init.lua:91>
[13:44:21.876248] (error)    key_sync.lua: Script died due to an error. (8AADE4DC)

Что с function, что с module, нихуя не работает
Ну так покажи как ты сделал спиннер
 

.KOHTOP.

Активный
Автор темы
226
35
Ну так покажи как ты сделал спиннер
Lua:
local imgui = require 'mimgui' -- подключаем библиотеку мимгуи
imgui.Spinner = require('imgui_addons').Spinner

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, 280), imgui.Cond.Always) -- отвечает за размер окна
        imgui.Begin(u8'Основное', WinState, imgui.WindowFlags.NoResize) -- отвечает за отображение окна, его заголовок и флаги
        imgui.Spinner("##spinner", 10, 3)
        imgui.End()
    end
)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end) -- команда по которой будет вызываться наше окно
    wait(-1)
end

function imgui.Spinner(label, radius, thickness, color, timeModifier)
    if timeModifier == nil then timeModifier = 0 end
    local style = imgui.GetStyle()
    local pos = imgui.GetCursorScreenPos()
    local size = imgui.ImVec2(radius * 2, (radius + style.FramePadding.y) * 2)
    
    imgui.Dummy(imgui.ImVec2(size.x + style.ItemSpacing.x, size.y))

    local DrawList = imgui.GetWindowDrawList()
    DrawList:PathClear()
    
    local num_segments = 30
    local start = math.abs(math.sin(imgui.GetTime() * 1.8) * (num_segments - 5))
    
    local a_min = 3.14 * 2.0 * start / num_segments
    local a_max = 3.14 * 2.0 * (num_segments - 3) / num_segments

    local centre = imgui.ImVec2(pos.x + radius, pos.y + radius + style.FramePadding.y)
    
    for i = 0, num_segments do
        local a = a_min + (i / num_segments) * (a_max - a_min)
        DrawList:PathLineTo(imgui.ImVec2(centre.x + math.cos(a + (imgui.GetTime() - timeModifier) * 8) * radius, centre.y + math.sin(a + imgui.GetTime() * 8) * radius))
    end

    DrawList:PathStroke(color, false, thickness)
    return true
end
 

chromiusj

fullstack eblan
Модератор
5,758
4,061
Lua:
local imgui = require 'mimgui' -- подключаем библиотеку мимгуи
imgui.Spinner = require('imgui_addons').Spinner

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, 280), imgui.Cond.Always) -- отвечает за размер окна
        imgui.Begin(u8'Основное', WinState, imgui.WindowFlags.NoResize) -- отвечает за отображение окна, его заголовок и флаги
        imgui.Spinner("##spinner", 10, 3)
        imgui.End()
    end
)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end) -- команда по которой будет вызываться наше окно
    wait(-1)
end

function imgui.Spinner(label, radius, thickness, color, timeModifier)
    if timeModifier == nil then timeModifier = 0 end
    local style = imgui.GetStyle()
    local pos = imgui.GetCursorScreenPos()
    local size = imgui.ImVec2(radius * 2, (radius + style.FramePadding.y) * 2)
  
    imgui.Dummy(imgui.ImVec2(size.x + style.ItemSpacing.x, size.y))

    local DrawList = imgui.GetWindowDrawList()
    DrawList:PathClear()
  
    local num_segments = 30
    local start = math.abs(math.sin(imgui.GetTime() * 1.8) * (num_segments - 5))
  
    local a_min = 3.14 * 2.0 * start / num_segments
    local a_max = 3.14 * 2.0 * (num_segments - 3) / num_segments

    local centre = imgui.ImVec2(pos.x + radius, pos.y + radius + style.FramePadding.y)
  
    for i = 0, num_segments do
        local a = a_min + (i / num_segments) * (a_max - a_min)
        DrawList:PathLineTo(imgui.ImVec2(centre.x + math.cos(a + (imgui.GetTime() - timeModifier) * 8) * radius, centre.y + math.sin(a + imgui.GetTime() * 8) * radius))
    end

    DrawList:PathStroke(color, false, thickness)
    return true
end
Возможно проблема в том,что спиннер для имгуи(да и в целом имгуи аддонс для имгуи и создан),а у тебя мимгуи /=

Короче,смотришь эту тему и переделывает под мимгуи
Возможно проблема в том,что спиннер для имгуи(да и в целом имгуи аддонс для имгуи и создан),а у тебя мимгуи /=
Я сначала думал,что в мимгуи нет таких функций для дравлиста,но они есть
1000014719.jpg
 
Последнее редактирование:

XRLM

Против ветра рождённый
Модератор
1,583
1,200
Lua:
local imgui = require 'mimgui' -- подключаем библиотеку мимгуи
imgui.Spinner = require('imgui_addons').Spinner

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, 280), imgui.Cond.Always) -- отвечает за размер окна
        imgui.Begin(u8'Основное', WinState, imgui.WindowFlags.NoResize) -- отвечает за отображение окна, его заголовок и флаги
        imgui.Spinner("##spinner", 10, 3)
        imgui.End()
    end
)

function main()
    sampRegisterChatCommand('cmd', function() WinState[0] = not WinState[0] end) -- команда по которой будет вызываться наше окно
    wait(-1)
end

function imgui.Spinner(label, radius, thickness, color, timeModifier)
    if timeModifier == nil then timeModifier = 0 end
    local style = imgui.GetStyle()
    local pos = imgui.GetCursorScreenPos()
    local size = imgui.ImVec2(radius * 2, (radius + style.FramePadding.y) * 2)
   
    imgui.Dummy(imgui.ImVec2(size.x + style.ItemSpacing.x, size.y))

    local DrawList = imgui.GetWindowDrawList()
    DrawList:PathClear()
   
    local num_segments = 30
    local start = math.abs(math.sin(imgui.GetTime() * 1.8) * (num_segments - 5))
   
    local a_min = 3.14 * 2.0 * start / num_segments
    local a_max = 3.14 * 2.0 * (num_segments - 3) / num_segments

    local centre = imgui.ImVec2(pos.x + radius, pos.y + radius + style.FramePadding.y)
   
    for i = 0, num_segments do
        local a = a_min + (i / num_segments) * (a_max - a_min)
        DrawList:PathLineTo(imgui.ImVec2(centre.x + math.cos(a + (imgui.GetTime() - timeModifier) * 8) * radius, centre.y + math.sin(a + imgui.GetTime() * 8) * radius))
    end

    DrawList:PathStroke(color, false, thickness)
    return true
end
ты цвет не передал в аргументы функции спиннера, в этом и ошибка
чо перевести нельзя?
1693286142391.png
 
  • Грустно
  • Клоун
Реакции: Air_Official и chromiusj