Гайд [GLua] Как правильно писать клиентские меню?

  • 49
  • 1
  • 5
В этом гайде я покажу свой код, в котором все подписано, делаю ибо заебался заходить в клиентские части серверов и видеть там немного говнокода
Само меню не смогу показать, ибо сейчас нет рядом компа

Код меню:
local cols = {Color(0,0,0,150), Color(255,255,255)} -- кеширование цветов, ниже второй вариант, использовать cols[1] cols[2] .....
local col = { -- 1-й вариант использовать лучше, но пока забьм хуй на оптимизацию, использовать col.crasniy
    crasniy = Color(255,0,0),
    blackcol = Color(0,0,0)
}
-- сука, не делайте пожалуйста for i = 1, 128 do surface.CreateFont, нагрузка пиздец
surface.CreateFont('btnfont', {
    font = 'Roboto', -- ваш шрифт
    size = 20, -- размер,
    weight = 500, -- толщина
    extended = true -- поддержка киррилицы :okay?:
})

local function tmenu() -- локальные функции работают чуть быстрее
    local fr = vgui.Create('EditablePanel')
    fr:SetSize(ScrW() * .5, ScrH() * .5)
    fr:Center()
    fr:MakePopup()
    -- В EditablePanel нету методов: setdraggable, showclosebutton, settitle, проще говоря - чистый dframe
    fr.Paint = function(s,w,h) -- self, wight, height
        draw.RoundedBox(5,0,0,w,h,cols[1]) -- закругленный бокс
    end
    local btn = vgui.Create('DButton', fr)
    btn:Dock(BOTTOM) -- кнопка будет внизу, значения: Top, Bottom, Right, Left
    btn:SetTall(35) -- сетаем высоту, setsize не будет работать с dock'ом
    btn:SetText('Первая кнопка')
    btn:SetColor(cols[2])
    btn:SetFont('btnfont')
    btn.DoClick = function() -- действие при нажатии на кнопку
        chat.AddText(Color(175,0,0), 'ты нажал на кнопку!')
    end
    btn.Paint = function(s,w,h)
        draw.RoundedBox(5,0,0,w,h,cols[1]) -- закругленный бокс
    end
    local cls = vgui.Create('DButton', fr)
    cls:SetSize(32,32) -- значение должно быть одинаковое т.е если тут 48, 48, то в сет сайз тоже должно быть 48
    cls:SetPos(fr:GetWide() - 32,0) -- получаем ширину от нашего фрейма
    cls:SetText('X')
    cls:SetColor(cols[2])
    cls:SetFont('btnfont')
    cls.DoClick = function() -- действие при нажатии на кнопку
        fr:SetVisible(false) -- закрываем наш фрейм
    end
    cls.Paint = function(s,w,h)
        draw.RoundedBox(5,0,0,w,h,cols[1]) -- закругленный бокс
    end
end

--Осталась хуйня, кон комманд
concommand.Add('openmymenu', tmenu) -- вызываем наше меню
 
  • 201
  • 16
  • 68
Нет смысла убирать меню с помощью SetVisible, чтобы потом через консольную команду создавать сзаного меню (помня, что предыдущие ты только скрыл, оно не удалено). Заменил бы тогда на Remove
 
  • 49
  • 1
  • 5
Нет смысла убирать меню с помощью SetVisible, чтобы потом через консольную команду создавать сзаного меню (помня, что предыдущие ты только скрыл, оно не удалено). Заменил бы тогда на Remove
Писал на ноуте, поэтому использовал что мог, но спасибо что напомнил
 
  • 9
  • 1
Контакты для связи отсутствуют.
может я тупой, но у меня пишет вот это

[ERROR] lua/print.lua:7: attempt to index global 'surface' (a nil value)
1. unknown - lua/print.lua:7
 
  • 201
  • 16
  • 68
может я тупой, но у меня пишет вот это

[ERROR] lua/print.lua:7: attempt to index global 'surface' (a nil value)
1. unknown - lua/print.lua:7
Скрипт работает и на серверной части, из-за чего выдаёт ошибку. На сервере нет surface
Решение для тебя: перемести в lua/client/ свой скрипт
 
Сверху Снизу