Physgun Wiki

Интерфейс и отрисовка

Весь интерфейс — только клиентские файлы. Инструменты уже есть, свои изобретать не нужно.

Шрифты

surface.CreateFont в проекте вызывается ровно в одном месте — vgui/cl_skin.lua, на загрузке. В остальном коде берут готовое:

roleplay.Kit.Fonts.Label -- Onest 18, обычный текст roleplay.Kit.Fonts.Button -- Montserrat 17 bold, кнопки roleplay.Kit.Fonts.Title -- Onest 16 bold, заголовки

Нужен новый размер или начертание — добавьте запись в roleplay.Kit.FontConfig, а не вызывайте surface.CreateFont по месту.

Создание шрифта из Paint или HUDPaint перезагружает его каждый кадр и заметно роняет FPS. То же с Material — см. Производительность.

Отрисовка через RNDX

Скруглённые прямоугольники, круги, тени и размытие рисует библиотека RNDX — не draw.RoundedBox:

RNDX.Rect(0, 0, w, h):Rad(8):Color(30, 30, 30, 250):Draw() RNDX.Circle(16, 16, 8):Color(28, 91, 232):Outline(8):Angles(0, 240):Draw()

Цепочка всегда заканчивается :Draw(). Полезное: :Radii(tl, tr, bl, br), :Outline(толщина), :Shadow(размытие, разброс, ox, oy), :Material(mat), :Blur(сила). :Angles(от, до) рисует дугу — удобно для круговых таймеров.

:Color() принимает и четыре числа, и готовый объект Color.

Функции вида RNDX.Draw, RNDX.DrawShadows помечены устаревшими — в новом коде их не используют.

Панели и скин

Скин OpenRP определён поверх стандартного и рисует кнопки девятипатчем из общего атласа.

local button = vgui.Create('DButton', parent) button:SetSkin('OpenRP') button:SetFont(roleplay.Kit.Fonts.Button) button:SetTextColor(color_white) button:SetTall(roleplay.Kit.ButtonHeight) button.DoClick = function() ... end

Скин ставится кнопке явно: он не наследуется от родителя, созданного раньше.

Раскладка — докингом (Dock, DockMargin, DockPadding). Абсолютные координаты нужны только корневой панели относительно ScrW() и ScrH().

Панель создаётся один раз

Строит панель отдельная функция, обновляет — другая. Пересоздавать панель на каждое изменение данных не надо:

if (!IsValid(roleplay.Vote.panel)) then roleplay.Vote.panel = build() end

Дорогие расчёты — перенос текста, замеры surface.GetTextSize — считаются в момент обновления данных и складываются в поля панели, а не выполняются в Paint.

HUD

Лишние элементы стандартного HUD глушатся списком roleplay.HUD.Hidden: хук GM:HUDShouldDraw в cl_init.lua делает по нему обычный лукап. Чтобы спрятать ещё один элемент, достаточно добавить его имя в таблицу.

Курсор включается через gui.EnableScreenClicker, и только по изменению состояния, а не каждый кадр:

if (show != cursorShown) then cursorShown = show gui.EnableScreenClicker(show) end

Тексты

Подписи берутся через roleplay.L('Ключ'), ключи живут в lang.lua. Русских строк прямо в панели быть не должно.