Вопрос Drag lib primordial

Searching for myself
Пользователь
Статус
Оффлайн
Регистрация
29 Сен 2021
Сообщения
212
Реакции[?]
69
Поинты[?]
11K
Не работает drag в либе primordial
code_language.lua:
local DragSystem = {}
local vecScreenSize = render.get_screen_size( )

DragSystem.pList = {}
DragSystem.pWindows = {}

DragSystem.__index = DragSystem

function DragSystem:Setup( vecPosition, vecSize, strName, SelfFn )
    local m_pData = {
        vecPosition = vecPosition,
        vecSize = vecSize,

        bIsDragging = false,
        vecDragPosition = vec2_t( 0.0, 0.0 ),

        strName = strName,
        SelfFn = SelfFn,

        m_pCallbacks = {
            x = vecPosition.x,
            y = vecPosition.y
        }
    }

    table.insert( DragSystem.pWindows, m_pData )

    return setmetatable( m_pData, DragSystem )
end

function DragSystem:LimitPositions( )
    if self.vecPosition.x <= 0.0 then
        self.vecPosition.x = 0.0
    end

    if self.vecPosition.x + self.vecSize.x >= vecScreenSize.x - 1.0 then
        self.vecPosition.x = vecScreenSize.x - self.vecSize.x - 1.0
    end

    if self.vecPosition.y <= 0.0 then
        self.vecPosition.y = 0.0
    end

    if self.vecPosition.y + self.vecSize.y >= vecScreenSize.y - 1.0 then
        self.vecPosition.y = vecScreenSize.y - self.vecSize.y - 1.0
    end
end

function DragSystem:Update( ... )
    if menu.is_open( ) then
        local vecMousePosition = input.get_mouse_pos( )
        local bIsInArea = input.is_mouse_in_bounds( self.vecPosition, self.vecPosition + self.vecSize )

        local pList = self.pList
        local bIsKeyActive = input.is_key_held( e_keys.MOUSE_LEFT )
       
        if ( bIsKeyActive and not self.bIsDragging ) and bIsInArea and pList.strTarget == self.strName then
            self.bIsDragging = true
            self.vecDragPosition = vecMousePosition - self.vecPosition
            self.vecPosition = vecMousePosition - self.vecDragPosition

            self:LimitPositions( )

            self.m_pCallbacks.x:set( math.floor( self.vecPosition.x ) )
            self.m_pCallbacks.y:set( math.floor( self.vecPosition.y ) )
        elseif not bIsKeyActive then
            pList.strTarget = ''
            self.bIsDragging = false
            self.vecDragPosition = vec2_t( 0.0, 0.0 )
        end
    end

    self.SelfFn( self, ... )
end

return DragSystem
code_language.lua:
-- ObjectSize - гетаю со слайдера
local Object = Script.m_pDragSystem:Setup( ObjectSize, vec2_t( 200, 200 ), 'Test', function( self )
    render.rect_filled( self.vecPosition, self.vecPosition + self.vecSize, color_t( 255, 255, 255, 255 ) )
end ):Update( )
 
Femboy Access
Эксперт
Статус
Оффлайн
Регистрация
11 Ноя 2020
Сообщения
1,335
Реакции[?]
428
Поинты[?]
96K
Код:
local x_menu = menu.add_slider("group", "x", 0, render.get_screen_size().x)
local y_menu = menu.add_slider("group", "y", 0, render.get_screen_size().y)

-- если че на каждый элемент который надо драгать надо свою такую таблицу
local item = { 0, 0, 0 }

local function drag_window(x, y, width, height, xmenu, ymenu, item)
    local cursor = input.get_mouse_pos()
    if (cursor.x >= x) and (cursor.x <= x + width) and (cursor.y >= y) and (cursor.y <= y + height) then
        if input.is_key_pressed(1) and item[1] == 0 then
            item[1] = 1
            item[2] = x - cursor.x
            item[3] = y - cursor.y
        end
    end
    if not input.is_key_pressed(1) then item[1] = 0 end
    if item[1] == 1 and menu.is_open() then
        xmenu:set(cursor.x + item[2])
        ymenu:set(cursor.y + item[3])
    end
end

callbacks.add(e_callbacks.PAINT, function()
    local x, y = x_menu:get(), y_menu:get()
    -- draw something using x, y
    -- width & height (ака 20, 20) это тип высота и длина того че надо драгать
    drag_window(x, y, 20, 20, x_menu, y_menu, item)
end)
 
Сверху Снизу